recv 中的定向调用

逆向工程 二元分析 调试
2021-06-30 13:38:41

在跟踪 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)这样说。

非常感谢您的任何考虑。

1个回答

recv 怎么知道setsockopt 位于这个地址?

函数的相对虚拟地址setsockoptWSOCK32.dll的导出表中,因此您的反汇编器/调试器足够智能,可以将虚拟地址0x74381000与 的相对虚拟地址相匹配setsockopt

“接收总是调用 WSARecv”

没错;在 Winsock 中,recvWSARecv.