首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Capstone cs_disasm只分解一小部分代码

Capstone cs_disasm只分解一小部分代码
EN

Stack Overflow用户
提问于 2017-08-27 21:56:31
回答 1查看 1.9K关注 0票数 3

我正在用http://www.capstone-engine.org在MacOS和MacOS x86_64二进制文件上进行实验。它或多或少是有效的,但我确实有两个问题。

我在加载测试

代码语言:javascript
复制
[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]];
  1. 就我所做的研究而言,我似乎需要从二进制代码中删减“第一”字节,以删除标题和元数据,直到它遇到真正的指令。但是,我不太确定capstone是否为此提供了任何api,或者我需要按字节模式扫描并定位第一个指令地址。

事实上,我已经应用了简单的解决方法,我确实找到了安全的地址,这个地址肯定会在我将要加载的大多数模块上都有说明,但是我想要应用正确的解决方案。

  1. 我已经使用我所描述的解决方案成功地加载和分解了部分模块代码。然而,令人遗憾的是,cs_disasm返回的指令大多不超过5000到6000条,这让人感到困惑,它似乎破坏了常规指令,而这些指令是不应该中断的。我不太清楚我做错了什么。模块有超过15 5k的代码,所以有更多的5k指令来进行反汇编。

下面是基于Capstone文档示例的函数

代码语言:javascript
复制
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;
}

我非常感谢在这方面的任何帮助。

热情,

大卫

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-29 20:34:07

Anwser是简单地使用SKIPDATA模式。卡普斯通很棒,但他们的医生很糟糕。

下面的工作示例。这种模式仍然是非常窃听,所以最好这种检测数据扇区应该是自定义代码。对我来说,它只适用于小块代码。但是,实际上,它直到文件结束时都会进行反汇编。

代码语言:javascript
复制
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;
}

对那些投票否决这个问题的人来说是可耻的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45909689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档