4 điểm bởi GN⁺ 2024-06-30 | 1 bình luận | Chia sẻ qua WhatsApp
  • ImHex là trình chỉnh sửa hex dành cho kỹ sư reverse engineering, lập trình viên và những người làm việc khuya, gom các chức năng phân tích, chỉnh sửa và trực quan hóa nội dung file vào một công cụ
  • Tính năng cốt lõi là hỗ trợ định nghĩa cấu trúc và kiểu dữ liệu bằng ngôn ngữ pattern giống C để parse và highlight nội dung file, đồng thời hỗ trợ tự động tải dựa trên MIME type và giá trị magic
  • Có thể mở nhiều nguồn dữ liệu như file cục bộ, raw disk, GDB Server, gói UDP, bộ nhớ process, file từ xa qua SSH/SFTP; đồng thời tích hợp disassembler dựa trên Capstone và quét YARA rule
  • Điều kiện sử dụng mặc định là cần GPU hỗ trợ OpenGL 3.0 trở lên; bản phát hành render bằng phần mềm -NoGPU có thể dùng không cần GPU nhưng có thể chậm hơn nhiều so với bản tăng tốc bằng GPU
  • Plugin được phát triển thông qua libimhex, ImHex API và Content Registry; phần lớn là GPLv2-only, nhưng /lib/libimhex/plugins/ui được cung cấp theo LGPLv2.1, cho phép phát triển plugin proprietary

Vai trò cơ bản mà ImHex cung cấp

Hex view và chỉnh sửa dữ liệu

  • Hex view hỗ trợ byte patching, quản lý patch và undo/redo không giới hạn
  • Có thể sao chép byte dưới nhiều định dạng
    • bytes
    • hex string
    • mảng C, C++, C#, Rust, Python, Java, JavaScript
    • ASCII-Art hex view
    • HTML self-contained div
  • Chức năng tìm kiếm và di chuyển bao gồm tìm kiếm string/hex đơn giản, goto theo điểm bắt đầu, điểm kết thúc hoặc vị trí con trỏ hiện tại
  • Highlight hỗ trợ thiết lập quy tắc foreground và highlight nền dựa trên pattern, kết quả tìm kiếm, bookmark
  • Hiển thị dữ liệu hỗ trợ nhiều kiểu
    • số nguyên hexadecimal 8/16/32/64-bit
    • số nguyên thập phân signed/unsigned 8/16/32/64-bit
    • float 16/32/64-bit
    • màu RGBA8, HexII, binary
  • Encoding xử lý ASCII và encoding do người dùng định nghĩa, đồng thời mặc định hỗ trợ UTF-8, UTF-16, ShiftJIS và hầu hết các encoding Windows
  • Cung cấp paged data view

Pattern Language và diễn giải cấu trúc dữ liệu

  • Pattern Language là ngôn ngữ lập trình hoàn chỉnh, có thể tùy biến hoàn toàn, được phát triển cho ImHex
  • Với cú pháp giống C, có thể định nghĩa cấu trúc và kiểu dữ liệu, rồi dùng chúng để parse và highlight nội dung file
  • Pattern Language hỗ trợ tự động tải dựa trên MIME type và giá trị magic
  • Các yếu tố được hỗ trợ gồm arrays, pointers, structs, unions, enums, bitfields, namespaces, little/big endian, conditionals, v.v.
  • Cung cấp thông báo lỗi, syntax highlighting và error marking
  • Đối tượng trực quan hóa dữ liệu gồm images, audio, 3D models, coordinates, time stamps, v.v.
  • Tài liệu liên quan:

Kiểm tra dữ liệu, tiền xử lý và tìm kiếm

  • Data Inspector diễn giải dữ liệu thành nhiều kiểu, bao gồm endianness, decimal, hexadecimal, octal và bit inversion
    • unsigned/signed integer: 8/16/24/32/48/64-bit
    • float: 16/32/64-bit
    • signed/unsigned LEB128
    • ASCII, Wide, ký tự và chuỗi UTF-8
    • time32_t, time64_t, DOS date/time
    • GUID, màu RGBA8, RGB65
  • Có thể sao chép và chỉnh sửa byte thông qua inspector, đồng thời thêm kiểu dữ liệu mới bằng Pattern Language
  • node-based data pre-processor có thể sửa đổi, giải mã hoặc decode dữ liệu trước khi hiển thị trong trình chỉnh sửa hex
    • Có thể sửa đổi dữ liệu mà không chạm đến underlying source
    • Hỗ trợ thêm custom node
  • Tìm kiếm dữ liệu có thể thực hiện trên toàn bộ file hoặc vùng chọn
    • Trích xuất chuỗi cung cấp các tùy chọn độ dài tối thiểu, tập ký tự và encoding
    • sequence search tìm byte hoặc character sequence và cung cấp tùy chọn bỏ qua hoa thường
    • Hỗ trợ regex search, binary pattern wildcard search, numeric value/range search
    • numeric search gồm các tùy chọn size, endianness và bỏ qua unaligned value

