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