上面说了,使用SOCK_RAW 截获报文受挫,因此考虑直接拦截通过send、recv 处理的数据。
总的说来,有3 种方法:
1,动态修改send、recv 开始的代码,跳转到自己写的处理函数中;
2,使用DetoursAPI;
3,修改IATEntry;
因为开始参考了
http://wenku.baidu.com/view/7f4928a30029bd64783e2c99.html
这篇文章,就使用第1 种方法了。
写完代码,编译运行,出现内存访问错误。
考虑到多线程问题,添加线程同步保护。
依然有错,调试发现从替代函数返回后出错,应该是调用方式的问题。
查SDK 头文件,这两个函数调用方式竟然是 WSAAPI,也就是PASCAL,晕菜。
于是替换函数与其改为一致。
运行,貌似能多运行一会,但还是会出错。
查看日志文件,发现其中的记录也不太正常。
在调用完send 或recv 后的一句输出是乱码。
还是栈被破坏了!
想一想。。。
想到了,矮油,用来调用原函数的函数指针类型定义没改。
于是也加上WSAAPI,重新生成运行,一切OK。