2014-02-08 1 views
0

GetProcAddress()를 사용하여 일부 함수에 대한 후킹을 사용합니다. 나는 끔찍한 결과를 얻었고 솔직히 말해서 나는 어떤 일이 일어나고 있는지 정말로 모른다.htonl과 ntohl은 Windows에서 같은 주소를 가지고 있습니까?

이 코드는 "무엇을 말해 줍니까?" :

int main(void) 
{ 
    HMODULE ws32 = LoadLibrary("WS2_32.DLL"); 
    if (GetProcAddress(ws32, "ntohl") == GetProcAddress(ws32, "htonl")) 
     printf("WHAT THE HELL\n"); 

    return 0; 
} 

왜 ntohl 누군가가 나를 설명 할 수와 같은 절대 주소가 htonl? 문제는 DLL에 연결하여 DLL 내부에서 일부 처리를 수행 할 때 PE 가져 오기 테이블 (PE IAT 구문 분석), ntohl() 및 htonl()이 다른 주소를 가지고 있음이 분명합니다. (IAT 내부 말했다).

이렇게하면 내 프로그램이 쓸모 없게됩니다. ntohl()은 htonl()과 혼란 스럽습니다. 그리고 프로그램은 차이를 만들 수없고 미치게됩니다.

의견이 있으십니까? 이것을 피할 수있는 방법이 있을까요? 설명?

감사합니다.

답변

2

물론 그렇습니다. 모든 ntohl 및 htonl 함수는 little endian 플랫폼에서 정수의 모든 개별 바이트를 뒤집는 것입니다. 이 두 함수를 다르게 구현할 필요가 없습니다. GetProcAddress()가 동일한 함수 포인터를 반환한다고 걱정할 필요가 없습니다.

물론, GetProcAddress가 NULL 포인터를 반환하지 않는지 확인하고 싶을 것입니다.

+1

음. 무슨 뜻인지 알 겠어. 문제는 바이너리를 파싱 할 때 내 프로그램이 htonl에 대한 호출과 ntohl에 대한 호출을 구별해야한다는 것이다. 내가 어떤 함수 포인터를 얻기 위해 의존했다 : (어떤 IAT 엔트리가 어떤 함수인지를 알 수있는 방법이 있는가? 나는 해석 한 바이너리에서 둘 다 명확하게 다른 IAT 엔트리를 가지고있다. – Yannick

관련 문제