Nguồn dữ liệu và tính năng phân tích

  • ImHex có thể tải dữ liệu từ nhiều nguồn dữ liệu
    • file cục bộ: hỗ trợ tải file lớn nhanh và hiệu quả
    • raw disks: tải raw disk và partition
    • GDB Server: truy cập RAM của process đang chạy hoặc embedded device
    • Intel Hex, Motorola SREC
    • Base64 encoded data
    • UDP packets
    • process memory: kiểm tra toàn bộ address space của process đang chạy
    • file từ xa qua SSH/SFTP
  • Phân tích và trực quan hóa dữ liệu bao gồm file parser dựa trên file magic và MIME type database
  • Đồ thị và thống kê cung cấp byte type distribution, entropy graph, highest/average entropy, digram, layered distribution graph
  • Có chức năng phát hiện encrypted/compressed file
  • diffing so sánh các nguồn dữ liệu khác nhau, cung cấp highlight khác biệt và table view

Disassembly, YARA và hash

  • Disassembler tích hợp hỗ trợ mọi kiến trúc mà Capstone hỗ trợ
    • ARM32, ARM64, MIPS, x86 16/32/64-bit, PowerPC, SPARC, IBM SystemZ, xCORE, M68K, TMS320C64X, M680X, Ethereum, RISC-V, WebAssembly, MOS65XX, Berkeley Packet Filter
  • Cũng hỗ trợ viết custom disassembler cho kiến trúc riêng
  • Hỗ trợ YARA Rule cho phép quét file bằng official yara rules, highlight match trong trình chỉnh sửa hex, di chuyển đến match và áp dụng nhiều rule cùng lúc
  • Hashing có thể thực hiện trên vùng dữ liệu cụ thể và chuỗi bất kỳ
  • Các hash được hỗ trợ gồm CRC8/16/32, MD5, SHA-1/SHA-224/SHA-256/SHA-384/SHA-512, Adler32, Murmur, SipHash, XXHash, Tiger, Blake2B, Blake2S, v.v.

UI, theme, import/export

  • Theme cung cấp dark mode mặc định và cũng có thể dùng light mode
  • Có thể tùy biến màu sắc và style của mọi thành phần UI bằng theme file có thể chia sẻ, đồng thời hỗ trợ custom font
  • modern interface hỗ trợ multiple workspaces, custom layouts, detachable windows
  • import/export hỗ trợ Base64 files, IPS/IPS32 patches, Markdown reports, binary arrays cho nhiều ngôn ngữ lập trình
  • bookmarks hỗ trợ custom name/color, region highlight trong trình chỉnh sửa hex, jump, mở bookmark content trong tab mới và thêm comment
  • content updater tích hợp có thể tải file từ database ngay trong ImHex
    • pattern files
    • pattern language libraries
    • magic files
    • custom data processor nodes
    • custom encodings
    • custom themes
    • Yara rules

Công cụ và onboarding

  • Helpful tools gồm các demangler dựa trên LLVM cho Itanium, MSVC, Rust, D-Lang
  • Các công cụ khác gồm ASCII table, regex replacer, mathematical expression evaluator, graphing calculator, hexadecimal color picker, base converter, byte swapper, UNIX permissions calculator, Wikipedia term definition finder, v.v.
  • file utilities cung cấp file splitter, file combiner, file shredder
  • Cũng bao gồm TCP Client/Server, HTTP Requests, IEEE754 Float visualizer, Euclidean algorithm calculator, v.v.
  • Các tính năng hỗ trợ bắt đầu gồm hỗ trợ đa ngôn ngữ, simplified mode cho người mới, tài liệu phong phú, example files trong database, achievements, interactive tutorials

