我想写一个钩子(Hook)以打印特定过程的发送/接收的数据(即网络数据,发送和接收的数据包)。
我可以将其挂接的最低级别是什么(也许一个或两个特定功能最终被下面详述的功能在内部调用)?

WS2_32!WSARecv
WS2_32!WSARecvFrom
WS2_32!recv
WS2_32!recvfrom
WS2_32!send
WS2_32!sendto
WS2_32!WSASend
WS2_32!WSASendDisconnect
WS2_32!WSASendMsg
WS2_32!WSASendTo

谢谢

最佳答案

我假设您不想重新发明轮子,因此可以使用类似MinHook https://github.com/TsudaKageyu/minhook/或Microsoft Detours https://www.microsoft.com/en-us/research/project/detours/的挂钩库
minhook的一个小例子

int YourDetourFuncHere(
SOCKET     s,
const char *buf,
int        len,
int        flags
){
  // your code here.
  return RealFunction(s, buf, len, flags);
}
void hookex(){
MH_Initialize();
MH_CreateHook("ws2_32.dll", "send", YourDetourFuncHere, &RealFunction);
MH_EnableHook(MH_ALL_HOOKS);
}

那只是一种伪代码,因为您不应该首先复制和粘贴;),您应该根据libs文档添加更多错误检查。

如果要全局查看所有流量,请使用NDIS驱动程序,然后将数据发送到usermode。您可以在用户模式下创建一个线程,该线程将继续调用ReadFile()并在驱动程序端设置IRP_MJ_READ,并仅从驱动程序获取数据包数据。
同样对于其他浏览器,它可能会有所不同。例如,Firefox可能是PR_Write,其他此类程序或浏览器可能使用不同的协议(protocol)等,因此,根据您的目标,您应该查看希望放置钩子(Hook)的位置。

09-10 03:48