我正在MacOS 和 MacOS x86_64 二进制文件上尝试http://www.capstone-engine.org 。它或多或少确实有效,但我确实有两个担忧。
我正在加载测试 dylib
[self custom_logging:[NSString stringWithFormat:@"Module Path:%@",clientPath]];
NSMutableData *ModuleNSDATA = [NSMutableData dataWithContentsOfFile:clientPath];
[self custom_logging:[NSString stringWithFormat:@"Client Module Size: %lu MB",(ModuleNSDATA.length/1024/1024)]];
[ModuleNSDATA replaceBytesInRange:NSMakeRange(0, 20752) withBytes:NULL length:0];
uint8_t *bytes = (uint8_t*)[ModuleNSDATA bytes];
long size = [ModuleNSDATA length]/sizeof(uint8_t);
[self custom_logging:[NSString stringWithFormat:@"UInt8_t array size: %lu",size]];
ModuleASM = [NSString stringWithCString:disassembly(bytes,size,0x5110).c_str() encoding:[NSString defaultCStringEncoding]];
- 就我所做的研究而言,我似乎需要从二进制代码中删除“第一个”字节以删除标头和元数据,直到它遇到真正的指令。但是我不确定 capstone 是否为此提供了任何 api,或者我需要按字节模式扫描并找到第一个指令地址。
事实上,我已经应用了简单的解决方法,我确实找到了安全地址,它肯定会对我将加载的大多数模块有说明,但是我想应用适当的解决方案。
- 我已经使用我描述的解决方法成功加载和反汇编了部分模块代码。然而,可悲的是,cs_disasm返回的指令大多不超过 5000-6000 条,这令人困惑,它似乎在不应该中断的常规指令上中断。我不确定我做错了什么。模块的代码超过 15mb,因此要反汇编的指令超过 5k。
以下是我基于 Capstone Docs 示例的功能
string disassembly(uint8_t *bytearray, long size, uint64_t startAddress){
csh handle;
cs_insn *insn;
size_t count;
string output;
if (cs_open(CS_ARCH_X86, CS_MODE_64, &handle) == CS_ERR_OK){
count = cs_disasm(handle, bytearray, size, startAddress, 0, &insn);
printf("\nCOUNT:%lu",count);
if (count > 0) {
size_t j;
for (j = 0; j < count; j++) {
char buffer[512];
int i=0;
i = sprintf(buffer, "0x%" PRIx64":\t%s\t\t%s\n", insn[j].address, insn[j].mnemonic,insn[j].op_str);
output += buffer;
}
cs_free(insn, count);
} else {
output = "ERROR: Failed to disassemble given code!\n";
}
}
cs_close(&handle);
return output;
}
我将非常感谢这方面的任何帮助。
热情地,
大卫