나는 PE 파일을 가지고 있으며 지침을 얻기 위해 그것을 분해하려고한다. 그러나 .text
세그먼트에는 지침뿐만 아니라 일부 데이터 (IDA를 사용하여이를 알았습니다)가 포함되어 있습니다. 예를 들면 다음과 같습니다.PE 파일의 .text 세그먼트에있는 데이터의 지침을 모호하게하는 방법은 무엇입니까?
.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
지침과 어떻게 구별 할 수 있습니까? 이 문제에 대한 나의 해결책은 단순히 첫 번째 명령 (주소 입력)을 찾고 각 명령과 모든 호출 된 함수를 방문하는 것이 었습니다. Unfortunatelly 그것은 직접 호출되지 않은 코드 블록이 있지만 그 주소가 일부 데이터 사이에 .rdata
세그먼트에 있고 데이터에서 뚜렷한 유효 명령 주소가 어떻게 될지 전혀 알지 못합니다.
요약 : .text
세그먼트의 일부 주소에 데이터 또는 지침이 포함되어 있는지 여부를 판단 할 수있는 방법이 있습니까? 또는 .rdata
의 잠재적 인 주소를 지침 주소로 해석해야하고 데이터로 사용할 주소를 결정할 방법이 있습니까?
그래서 제대로 분해 할 수있는 유일한 지침은 진입 점에서 액세스 할 수있는 지침입니까? –
@AdamSznajder : 당신이 * 할 수있는 유일한 지침은 프로그램의 특정 실행에서 CPU에 의해 실제로 발췌 된 명령입니다. 그 외 모든 것에 대해서는 가정을해야합니다. –