WinAPI函数挂钩以捕获网络

问题描述 投票:1回答:1

我想编写钩子来打印某个进程的发送/接收数据(即网络数据,发送和接收的数据包)。我可以挂钩的最低级别是什么(可能是一个或两个特定的函数,最终由下面详述的函数在内部调用)?

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

谢谢

c++ c windows winapi windbg
1个回答
0
投票

我假设你不想重新发明轮子,所以得到像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,其他此类程序或浏览器可能使用不同的协议等,因此根据您的目标,您应该查看您希望放置钩子的位置。

© www.soinside.com 2019 - 2024. All rights reserved.