ismaelfsilva/lendis

GitHub: ismaelfsilva/lendis

lendis是一个用于解码x86/x64指令长度的轻量级工具,用于逆向工程和漏洞分析。

Stars: 0 | Forks: 0

# lendis `lendis` 是一个微小的 **x86/x64 指令长度解码器**(一个 "长度反汇编器"): 给定一个字节缓冲区和 CPU 模式(32 位或 64 位),它返回第一个指令的 **字节长度**。 这是逆向工程中钩子/跳转引擎使用的核心原语:要安装内联钩子,你必须从函数前导中复制整个指令,这意味着你需要知道每个指令的结束位置。 ## 范围(诚实一点) 这 **不是一个完整的反汇编器**。它 **不** 解码操作数、助记符或语义。它只计算指令 *长度*。它正确处理在真实函数前导和代码中遇到的常见 x86-64 指令形式: - 旧前缀:组 1 (`F0 F2 F3`)、组 2 段覆盖 (`2E 36 3E 26 64 65`)、操作数大小覆盖 (`66`)、地址大小覆盖 (`67`)。 - 64 位模式下的 REX 前缀 (`40`–`4F`),跟踪 `REX.W`。 - 单字节操作码映射、双字节映射 (`0F xx`) 和三字节映射 (`0F 38 xx` / `0F 3A xx`),用于常见的 ModR/M 形式。 - ModR/M + SIB + 位移解码,包括 RIP 相对寻址。 - 立即数:`imm8`、`imm16`、`imm16/32`(操作数大小相关,"z")、`imm v`(当 `REX.W` 时为 8 字节)以及 `E8/E9/EB`、`68/6A`、`C2`、`80/81/83` 组、`B0-B7`、`B8-BF`、`A8/A9` 和 `F6/F7`(`TEST` 子操作码携带额外的立即数)的特殊情况。 异类/较少见的编码(VEX/EVEX/AVX、x87 ModR/M 纳秒、远指针、每个 SSE 形式等)有意不在此范围内。支持的子集由 `tests/` 中的精选测试进行练习。 ## 构建 ``` cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release cmake --build build ctest --test-dir build --output-on-failure ``` ## 命令行界面使用 将指令字节作为十六进制数传递到命令行(默认为 64 位模式,`--x86` 为 32 位): ``` lendis 48 89 e5 # -> 3 (mov rbp, rsp) lendis --x86 b8 01 00 00 00 # -> 5 (mov eax, 1) ``` ## 库使用 ``` #include "lendis/lendis.hpp" const unsigned char code[] = {0x48, 0x89, 0xE5}; size_t len = lendis::instruction_length(code, sizeof(code), lendis::Mode::X64); // len == 3 ``` `instruction_length` 如果缓冲区太短而无法容纳解码的指令,则返回 `0`。 ## 许可证 MIT。请参阅 [LICENSE](LICENSE).