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).