0

我试图将自定义 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 周前才开始学习的。谢谢。

4

1 回答 1

1

你在哪里找到这样的例子?

第一行试图定义一个新类型 WSAREC,它是一个指向具有相同签名的函数的指针recv()。不幸的是,它还试图声明一个这种类型的变量来存储recv()函数的地址。typedef 错误,因为该函数缺少返回类型。所以它不能在 Visual Studio 2003 下编译。

你可能有更多的运气使用:

int (WINAPI * WSAREC)( SOCKET s, char *buf, int len, int flags ) = &recv;

它只声明了一个“指向函数的指针”类型的变量,它存储recv().

现在第二个片段是一个与函数具有相同签名的函数,它打印一条消息,然后通过上面声明的函数指针recv()调用原始函数。recv()

此处的代码仅显示如何通过指针调用函数:它不会替换当前进程中的任何内容。

另外,我不确定您是否可以随意干扰另一个进程并替换一个功能。这将对系统的安全构成巨大威胁。但你为什么首先要这样做?

于 2010-02-10T10:21:25.640 回答