- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在试验 http://www.capstone-engine.org在 MacOS 和 MacOS x86_64 二进制文件上。它或多或少确实有效,但我确实有 2 个顾虑。
我正在加载测试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 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;
}
我将非常感谢对此的任何帮助。
热情地,
大卫
最佳答案
Anwser就是简单的使用SKIPDATA模式。 Capstone 很棒,但他们的文档非常糟糕。
下面的工作示例。这种模式仍然很容易出错,所以最好这种数据扇区的检测应该是自定义代码。对我来说,它只适用于小块代码。然而,它确实会反汇编到文件末尾。
string disassembly(uint8_t *bytearray, long size, uint64_t startAddress){
csh handle;
cs_insn *insn;
size_t count;
string output;
cs_opt_skipdata skipdata = {
.mnemonic = "db",
};
if (cs_open(CS_ARCH_X86, CS_MODE_64, &handle) == CS_ERR_OK){
cs_option(handle, CS_OPT_DETAIL, CS_OPT_ON);
cs_option(handle, CS_OPT_SKIPDATA, CS_OPT_ON);
cs_option(handle, CS_OPT_SKIPDATA_SETUP, (size_t)&skipdata);
count = cs_disasm(handle, bytearray, size, startAddress, 0, &insn);
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;
}
对那些对这个问题投反对票的巨魔感到羞耻。
关于c++ - Capstone cs_disasm 仅反汇编一小部分代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45909689/
今天我尝试从顶点开始。以他们为榜样 here我想开始与图书馆合作。不幸的是,Capstone 不会生成它反汇编的最后一行 asm 指令。它只产生一个空行。 代码: #include #include
我正在试验 http://www.capstone-engine.org在 MacOS 和 MacOS x86_64 二进制文件上。它或多或少确实有效,但我确实有 2 个顾虑。 我正在加载测试dyli
我正在尝试使用 Capstone C++ 中的反汇编框架项目 Ubuntu . I ran the following command to install the development packa
我正在使用 winappdbg 库尝试使用以下代码执行反汇编: thread = evt.get_thread() pc = thread.get_pc() code = thread.disasse
我是一名优秀的程序员,十分优秀!