2013-09-28 4 views
2

나는 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의 잠재적 인 주소를 지침 주소로 해석해야하고 데이터로 사용할 주소를 결정할 방법이 있습니까?

답변

1

일반적으로 할 수 없습니다. PE 파일의 .text 섹션은 작성자가 좋아하는 방식으로 코드와 상수를 혼합 할 수 있습니다. IDA와 같은 프로그램은 엔트리 포인트로 시작한 다음 해체하고 점프 대상이되는 주소와 읽은 대상을 확인하여이를 이해하려고합니다. 그러나 독창적 인 프로그램은 지침과 데이터간에 '말장난'을 할 수 있습니다.

+0

그래서 제대로 분해 할 수있는 유일한 지침은 진입 점에서 액세스 할 수있는 지침입니까? –

+0

@AdamSznajder : 당신이 * 할 수있는 유일한 지침은 프로그램의 특정 실행에서 CPU에 의해 실제로 발췌 된 명령입니다. 그 외 모든 것에 대해서는 가정을해야합니다. –