2017-08-27 1 views
-1

私はMacOSとMacOS x86_64バイナリでhttp://www.capstone-engine.orgを試しています。多かれ少なかれ動作しますが、私は2つの懸念があります。私の知る限り、私の研究をしたキャップストーン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. をロードしています、私はそれが本当の指示に遭遇するまで、ヘッダとメタデータを削除するには、バイナリコードから「最初の」バイトをトリミングする必要がありそうです。しかし、私は実際にキャップストーンがこのための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

アンサーは単にスキップデータモードを使用します。冠は素晴らしいですが、彼らのドキュメントは非常に悪いです。

下記の使用例。このモードは依然として非常に厄介なので、このデータセクタの検出はカスタムコードである必要があります。私にとっては小さなコードでしかうまくいきません。しかし、実際にはファイルの終わりまで逆アセンブルします。

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

この質問を落としたトロルには恥ずかしいです。

関連する問題