web-dev-qa-db-ja.com

逆アセンブルコマンドラインを取得する方法?

現在、ASMプログラミングを学んでいます。ファイル.cを逆アセンブルしたいと思います。ただし、コマンドラインを実行した後

set disassembly-flavor test.c

次のコマンドを使用します。

disassembly test.c

そして私の端末が表示されました

disassemble: command not found

私のコンピュータでコマンド「逆アセンブル」を取得できることを誰もが知っていますか?

ありがとう

2
S7_0

まず、.c拡張子を持つファイルは、ほとんどの場合Cソースファイルです。分解には使用できません。ファイルが実際にプログラムであることを確認するには、fileコマンドを使用します。

$ file test.c
test.c: ASCII text
$ file /bin/bash
/bin/bash: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked
(uses shared libs), for GNU/Linux 2.6.24,
BuildID[sha1]=54967822da027467f21e65a1eac7576dec7dd821, stripped

分解については、代わりにobjdumpを使用してください。マンページから:

NAME
       objdump - display information from object files.

SYNOPSIS
       objdump [...]
               [-d|--disassemble]

したがって、逆アセンブルするには、a.outというファイルを使用して、

$ objdump -d a.out 

a.out:     file format elf64-x86-64


Disassembly of section .init:

00000000004003a8 <_init>:
  4003a8:   48 83 ec 08             sub    $0x8,%rsp
  4003ac:   48 8b 05 45 0c 20 00    mov    0x200c45(%rip),%rax        # 600ff8 <_DYNAMIC+0x1d0>
  4003b3:   48 85 c0                test   %rax,%rax
  4003b6:   74 05                   je     4003bd <_init+0x15>
  4003b8:   e8 33 00 00 00          callq  4003f0 <__gmon_start__@plt>
  4003bd:   48 83 c4 08             add    $0x8,%rsp
  4003c1:   c3                      retq   
[...] and so on...
6
s3lph

あなたが望むのは、逆アセンブルコマンドを持つgnuデバッガーであるgdbの機能だと思います。まず、次のように、デバッグフラグをオンにしてtest.cをコンパイルします。gcc -Wall -g -o test test.c

またはそれらの線に沿って何か。次に、gdbを引数としてアプリケーションを実行します。

gdb test

gdbに入ったら、次のようにdisassembleコマンドを使用できます。

(gdb) break main
(gdb) disassemble main

Test.cppという名前のこの簡単なプログラムを見てみましょう。

#include <iostream>
using namespace std;
int main ()
{
    int a=0;
    for (int b = 0; b < 11; b++){
        a=b+2;
        cout << a << "\n\t";
    }
cout << "Hello World \n";     
return 0;
}

デバッグフラグを付けてコンパイルします。

g++ -Wall -g test.cpp -o test

次に、あなたは言うが、j0h、これはCの質問です...私が言うには、gdbはあなたが使用する言語を気にしません。 c、c ++、Assembly、fortran、およびその他のさまざまなものをデバッグおよび逆アセンブルできます。-gオプションを使用してコンパイルするだけです。これが重要です。

プログラムをgdbにロードしてmainを中断したら、逆アセンブルを実行します。

Breakpoint 1 at 0x4007da
(gdb) disassemble main
Dump of assembler code for function main:
   0x00000000004007d6 <+0>: Push   %rbp
   0x00000000004007d7 <+1>: mov    %rsp,%rbp
   0x00000000004007da <+4>: sub    $0x10,%rsp
   0x00000000004007de <+8>: movl   $0x0,-0x4(%rbp)
   0x00000000004007e5 <+15>:    movl   $0x0,-0x8(%rbp)
   0x00000000004007ec <+22>:    jmp    0x400817 <main+65>
   0x00000000004007ee <+24>:    mov    -0x8(%rbp),%eax
   0x00000000004007f1 <+27>:    add    $0x2,%eax
   0x00000000004007f4 <+30>:    mov    %eax,-0x4(%rbp)
   0x00000000004007f7 <+33>:    mov    -0x4(%rbp),%eax
   0x00000000004007fa <+36>:    mov    %eax,%esi
   0x00000000004007fc <+38>:    mov    $0x601080,%edi
   0x0000000000400801 <+43>:    callq  0x400670 <_ZNSolsEi@plt>
   0x0000000000400806 <+48>:    mov    $0x400914,%esi
   0x000000000040080b <+53>:    mov    %rax,%rdi
---Type <return> to continue, or q <return> to quit---

以下にチュートリアルを示します。 http://www.unknownroad.com/rtfm/gdbtut/gdbadvanced.html

objdumpは内容を一覧表示できますが、デバッガを使用する場合と同じ方法でコードを操作できるとは思いません。

2
j0h