我试图将一个自定义的recv()winsock2.0方法挂钩到远程进程,以便我的函数执行而不是进程中的那个,我一直在谷歌搜索这个,我发现了一些非常好的例子,但是他们缺乏描述
typedef (WINAPI * WSAREC)( SOCKET s, char *buf, int len, int flags ) = recv;
现在我的问题是,这是什么意思,或者是什么,这是某种指向真正的recv()函数的指针?
然后是自定义函数的另一段代码
int WINAPI Cus_Recv( SOCKET s, char *buf, int len, int flags )
{
printf("Intercepted a packet");
return WSAREC( s, buf, len, flags ); // <- What is this?
}
对不起,如果这些问题听起来很基本,我只在2或3周前开始学习。 感谢。
答案 0 :(得分:1)
第一行尝试定义一个新类型WSAREC,它是一个指向与recv()
具有相同签名的函数的指针。不幸的是,它也试图声明这种类型的变量来存储recv()
函数的地址。 typedef是错误的,因为函数缺少返回类型。所以它不能在Visual Studio 2003下编译。
你可能会有更多运气:
int (WINAPI * WSAREC)( SOCKET s, char *buf, int len, int flags ) = &recv;
,它只声明一个“指向函数的指针”类型的变量,它存储recv()
的地址。
现在第二个片段是一个与recv()
函数具有相同签名的函数,它打印一条消息,然后通过上面声明的函数指针调用原始recv()
。
此处的代码仅显示如何通过指针调用函数:它不会替换当前进程中的任何内容。
另外,我不确定您是否可以干扰其他过程并根据您的意愿更换一个功能。这将是对系统安全的巨大威胁。但是你为什么要这样做呢?