2014-02-08 62 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函數在一個小端平臺上都會顛倒整數中的所有單個字節。這兩個函數不需要以不同的方式實現 - 您不必擔心GetProcAddress()返回相同的函數指針。

Ofcourse,你想驗證GetProcAddress不返回一個NULL指針。

+1

好吧。我明白你的意思了。問題是,當解析二進制文件時,我的程序必須區分對htonl的調用和對ntohl的調用!我是依靠這個來獲得一些函數指針:(有沒有辦法知道哪個IAT條目是哪個函數的?原因是在我解析的二進制文件中,兩者都有明顯不同的IAT條目 – Yannick

相關問題