Yêu cầu hệ thống và điều kiện build

  • GPU thường cần OpenGL 3.0 trở lên
    • Bản phát hành có suffix -NoGPU là dạng software rendered nên có thể chạy không cần GPU, nhưng có thể chậm hơn nhiều so với bản GPU accelerated
    • Nếu có thể, nên dùng dedicated GPU thay vì integrated GPU
    • Một số driver Intel HD GPU trên Windows được biết là gây ra graphical artifacts
  • Hỗ trợ OS:
    • Windows 7 trở lên, khuyến nghị Windows 10/11
    • macOS 15 Sequoia trở lên
      • Phiên bản thấp hơn cũng có thể hoạt động nếu tự compile, nhưng do GitHub không có CI runner cho macOS 15 trở xuống nên release binary sẽ không hoạt động
      • macOS build chưa được signed, vì vậy cần cho phép thủ công trong cài đặt Security & Privacy
    • Linux có official release cho Ubuntu/Debian, Fedora, RHEL/AlmaLinux, Arch Linux; các distro khác được hỗ trợ bằng AppImage, Flatpak, Snap
    • Đã được thử nghiệm trên FreeBSD 14.3
  • CPU chính thức hỗ trợ x86, AMD64, ARM64; miễn là CPU Little Endian thì sẽ hoạt động
  • RAM cần khoảng 50MiB, và các phân tích phức tạp hơn sẽ cần nhiều bộ nhớ hơn
  • Dung lượng lưu trữ cần khoảng 100MiB
  • Để compile cần GCC hoặc Clang hỗ trợ C++23 trở lên
    • Bản phát hành Windows và Linux được build bằng GCC mới nhất hiện có
    • Bản phát hành macOS được build bằng LLVM Clang mới nhất hiện có
    • MSVC và AppleClang không được hỗ trợ
  • Tài liệu cài đặt và compile:

Phát triển plugin và giấy phép

  • Có thể bắt đầu phát triển plugin từ template project, truy cập libimhex, ImHex API và Content Registry để tương tác với ImHex hoặc thêm content mới
  • Cần SDK để build plugin
  • Quy trình build SDK cục bộ:
    • cmake -G Ninja -DIMHEX_BUNDLE_PLUGIN_SDK=ON -B build
    • cd build
    • DESTDIR=install ninja install
    • Đường dẫn SDK sẽ là install/usr/local/share/imhex/sdk, và cần đặt IMHEX_SDK_PATH thành absolute path tương ứng
  • Trên GitHub Actions CI, có thể tự động tải SDK bằng action imhex-download-sdk
  • ImHex Plugin Template được cung cấp làm điểm khởi đầu cho plugin
  • Giấy phép phần lớn là GPLv2-only
    • /lib/libimhex là LGPLv2.1
    • /plugins/ui là LGPLv2.1
    • Ngoại lệ này nhằm cho phép phát triển proprietary plugin
  • code signing policy nêu rằng phần mềm không truyền thông tin sang hệ thống mạng khác trừ khi người dùng yêu cầu rõ ràng hoặc người cài đặt/vận hành yêu cầu

