4

実行可能ファイルのマシン コード (バイナリ) にアクセスするにはどうすればよいですか?

詳細

  • 私はUbuntu(Linux)を使用しています
  • .exe ファイルのマシン コード (バイナリ) にアクセスしたい (ファイルは PE 形式に従う)
  • 実装にCを使用しています
4

2 に答える 2

6

分解objdumpオプションと合わせてご使用ください。別の便利なオプションは、ファイルのダンプを取得することです。何らかの理由で が機能しない場合は、 を試すこともできます。これにより、ファイルにマシン コードが含まれていないように見えても、強制的にファイルが逆アセンブルされます。詳細については、のマンページを参照してください。たとえば、PE 実行可能タイプを逆アセンブルしてダンプするには、次のようにします。-d-s-d-Dobjdumpobjdumpfoo.exe

objdump -sd foo.exe

出力は 2 つの部分で構成されます。最初の部分は次のようになります。

Contents of section .text:
 401000 33c03905 28944200 0f9fc0c3 558bec51  3.9.(.B.....U..Q
 401010 568bf16a 01684410 4000c706 30024200  V..j.hD.@...0.B.
 401020 ff15b000 420085c0 75158d45 fc68c00e  ....B...u..E.h..
 401030 420050c7 45fc9070 4200e8cd bc01008b  B.P.E..pB.......
 401040 c65ec9c3 837c2404 0575056a 0158eb12  .^...|$..u.j.X..
 401050 ff052894 420033c0 833d2894 4200020f  ..(.B.3..=(.B...
 401060 9cc0c204 00568bf1 e8140000 00f64424  .....V........D$
 401070 08017407 56e88b6f 0000598b c65ec204  ..t.V..o..Y..^..
 401080 00558bec 516a0068 44104000 c7013002  .U..Qj.hD.@...0.
 401090 4200ff15 b0004200 85c07515 8d45fc68  B.....B...u..E.h
 4010a0 c00e4200 50c745fc 90704200 e85bbc01  ..B.P.E..pB..[..
 4010b0 00c9c3e8 48ffffff f6d81bc0 25044000  ....H.......%.@.
 4010c0 80c20c00 e837ffff fff6d81b c0250440  .....7.......%.@
 4010d0 0080c208 00558bec 568b7508 68c58240  .....U..V.u.h..@
 4010e0 00682072 4200ff75 0c8b4e40 68187242  .h rB..u..N@h.rB
 4010f0 00e8d771 00008bc8 e8e87100 008bc8e8  ...q......q.....

これは、バイナリの個々のセクションのダンプです。最初の列はこの行のアドレスで、次の 4 列はダンプされたデータを 16 進表記で示し、最後の列はデータを ASCII 文字として表示し、.印刷不能文字を置換します。

2 番目の部分は次のようになります。

00401000 <.text>:
  401000:   33 c0                   xor    %eax,%eax
  401002:   39 05 28 94 42 00       cmp    %eax,0x429428
  401008:   0f 9f c0                setg   %al
  40100b:   c3                      ret    
  40100c:   55                      push   %ebp
  40100d:   8b ec                   mov    %esp,%ebp
  40100f:   51                      push   %ecx
  401010:   56                      push   %esi
  401011:   8b f1                   mov    %ecx,%esi
  401013:   6a 01                   push   $0x1
  401015:   68 44 10 40 00          push   $0x401044
  40101a:   c7 06 30 02 42 00       movl   $0x420230,(%esi)
  401020:   ff 15 b0 00 42 00       call   *0x4200b0

これはバイナリの逆アセンブルです。最初の列には現在のアドレスが含まれ、次に命令が 16 進表記で表示され、最後に対応するニーモニックが表示されます。この部分は、ヘッダーで「実行可能コードを含む」とマークされているセクションにのみ存在することに注意してください (PE ファイルの場合、これはテキスト セクションにのみ適用されます)。このアセンブリ構文 (AT&T 構文) が気に入らない場合は、次のよう-Mintelに Intel 構文で出力を受け取ります。

00401000 <.text>:
  401000:   33 c0                   xor    eax,eax
  401002:   39 05 28 94 42 00       cmp    DWORD PTR ds:0x429428,eax
  401008:   0f 9f c0                setg   al
  40100b:   c3                      ret    
  40100c:   55                      push   ebp
  40100d:   8b ec                   mov    ebp,esp
  40100f:   51                      push   ecx
  401010:   56                      push   esi
  401011:   8b f1                   mov    esi,ecx
  401013:   6a 01                   push   0x1
  401015:   68 44 10 40 00          push   0x401044
  40101a:   c7 06 30 02 42 00       mov    DWORD PTR [esi],0x420230
  401020:   ff 15 b0 00 42 00       call   DWORD PTR ds:0x4200b0

もう 1 つの便利なツールは、Agner Fog のobjconv です。これには、Windows バイナリにより有用なオプションがあり、一般に .NET よりも詳細な逆アセンブリが提供されobjdumpます。

于 2015-10-30T12:04:11.233 に答える
5

ソース コードとマシン コードは同じではありません。

「binutils」がインストールされている場合は、次を使用できますobjdump

$ objdump --disassemble my-fantastic-program > my-fantastic-program.asm

これにより、 のアセンブリ コードがダンプmy-fantastic-programされます。もちろん、この時点では、プログラムがどの言語で書かれているかは問題ではありません。

の部分>は、シェル出力リダイレクトを使用して結果を新しいファイルに保存しています。

于 2015-10-30T12:04:25.393 に答える