2

PE ファイルがあり、その指示を取得するために分解しようとしています。ただし、.textセグメントには命令だけでなくいくつかのデータも含まれていることに気付きました (IDA を使用してそれに気づきました)。次に例を示します。

.text:004037E4                 jmp     ds:__CxxFrameHandler3
.text:004037EA ; [00000006 BYTES: COLLAPSED FUNCTION _CxxThrowException. PRESS KEYPAD "+" TO EXPAND]
.text:004037F0 ;             
.text:004037F0                 mov     ecx, [ebp-10h]
.text:004037F3                 jmp     ds:??1exception@std@@UAE@XZ ; std::exception::~exception(void)
.text:004037F3 ; 
.text:004037F9 byte_4037F9     db 8Bh, 54h, 24h        ; DATA XREF: sub_401440+2o
.text:004037FC                 dd 0F4428D08h, 33F04A8Bh, 0F6B2E8C8h, 0C4B8FFFFh, 0E9004047h
.text:004037FC                 dd 0FFFFFFD0h, 3 dup(0CCCCCCCCh), 0E904458Bh, 0FFFFD9B8h
.text:00403828 dword_403828    dd 824548Bh, 8BFC428Dh, 0C833F84Ah, 0FFF683E8h, 47F0B8FFh
.text:00403828                                         ; DATA XREF: sub_4010D0+2o
.text:00403828                                         ; .text:00401162o
.text:00403828                 dd 0A1E90040h, 0CCFFFFFFh, 3 dup(0CCCCCCCCh), 50E0458Dh
.text:00403828                 dd 0FFD907E8h, 458DC3FFh, 0D97EE9E0h
.text:00403860                 db 2 dup(0FFh)
.text:00403862 word_403862     dw 548Bh

そのようなデータを命令と区別するにはどうすればよいですか? この問題に対する私の解決策は、単純に最初の命令 (アドレスを入力) を見つけて、各命令とすべての呼び出された関数にアクセスすることでした。残念なことに、直接呼び出されないコード ブロックがいくつかありますが、それらのアドレスは.rdata一部のデータの間のセグメントにあり、データと有効な命令アドレスがどのように区別されるかわかりません。

.text要約すると、セグメント内のアドレスにデータまたは命令が含まれているかどうかを判断する方法はありますか? または、どの潜在的なアドレス.rdataを命令アドレスとして解釈し、どれをデータとして解釈するかを決定する方法はありますか?

4

1 に答える 1

1

一般的にはできません。PE ファイルの .text セクションでは、作成者が好きなようにコードと定数を混在させることができます。IDA のようなプログラムは、エントリポイントから始めて逆アセンブルし、どのアドレスがジャンプのターゲットで、どのアドレスが読み取りのターゲットであるかを調べることで、これを理解しようとします。しかし、悪意のあるプログラムは、命令とデータの間で「駄洒落」をすることができます。

于 2013-09-28T15:21:29.690 に答える