2014-09-05 3 views
-2

저는 단지 0x3C를 더하려고했지만 컴파일러가 0x0F0으로 변환하려고합니다. 왜??컴파일 후 이상한 어셈블리 코드가 생성되었습니다.

을 kernel32_base

DWORD * 그리고 여기에 C 코드와 desassembled 코드 :

DWORD PE_shift=NULL; 
00DB212E mov   dword ptr [PE_shift],0 
    PE_shift = *(kernel32_base + 0x3C); //60=3Ch 
00DB2135 mov   eax,dword ptr [kernel32_base] 
00DB2138 mov   ecx,dword ptr [eax+0F0h] ; <----------------- 
00DB213E mov   dword ptr [PE_shift],ecx 

는 함수에 인수로 전달되는 kernel32_base 선언이다 0F0h는 어디서 오는거야? 0x3C가 맞아야합니까?

답변

1

DWORD은 4 바이트 유형이기 때문에. 귀하의 C 코드는 기본 포인터 뒤에 0x3C 번째 4 바이트 수량을로드 말한다. 40x3C0xF0입니다. 당신이 바이트의 DWORD0x3C을 상쇄 얻고 싶은 경우에, 그것은 할 필요가 :

PE_shift = *(DWORD*)((char*)kernel32_base + 0x3C); 
+0

MMMMM 흥미 롭군요. kernel32_base에 저장된 주소에 0x3C를 더한 다음 어떻게해야합니까? 감사합니다 – user1618465

+0

달콤한! 훌륭하게 작동합니다. PD : 두 개의 네거티브 투표가 이미 있습니까? 감사합니다 ( – user1618465

+0

3 분을 기다려야합니다. 가능한 한 빨리 받아 들일 것입니다.) 다시 한 번 감사드립니다. – user1618465

관련 문제