纯Win32 API挂钩Chrome/IE浏览器Socket读写流量功能失效求助
Socket Hook代码问题排查与修复方案
核心错误点
- 字符串类型强制转换错误:
GetModuleHandle((LPCWSTR)lpModule)属于非法强制转换,ANSI字符串强转为宽字符串后会产生乱码,无法正确定位ws2_32.dll模块,导致钩子安装完全失败。应当调用ANSI版本API改为GetModuleHandleA(lpModule)。 - 64位兼容性缺失:使用
DWORD存储内存地址,64位系统下地址长度为8字节,DWORD仅能存储4字节会直接截断地址,跳转计算完全错误。当前主流Chrome、IE默认都是64位版本,这也是你抓不到包的核心原因之一。 - DllMain违规操作:DLL入口点中不允许执行
AllocConsole、文件IO、钩子安装这类非安全API,非常容易触发加载死锁,导致DLL注入直接失败。 - 跳转指令覆盖错误:32位相对跳转仅需要5字节(0xE9 + 4字节偏移),你额外加的0xC3会覆盖原函数第6字节,大概率破坏原函数的指令完整性,执行时直接触发异常。
- 路径转义错误:日志路径
C:\tmp\log.txt中的反斜杠没有转义,实际运行时会被解析为转义字符,无法找到正确路径,即使抓到包也无法写入日志。 - API覆盖不全:当前主流浏览器大多使用
WSASend、WSARecv这类 Winsock 扩展API收发数据,仅Hook传统的send/recv无法覆盖全部调用场景。 - 多线程安全缺失:全局钩子数组、文件流对象没有加锁,多线程并发调用Socket API时会出现竞争,轻则钩子失效重则进程崩溃。
修复建议
- 修正API调用的字符串类型问题,所有ANSI字符串参数对应调用带A后缀的Win32 API。
- 适配64位系统,地址变量改用
DWORD_PTR类型,64位下使用14字节的绝对跳转指令实现Hook,避免跨模块跳转超出相对寻址范围。 - DllMain仅保留线程创建逻辑,所有初始化、钩子安装操作都放到独立的工作线程中执行,避免加载死锁。
- 调整Hook字节长度,32位下仅覆盖前5字节即可,Hook前先校验原函数开头指令长度,避免截断半条指令。
- 修正日志路径转义为
C:\\tmp\\log.txt,提前确保C:\tmp目录存在,或者将日志写入进程有访问权限的目录。 - 补充Hook
WSASend、WSARecv、sendto、recvfrom等常用Socket API,覆盖更多收发场景。 - 添加临界区保护Hook/UnHook操作、文件写入操作,避免多线程竞争问题。
内容的提问来源于stack exchange,提问作者T Shoats
相关产品推荐
相关产品推荐

