0

なぜ私がそうするのか誰かが私に説明してもらえますか

dumpbin / disasm "C:\ simple_Win32.exe" >> "C:\ users \ piter \ myDump5.txt"

ルーチンの名前は表示されませんが、eax、ebx、mov、およびその他の「自分ではない」関数(プリプロセッサマクロなど)のみが表示されます。つまり、次の例では、関数の名前とともにアセンブリコードがあります。

.text:00403D89     lea eax, [ebp+SystemTimeAsFileTime]
.text:00403D8C     push eax
.text:00403D8D     call ds:__imp__GetSystemTimeAsFileTime@4
.text:00403D93     mov esi, [ebp+SystemTimeAsFileTime.dwHighDateTime]
.text:00403D96     xor esi, [ebp+SystemTimeAsFileTime.dwLowDateTime]
.text:00403D99     call ds:__imp__GetCurrentProcessId@0
.text:00403D9F     xor esi, eax
.text:00403DA1     call ds:__imp__GetCurrentThreadId@0
.text:00403DA7     xor esi, eax
.text:00403DA9     call ds:__imp__GetTickCount@0
.text:00403DAF     xor esi, eax
.text:00403DB1     lea eax, [ebp+PerformanceCount]
.text:00403DB4     push eax
.text:00403DB5     call ds:__imp__QueryPerformanceCounter@4
.text:00403DBB     mov eax, dword ptr [ebp+PerformanceCount+4]
.text:00403DBE     xor eax, dword ptr [ebp+PerformanceCount]
.text:00403DC1     xor esi, eax
.text:00403DC3     cmp esi, edi
.text:00403DC5     jnz short loc_403DCE

次に、私のコードが次の場合:

#include <iostream>

int Foo(int,int){return 4;}

int main(){
    //std::cout<<"\n\nHello.\n\n"<<std::endl;

    int i=Foo(2,4);
    int a=i;
    //system("pause");
return 0;
}

このコードexeの結果から、アセンブリダンプビンにFooが見つからないのはなぜですか?
そこにFooという名前を見つけることができるはずですか?

4

2 に答える 2

2

のような名前Fooは不要であり、結果のEXEに含まれていないため、逆アセンブル時に表示されません。デバッグ情報を使用してコンパイルすると、PDBやMAPファイルにそのような情報が含まれます。また、(システム)DLLからインポートされた関数などの内部関数の処理にも違いがありFooます。逆アセンブラは通常、「内部関数」のデバッグ情報が必要なときに、これらの関数を名前で解決できます。

于 2012-05-06T17:36:58.107 に答える
2

「アセンブル」とは、人間が読める形式の機械命令ニーモニックのセットを、ロードおよび実行可能な実際のバイナリデータに変換することを意味します。同様に、「逆アセンブル」とは、バイナリコードを、熟練したプログラマーが何が起こっているのかを読んで理解できる、人間が読める形式の機械命令ニーモニックのセットに変換することを意味します。

おそらく、高級プログラミング言語を機械語に「コンパイル」することを考えているのでしょう。その反対は、架空の魔法の「逆コンパイラ」です。いくつかの逆コンパイルは確かに可能であり、ツールは存在しますが、コンパイルされたマシンコードのセットから回復できる特定の高級言語の量には常に制限があり、プログラミングのいくつかの層を深く理解しないと難しいでしょうどんなイベントでも結果を理解するために。

一部の言語(C#やJavaなど)は、逆コンパイルと読み取りがかなり簡単なかなり高レベルの中間言語にのみコンパイルされますが、C ++は通常そのような方法で使用されず、C++コンパイラは通常最低レベルのハードウェアマシンを生成しますコード。

于 2012-05-06T17:39:01.923 に答える