2013-09-28 4 views
2

У меня есть файл PE, и я пытаюсь разобрать его, чтобы получить его инструкции. Однако я заметил, что сегмент .text содержит не только инструкции, но и некоторые данные (я использовал IDA, чтобы заметить это). Вот пример:Как разузнавать инструкции из данных в сегменте .text файла PE?

.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:[email protected]@@[email protected] ; 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 следует интерпретировать как адреса инструкций и какие данные?

ответ

1

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

+0

Таким образом, единственные инструкции, которые я могу быть уверенными в правильной демонтаже, - это те, которые доступны из точки входа? –

+0

@AdamSznajder: единственные инструкции, которые вы можете быть уверены *, - это те, которые на самом деле * выведены * процессором при определенном запуске программы. Для всего остального вы должны делать предположения. –