在跟踪 recv 函数在 Windows 上的工作方式时,我观察到以下跟踪:
...
0x743817d2 push eax C:\windows\system32\WSOCK32.dll recv
0x743817d3 push dword ptr [ebp+0x8] C:\windows\system32\WSOCK32.dll recv
0x743817d6 call 0x7438193e C:\windows\system32\WSOCK32.dll recv
0x7438193e jmp dword ptr [0x74381000] C:\windows\system32\WSOCK32.dll setsockopt
0x77287089 mov edi, edi C:\windows\syswow64\WS2_32.dll WSARecv
0x7728708b push ebp C:\windows\syswow64\WS2_32.dll WSARecv
0x7728708c mov ebp, esp C:\windows\syswow64\WS2_32.dll WSARecv
...
不幸的是,我再次发现它很奇怪。首先,有一个直接调用:
call 0x7438193e
里面recv。我仍然不明白为什么会这样:由于WSOCK32.dll(包含recv)将在用户空间中“任意”加载,如何recv保证setsockopt位于该地址?
其次,我看不到应用程序中的任何地方(这里是 wget)可以修改 at 0x74381000(即jmpinside的目标)的内存setsockopt,因此通常该地址处的值始终为始终0x77287089,这意味着recv始终调用WSARecv(!!!)。我怀疑这不是真的,因为没有官方文件(即 MSDN)这样说。
非常感谢您的任何考虑。