Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Capstone cs_disasm反汇编只是代码的一小部分_C++_C_Reverse Engineering_Disassembly_Capstone - Fatal编程技术网

C++ Capstone cs_disasm反汇编只是代码的一小部分

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

我正在MacOS和MacOS x86_64二进制上进行试验。它或多或少能起作用,但我有两个顾虑

我正在加载测试动态库

[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;
    }
    
    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
    我将非常感谢您在这方面的帮助。
    热情地,

    David

    Anwser只是简单地使用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

    那些否决了这个问题的巨魔真可耻。

    为什么我的问题被否决了两次?这个问题问得很恰当,我想,若这很明显,你们为什么不回答,而是投反对票呢?