Как устранить неоднозначность инструкций из данных в сегменте .text PE-файла?

У меня есть 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 следует интерпретировать как адреса инструкций, а какие — как данные?


person Adam Sznajder    schedule 28.09.2013    source источник


Ответы (1)


Вы не можете, в общем. Раздел .text PE-файла может смешивать код и константы так, как захочет автор. Такие программы, как IDA, пытаются понять это, начиная с точек входа, а затем дизассемблируя и наблюдая, какие адреса являются целевыми для переходов, а какие для чтения. Но коварные программы могут «каламбурить» между инструкциями и данными.

person bmargulies    schedule 28.09.2013
comment
Значит, единственные инструкции, в правильности дизассемблирования которых я могу быть уверен, — это те, которые доступны из точки входа? - person Adam Sznajder; 28.09.2013
comment
@AdamSznajder: единственные инструкции, в которых вы можете быть уверены, — это те, которые фактически выполняются процессором при конкретном запуске программы. Для всего остального приходится делать предположения. - person Igor Skochinsky; 07.10.2013