htonl和ntohl在windows中有相同的地址吗?

问题描述:

我依靠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()混淆在一起,程序无法发挥作用并且变得疯狂。

有什么想法?会有办法规避这种情况吗?解释?

谢谢!

当然,为什么不呢。所有的ntohl和htonl函数在一个小端平台上都会颠倒整数中的所有单个字节。这两个函数不需要以不同的方式实现 - 您不必担心GetProcAddress()返回相同的函数指针。

Ofcourse,你想验证GetProcAddress不返回一个NULL指针。

+1

好吧。我明白你的意思了。问题是,当解析二进制文件时,我的程序必须区分对htonl的调用和对ntohl的调用!我是依靠这个来获得一些函数指针:(有没有办法知道哪个IAT条目是哪个函数的?原因是在我解析的二进制文件中,两者都有明显不同的IAT条目 – Yannick