4

私は、作成者が DUMPBIN を使用してエクスポートを一覧表示し、OllyDbg を使用してエクスポートされた関数のアセンブリ コードを取得するチュートリアルに従うのに忙しいです。エクスポート テーブル RVA が逆アセンブリの実際のアドレスに対応していない場合、完全な逆アセンブリで関数コードを見つけるにはどうすればよいでしょうか。

4

3 に答える 3

3

関数、少なくとも高水準言語で書かれたプログラムのかなり良い指標は、スタック フレームを設定するコードです。

問題のコードを生成するために使用されたコンパイラがわかっている場合は、何を探すべきかを見つけることができるはずです。

$ cat main.c
int main(int argc, char **argv) {
        return 1;
}
$ gcc -m32 -S main.c
$ cat main.s 
        .file     "main.c"
        .text
.globl main
        .type    main, @function
main:
        leal     4(%esp), %ecx
        andl     $-16, %esp
        pushl    -4(%ecx)
        pushl    %ebp
        movl     %esp, %ebp
        pushl    %ecx
        movl     $1, %eax
        popl     %ecx
        popl     %ebp
        leal     -4(%ecx), %esp
        ret
        .size    main, .-main
        .ident   "GCC: (Debian 4.3.3-4) 4.3.3"
        .section    .note.GNU-stack,"",@progbits

私の例では、movl %esp, %ebp命令がそのセットアップ コードの最後の命令です。

商用の逆アセンブラーである IDA Pro は、ビールとして無料でダウンロードできるバージョンがあり、関数を自動的に見つけるのに非常に優れています。

于 2009-03-01T13:06:31.073 に答える
3

RVA は再配置可能な仮想アドレスです。プロセス空間で実際のアドレスを見つけるには、プロセスでモジュールがロードされたベースアドレスを知る必要があります。そのベース アドレスを RVA に追加すると、実際のアドレスが得られます。私は ollydbg を使用したことはありませんが、ollydbg がアタッチされたプロセスでロードされたモジュールのベース アドレスを提供していなかったら驚きです。何らかの理由でその情報が提供されない場合は、sysinternal ツールから procexp.exe を使用して取得できます。

于 2009-03-03T06:49:57.047 に答える