聊一聊ws2_32.dll和wsock32.dll
生活随笔
收集整理的這篇文章主要介紹了
聊一聊ws2_32.dll和wsock32.dll
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Wsock32.Dll與Ws2_32.Dll區(qū)別
CSocket在Wsock32.Dll中實(shí)現(xiàn),Socket API在Ws2_32.Dll實(shí)現(xiàn)?
這兩個(gè)Dll是兩個(gè)不同層次的接口,調(diào)用關(guān)系如下:
?網(wǎng)絡(luò)應(yīng)用程序->CSocket(WSock32.Dll)->Socket API(ws2_32.Dll)-> 網(wǎng)絡(luò)傳輸服務(wù)進(jìn)程.?
WSock32.Dll映射mswsock.dll和ws2_32.Dll兩個(gè)文件。ws2_32.Dll是真正的實(shí)現(xiàn)
我們知道,WS2_32.DLL導(dǎo)出了send、sendto、recv、recvfrom、WSASend、WSASendTo、WSARecv和WSARecvFrom,而WSOCK32.DLL也導(dǎo)出了send、sendto、recv、recvfrom函數(shù)(OD只能看到WSOCK32.DLL的recv、recvfrom,用VC的DEPENDS.EXE才能查看到send、sendto)。但MSDN上并沒(méi)有說(shuō)明WSOCK32.DLL里send、sendto、recv、recvfrom函數(shù)的原型,因此我一直認(rèn)為跟WS2_32.DLL里的是完全一樣的。不過(guò)在IE上HOOK的時(shí)候碰到了一些稀奇古怪的問(wèn)題,用OD反匯編一下才發(fā)現(xiàn):
1.WS2_32.DLL和WSOCK32.DLL的默認(rèn)加載地址是一樣的,各自的send、sendto函數(shù)的地址也是完全一樣的,連函數(shù)里所有指令都完全一樣。
2.recv、recvfrom就完全不同了,wsock32.dll的recv調(diào)用了WS2_32.DLL的WSARecv,recvfrom調(diào)用了WS2_32.DLL的WSARecvFrom,這跟WS2_32.DLL的recv、recvfrom完全不用。
因此,HOOK的時(shí)候要注意了!千萬(wàn)不要編寫自己的recv、recvfrom函數(shù)后,為了貪圖方便,就把WS2_32.DLL的recv、recvfrom函數(shù)和WSOCK32.DLL的recv、recvfrom函數(shù)都指向你編寫的對(duì)應(yīng)函數(shù),這樣是會(huì)出問(wèn)題的。由于WS2_32.DLL的WSARecv和WSARecvFrom可用于非阻塞套接字,而WS2_32.DLL的recv、recvfrom函數(shù)只能用于阻塞套接字。WSOCK32.DLL的recv、recvfrom函數(shù)調(diào)用到了WSARecv和WSARecvFrom函數(shù),如果你把WSOCK32.DLL的recv、recvfrom函數(shù)也指向了你編寫的阻塞型recv、recvfrom函數(shù),這會(huì)導(dǎo)致調(diào)用失敗(異常)。錯(cuò)誤信息可能是:無(wú)法在非阻塞套接字上立即完成所需操作。原因是應(yīng)用程序使用非阻塞套接字調(diào)用到了WSOCK32.DLL的recv、recvfrom函數(shù),但被你HOOK之后,跳到了你編寫的阻塞型recv、recvfrom函數(shù)去執(zhí)行,所以導(dǎo)致出現(xiàn)錯(cuò)誤。
IE就是這樣的,它的接收操作調(diào)用流程:
WININET.DLL->WSOCK32.DLL->WS2_32.DLL。
真不懂MS為什么這樣搞。不知道其他win系統(tǒng)是不是也是這樣,我的是XP SP3。
CSocket在Wsock32.Dll中實(shí)現(xiàn),Socket API在Ws2_32.Dll實(shí)現(xiàn)?
這兩個(gè)Dll是兩個(gè)不同層次的接口,調(diào)用關(guān)系如下:
?網(wǎng)絡(luò)應(yīng)用程序->CSocket(WSock32.Dll)->Socket API(ws2_32.Dll)-> 網(wǎng)絡(luò)傳輸服務(wù)進(jìn)程.?
WSock32.Dll映射mswsock.dll和ws2_32.Dll兩個(gè)文件。ws2_32.Dll是真正的實(shí)現(xiàn)
我們知道,WS2_32.DLL導(dǎo)出了send、sendto、recv、recvfrom、WSASend、WSASendTo、WSARecv和WSARecvFrom,而WSOCK32.DLL也導(dǎo)出了send、sendto、recv、recvfrom函數(shù)(OD只能看到WSOCK32.DLL的recv、recvfrom,用VC的DEPENDS.EXE才能查看到send、sendto)。但MSDN上并沒(méi)有說(shuō)明WSOCK32.DLL里send、sendto、recv、recvfrom函數(shù)的原型,因此我一直認(rèn)為跟WS2_32.DLL里的是完全一樣的。不過(guò)在IE上HOOK的時(shí)候碰到了一些稀奇古怪的問(wèn)題,用OD反匯編一下才發(fā)現(xiàn):
1.WS2_32.DLL和WSOCK32.DLL的默認(rèn)加載地址是一樣的,各自的send、sendto函數(shù)的地址也是完全一樣的,連函數(shù)里所有指令都完全一樣。
2.recv、recvfrom就完全不同了,wsock32.dll的recv調(diào)用了WS2_32.DLL的WSARecv,recvfrom調(diào)用了WS2_32.DLL的WSARecvFrom,這跟WS2_32.DLL的recv、recvfrom完全不用。
因此,HOOK的時(shí)候要注意了!千萬(wàn)不要編寫自己的recv、recvfrom函數(shù)后,為了貪圖方便,就把WS2_32.DLL的recv、recvfrom函數(shù)和WSOCK32.DLL的recv、recvfrom函數(shù)都指向你編寫的對(duì)應(yīng)函數(shù),這樣是會(huì)出問(wèn)題的。由于WS2_32.DLL的WSARecv和WSARecvFrom可用于非阻塞套接字,而WS2_32.DLL的recv、recvfrom函數(shù)只能用于阻塞套接字。WSOCK32.DLL的recv、recvfrom函數(shù)調(diào)用到了WSARecv和WSARecvFrom函數(shù),如果你把WSOCK32.DLL的recv、recvfrom函數(shù)也指向了你編寫的阻塞型recv、recvfrom函數(shù),這會(huì)導(dǎo)致調(diào)用失敗(異常)。錯(cuò)誤信息可能是:無(wú)法在非阻塞套接字上立即完成所需操作。原因是應(yīng)用程序使用非阻塞套接字調(diào)用到了WSOCK32.DLL的recv、recvfrom函數(shù),但被你HOOK之后,跳到了你編寫的阻塞型recv、recvfrom函數(shù)去執(zhí)行,所以導(dǎo)致出現(xiàn)錯(cuò)誤。
IE就是這樣的,它的接收操作調(diào)用流程:
WININET.DLL->WSOCK32.DLL->WS2_32.DLL。
真不懂MS為什么這樣搞。不知道其他win系統(tǒng)是不是也是這樣,我的是XP SP3。
總結(jié)
以上是生活随笔為你收集整理的聊一聊ws2_32.dll和wsock32.dll的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 替换系统wsock32.dll,实现封包
- 下一篇: C/C++函数调用约定