3 个版本 (破坏性更新)
使用旧的 Rust 2015
0.3.0 | 2018年5月26日 |
---|---|
0.2.0 | 2017年5月1日 |
0.1.1 | 2016年7月1日 |
#1372 在 解析器实现 中
98 每月下载量
在 2 crate 中使用
44KB
748 行
长度反汇编器
给定一个字节切片,提取其中操作码的长度。
支持 x86
和 x86_64
。
库
此库可在 crates.io 上找到,其文档在 docs.rs。
在您的 Cargo.toml 中添加
[dependencies]
lde = "0.3"
示例
获取字节切片中第一个操作码的长度
let result = lde::X64.ld(b"\x40\x55\x48\x83\xEC\xFC\x00\x80");
assert_eq!(result, 2);
遍历字节切片中包含的操作码,返回操作码及其虚拟地址
let code = b"\x40\x55\x48\x83\xEC*\x00\x80";
for (opcode, va) in lde::X64.iter(code, 0x1000) {
println!("{:x}: {}", va, opcode);
}
// 1000: 4055
// 1002: 4883EC2A
找到至少5字节后的操作码边界
// 1000: 56 push esi
// 1001: 33f6 xor esi,esi
// 1003: 57 push edi
// 1004: bfa0104000 mov edi,0x4010a0
// 1009: 85d2 test edx,edx
// 100b: 7410 je loc_0000001d
// 100d: 8bf2 mov esi,edx
// 100f: 8bfa mov edi,edx
const INPUT_CODE: &[u8] = b"\x56\x33\xF6\x57\xBF\xA0\x10\x40\x00\x85\xD2\x74\x10\x8B\xF2\x8B\xFA";
// We'd like to overwrite the first 5 bytes with a jmp hook
// Find how many opcodes need to be copied for our hook to work
let mut count = 0;
for (opcode, _) in lde::X86.iter(INPUT_CODE, 0x1000) {
count += opcode.len();
if count >= 5 {
break;
}
}
// The answer is the first 4 opcodes, or 9 bytes
assert_eq!(count, 9);
自定义 Display
和 Debug
格式化,包括带有替代标志的格式化打印支持
let iter = lde::X64.iter(b"\x40\x55\x48\x83\xEC*\x00\x80", 0);
assert_eq!(format!("{:?}", iter), "[4055] [4883EC2A] 0080");
assert_eq!(format!("{:#?}", iter), "[40 55] [48 83 EC 2A] 00 80");
assert_eq!(format!("{:}", iter), "4055\n4883EC2A\n");
assert_eq!(format!("{:#}", iter), "40 55\n48 83 EC 2A\n");
许可证
根据 MIT 许可证 许可,请参阅 license.txt。
贡献
除非您明确说明,否则您提交的任何贡献,只要有意将其包含在工作内容中,都应按上述方式许可,无需附加条款或条件。