2012-05-07 1 views
3

리눅스 x86_64 절대 주소와 관련된 주제를 찾았습니다 : Absolute addressing for runtime code replacement in x86_64. 절대 주소 지정은 리눅스에서 지원되지 않는다고 들었습니다.Windows x64에 가까운 절대 호출 (0xFF 0x15) 주소 지정

windows x64는 절대 호출과 거의 비슷합니까? 창에 대한

은 함수의 주소는이 방법으로 절대 호출 (를 0xFF 0x15) 근처에서 잡아 수 86 :

unsigned char call_nearAbsolute[2] = {0xFF, 0x15}; 

if(memcmp(bytes, call_nearAbsolute, sizeof(call_nearAbsolute)) == 0) { 
{   
    unsigned char offset[] = { 
       *(bytes + 0x5), 
       *(bytes + 0x4), 
       *(bytes + 0x3), 
       *(bytes + 0x2) 
      }; 
     PDWORD_PTR absolute_addr = 
     (PDWORD_PTR)(((offset[0] & 0xFF) << 24) | 
     ((offset[1] & 0xFF) << 16) | 
      ((offset[2] & 0xFF) << 8) | 
     offset[3] & 0xFF); 
} 

이 64에 대해 지원되는 경우, 어떻게 절차 주소를 제대로 얻으려면?

+1

ff 15 xx xx xx xx는 간접 호출 인'call qword ptr [offset]'입니다. * offset *은 명령어 포인터에서 32 비트 부호있는 오프셋입니다. 주소가 지정된 위치의 8 바이트에는 호출 할 함수의 실제 주소가 들어 있습니다. –

+0

은 x64에도 8 바이트가 사용됩니까? – ChatCloud

+0

Erm, 주소는 64 비트 모드에서 8 바이트입니다. –

답변

0

한 명령 (마케팅이나 어떤 바보 같은 이유)에 해당 모드 (아직)에는 절대 전화가 없습니다 사용

MOV rax, address(your routine)' 
CALL rax 

. 언급 된 조합 (필요한 경우 다른 임시 등록자로 대체)을 사용하면 원하는 것을 얻을 수 있습니다. 예측자는 penalty (call 명령 자체)없이 메모리에 배치함으로써 이러한 호출을 식별해야합니다. 첫 번째 전화 벌칙을 테스트하지는 않았지만 간접 주소가있는 호출보다 같거나 낮아야합니다 (올바르게 정렬되었을 때).