C++ Capstone cs_disasm反汇编只是代码的一小部分
我正在MacOS和MacOS x86_64二进制上进行试验。它或多或少能起作用,但我有两个顾虑 我正在加载测试动态库C++ Capstone cs_disasm反汇编只是代码的一小部分,c++,c,reverse-engineering,disassembly,capstone,C++,C,Reverse Engineering,Disassembly,Capstone,我正在MacOS和MacOS x86_64二进制上进行试验。它或多或少能起作用,但我有两个顾虑 我正在加载测试动态库 [self custom_logging:[NSString stringWithFormat:@"Module Path:%@",clientPath]]; NSMutableData *ModuleNSDATA = [NSMutableData dataWithContentsOfFile:clientPath]; [self custom_logging:[NSString
[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]];
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;
}
string反汇编(uint8\u t*bytearray,长尺寸,uint64\u t起始地址){
csh手柄;
政务司司长*insn;
大小/数量;
字符串输出;
如果(cs_打开(cs_ARCH_X86、cs_MODE_64和handle)==cs_ERR_OK){
count=cs\u disasm(句柄、字节数组、大小、起始地址、0和insn);
printf(“\n计数:%lu”,计数);
如果(计数>0){
尺寸j;
对于(j=0;j
我将非常感谢您在这方面的帮助。热情地,
DavidAnwser只是简单地使用SKIPDATA模式。顶点是伟大的,但他们的文档非常糟糕 下面是一个工作示例。这种模式仍然有很多缺陷,因此最好是使用自定义代码来检测数据扇区。对我来说,它只适用于小块代码。然而,它确实在文件末尾进行反汇编
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;
}
string反汇编(uint8\u t*bytearray,长尺寸,uint64\u t起始地址){
csh手柄;
政务司司长*insn;
大小/数量;
字符串输出;
cs_opt_skipdata skipdata={
.mnemonic=“db”,
};
如果(cs_打开(cs_ARCH_X86、cs_MODE_64和handle)==cs_ERR_OK){
cs_选项(手柄、cs_选项详细信息、cs_选项打开);
cs_选项(句柄、cs_选项、跳过数据、cs_选项打开);
cs_选件(手柄、cs_选件、SKIPDATA设置、(尺寸)和SKIPDATA);
count=cs\u disasm(句柄、字节数组、大小、起始地址、0和insn);
如果(计数>0){
尺寸j;
对于(j=0;j
那些否决了这个问题的巨魔真可耻。为什么我的问题被否决了两次?这个问题问得很恰当,我想,若这很明显,你们为什么不回答,而是投反对票呢?