2017-08-27 195 views
-1

我正在試驗http://www.capstone-engine.org在MacOS和MacOS x86_64二進制。它或多或少有用,但我確實有兩個問題。頂點cs_disasm反彙編只有一小部分代碼

我加載測試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]]; 
  1. 至於我做我的研究好像我需要修剪的二進制代碼「第一」個字節,直到遇到真正的指令來刪除頭和元數據。然而,我不確定capstone是否會爲此提供任何API,或者我需要按字節模式進行掃描並找到第一個指令地址。

事實上,我也應用於簡單的解決方法,我沒有發現這肯定會對大部分模塊,我將加載指令安全地址,但是我想申請妥善解決。

  1. 我已經使用我描述過的解決方法成功地加載和反彙編了模塊代碼的一部分。然而,不幸的是,cs_disasm返回大多數不超過5000-6000條指令,這是令人困惑的,它似乎違反了它不應該打破的常規指令。我不確定我做錯了什麼。模塊超過15mb的代碼,所以有很多超過5k的反彙編指令。

下面是功能我已經基於頂層文檔例如

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; 
} 

我會很感激有這方面的幫助。
熱烈,
大衛

+0

爲什麼我的問題被投下了2倍呢?我認爲問題非常合適,如果這很明顯,爲什麼你不會回答,但投票呢? – David

回答

0

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; 
} 

對那些投降了這個問題的巨魔感到羞恥。