1 bình luận

 
GN⁺ 2024-06-30
Ý kiến trên Hacker News
  • ImHex là trình chỉnh sửa hex tốt nhất mình từng dùng cho đến nay
    Có vài lý do: một số trình chỉnh sửa khác cũng có vài điểm này, nhưng hiếm cái nào có đủ cùng lúc. Nó tự động tô sáng các phần của định dạng tệp đã biết bằng template tệp, diễn giải và hiển thị đồng thời các byte được chọn dưới hầu hết các kiểu dữ liệu phổ biến, và nhanh hơn nhiều so với các trình chỉnh sửa khác khi xử lý tệp lớn
    Nhược điểm là giao diện imgui thỉnh thoảng có lỗi, nhưng nó đã thay thế các trình xem khác như HexFiend hay hexa đối với mình

    • 010 Editor cũng đáp ứng cả ba điểm đó. Nhưng khác với 010 Editor, ImHex không bắt bạn trả 150 đô la, và vì là mã nguồn mở tự do nên dễ tự vá thêm tính năng cần thiết
  • Không biết trình chỉnh sửa này có thể hiển thị byte ASCII dưới dạng glyph CP437 không
    Mình lớn lên với việc đọc tệp nhị phân kiểu đó trên DOS, nên có thể đọc glyph nhanh hơn nhiều so với giá trị hex tương ứng. Ngược lại, nếu các ký tự không in được chỉ được hiển thị bằng dấu chấm thì chẳng cho biết được nhiều

    • Trong phần cài đặt có thể tải thêm asset và diễn giải dữ liệu theo nhiều kiểu mã hóa khác nhau
      Mình không thấy CP437 trong danh sách, nhưng định dạng tệp mã hóa khá đơn giản nên có lẽ có thể dễ dàng tạo mapping
      https://github.com/WerWolv/ImHex-Patterns/tree/master/encodi...
    • Vấn đề của CP437 là FF, 00, 20 đều là ô trống nên trông giống hệt nhau
      Ngoài ra còn có những ký tự mơ hồ, không rõ là sharp S tiếng Đức hay beta
  • Mình đã thử ImHex, nhưng nó quá phức tạp cho hầu hết những việc mình định làm
    Trên macOS mình vẫn thích Hex Fiend. Đơn giản, nhanh và làm đúng việc cần làm. Trên Windows thì mình vẫn chưa tìm được trình chỉnh sửa hex “đơn giản” hoàn hảo

    • HxD trên Windows gần như là đỉnh cao của trình chỉnh sửa hex, và mình cảm thấy macOS hay Linux không có đối trọng thật sự. Tiếc là mình hầu như không dùng Windows
      Trên macOS mình dùng Hex Fiend, nhưng không hiểu vì sao khi kéo cửa sổ rộng ra nó lại cho các dòng chảy lại. Mình muốn tối đa hóa cửa sổ để giảm nhiễu thị giác nhưng vẫn giữ độ dài dòng ở 16 byte hoặc 32 byte, chứ không muốn những kích thước kỳ lạ phá hỏng căn chỉnh
    • Thêm một phiếu cho HexFiend. Định dạng template dễ mở rộng nên mình đã dùng nó để phân tích nhiều định dạng tệp
      Mình cũng thử ImHex một lúc và thật sự tôn trọng dự án này, nhưng với nhu cầu của mình thì cảm giác như dùng đại bác bắn ruồi
    • Không biết bạn đã thử Hiew chưa
  • Trước mắt mình vẫn sẽ tiếp tục dùng 010 Editor[1]. Đó là trình chỉnh sửa hex tuyệt vời nhất mình từng dùng trong đời
    Dear ImGui, framework GUI mà dự án mới này dùng, thì mình hoàn toàn không thích. Nó hợp với các hệ thống nhúng màn hình nhỏ và không có trình quản lý cửa sổ hơn; dùng trong môi trường desktop đầy đủ thì khá gượng gạo vì các thành phần nhỏ và thiếu tích hợp UI
    [1] https://www.sweetscape.com/010editor/

    • Chỉ riêng render phông chữ trông như không có anti-aliasing cũng đủ làm mình thấy khó dùng
  • Thấy ghi “ImHex requires a GPU with OpenGL 3.0 support in general”, tại sao một trình chỉnh sửa hex lại cần OpenGL? Vậy nên nó cũng cần GPU à?
    Không biết có lý do chính đáng nào để cần OpenGL không, hay chỉ là để trông ngầu

    • Với độ phân giải màn hình hiện nay, bất kỳ trình chỉnh sửa nào muốn mượt và nhanh đều cần render bằng phần cứng
      Đặc biệt là cách vẽ định dạng phức tạp theo từng pixel kiểu ngày xưa sẽ chậm thấy rõ. Ví dụ có thể xem bài này
      [1] https://www.sublimetext.com/blog/articles/hardware-accelerat...
    • Vì UI được làm bằng Imgui. Tiền tố Im trong tên cũng đến từ đó, và đây là framework UI cho các chương trình đồ họa máy tính
      Tuy nhiên yêu cầu OpenGL không nhất thiết có nghĩa là cần GPU. Cũng có triển khai OpenGL bằng phần mềm, nhưng hiệu năng thường không tốt. Ngoài ra ngày nay nhiều nền tảng mặc định giả định là có GPU dưới một dạng nào đó. Trường hợp cần công cụ GUI mà không có GPU khá hiếm, và trong những môi trường ngách như vậy khả năng chạy cục bộ trình chỉnh sửa hex và các công cụ cũng thấp
    • Theo README của dự án, nếu không có GPU thì có cung cấp bản phát hành render phần mềm cho Windows và macOS
    • Có lẽ họ chỉ chọn OpenGL renderer cho imgui mà thôi
  • Đây là một dự án thật sự xuất sắc. Mình đã nghịch khá vui với ROM của đồng hồ thông minh Philips
    Nó có DSL tích hợp trông giống Rust, không có quản lý bộ nhớ nên rất nhẹ, nhưng vẫn có thể dùng để trực quan hóa và trích xuất dữ liệu có cấu trúc trong luồng nhị phân. Thật sự vui và hay
    Cũng có một trình chỉnh sửa trực quan để tạo các phép tính đơn giản mà không cần code, nhưng khi thử thì mình thấy chưa được trau chuốt. Kỳ lạ là viết code bằng DSL lại trực quan và dễ hơn

    • Vậy chắc cảm giác giống protocol dissector của Wireshark
  • Bài liên quan:
    ImHex – A Hex Editor - https://news.ycombinator.com/item?id=32287902 - tháng 7 năm 2022, 70 bình luận
    ImHex – A Hex Editor - https://news.ycombinator.com/item?id=25353965 - tháng 12 năm 2020, 78 bình luận

  • Trông khá ổn. Phát triển một trình chỉnh sửa hex làm dự án có phải là ý tưởng hay không?
    Phiên bản đơn giản có vẻ không quá khó, nhưng nếu muốn parse đủ loại định dạng tệp, từ image thực thi đến Doom WAD và các định dạng tệp độc quyền, thì có rất nhiều chỗ để luyện tập. Cũng có vẻ có nhiều cơ hội để làm công cụ hỗ trợ reverse engineering

    • Mình nhớ đã đọc đâu đó rằng khi học một ngôn ngữ mới, có người chọn triển khai trình chỉnh sửa hex làm dự án đầu tiên
      Họ nói nó giúp luyện cùng lúc nhiều thứ như xử lý tệp, GUI, bố cục văn bản, quản lý bộ nhớ, v.v.
  • Trông hay đấy. Bình thường mình vẫn dùng 010 Editor chủ yếu vì tìm kiếm bằng wildcard, nhưng ImHex cũng làm được chức năng đó và còn hơn thế nữa nên mình đang nghiêng về nó. Mình sẽ thử nghiệm thêm

  • Mình thật sự thích văn hóa máy tính ở mảng này. Reverse engineering, viết module kernel, tìm hiểu cách mọi thứ hoạt động và khiến chúng làm những việc mà ban đầu không được thiết kế để làm — tất cả đều rất hấp dẫn
    Chỉ là không có nhiều con đường hợp pháp để làm, và cần rất nhiều thời gian cùng sự giúp đỡ của đồng nghiệp

    • Mình làm reverse engineering như một công việc, và có nhiều đồng nghiệp trên khắp thế giới cũng làm việc tương tự. Lĩnh vực chính là phân tích mã độc
      Còn như sở thích, ở quốc gia mình sống, reverse engineering những thứ mình sở hữu nhằm làm cho chúng chạy trên hệ thống của mình được nêu rõ là hợp pháp. Ví dụ sửa một game Windows XP để chạy trên Windows 10. Ngoại lệ này khá rộng, nên trong hầu hết các trường hợp “có vẻ nên hợp pháp”, reverse engineering đều có thể làm được
    • Một dự án không nhất thiết phải “hợp pháp” thì mới vui
      Chỉ cần công bố dưới bút danh không gắn với danh tính thật và dùng các cộng đồng chuyên phớt lờ yêu cầu gỡ bỏ DMCA. Nếu bạn không định kiếm tiền từ nó, kịch bản tệ nhất có lẽ chỉ là bên bị nhắm tới phát hiện tác phẩm của bạn và áp dụng vmprotect trong bản phát hành tiếp theo
    • Reverse engineering định dạng tệp thật sự rất vui. Mình từng làm ở một nơi dùng ứng dụng quản lý công việc độc quyền; một hôm rảnh quá, mình mở tệp dữ liệu của nó bằng trình chỉnh sửa hex và phát hiện tiêu đề các bản ghi trong ứng dụng nằm trong tệp theo đúng mẫu cách nhau X byte
      Mình nhận ra đó là các bản ghi độ dài cố định, và 2 byte ngay sau tiêu đề trông giống giá trị hex của số bản ghi hiển thị trong ứng dụng. Khi nhấp vào checkbox, một byte đổi từ 0x00 sang 0x01; sau khi thử nghiệm đủ, mình map toàn bộ cấu trúc thành struct trong code và tạo được báo cáo mà ứng dụng gốc không hỗ trợ
      Chẳng có gì bất hợp pháp trong đó. Nhà cung cấp hẳn muốn chúng tôi trả tiền để họ làm báo cáo, nhưng về mặt pháp lý thì không bị cấm
    • Nếu không công khai thì nhìn chung bạn có thể làm hầu như bất cứ điều gì
      Không phải cứ làm ra gì đó hay học được gì đó là nhất thiết phải phát loa cho mọi người biết. Bản thân việc học đã có thể là phần thưởng