我想编写钩子来打印某个进程的发送/接收数据(即网络数据,发送和接收的数据包)。我可以挂钩的最低级别是什么(可能是一个或两个特定的函数,最终由下面详述的函数在内部调用)?
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/或微软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,其他此类程序或浏览器可能使用不同的协议等,因此根据您的目标,您应该查看您希望放置钩子的位置。