C++ C++;Winsock recv钩子绕道

C++ C++;Winsock recv钩子绕道,c++,dll,hook,winsock2,detours,C++,Dll,Hook,Winsock2,Detours,我想写一个.dll。我的Targetapplication是一款游戏,使用winsock。.dll应该在控制台中写入游戏(Targetapplication)通过winsock中的recv函数接收到的所有内容。我在VisualStudio 2012中创建了一个C++ Win32控制台应用程序,专业的、选择的.DLL和空的项目。 main.cpp中的我的代码 #include <Windows.h> #include <detours.h> #include <win

我想写一个.dll。我的Targetapplication是一款游戏,使用winsock。.dll应该在控制台中写入游戏(Targetapplication)通过winsock中的recv函数接收到的所有内容。我在VisualStudio 2012中创建了一个C++ Win32控制台应用程序,专业的、选择的.DLL和空的项目。 main.cpp中的我的代码

#include <Windows.h>
#include <detours.h>
#include <winsock2.h>
#include <iostream>

using namespace std;

#pragma comment (lib, "detours")

typedef int (WINAPI *MyRecv) (SOCKET, char, int, int);

MyRecv OrigRecv = NULL;

int WINAPI RecvDetour(SOCKET s, char *buf, int len, int flags)
{
    cout << *buf << "   -   " << len << endl;
    return OrigRecv(s, *buf, len, flags);
}


BOOL APIENTRY DllMain(HINSTANCE module, DWORD Reason, LPVOID reserved)
{
    switch (Reason)
    {
    case DLL_PROCESS_ATTACH:
        cout << "Starting.." << endl;
        OrigRecv = (MyRecv)DetourFunction((PBYTE)recv, (PBYTE)RecvDetour);
        break;
    case DLL_PROCESS_DETACH:
        break;
    }
}
#包括
#包括
#包括
#包括
使用名称空间std;
#pragma注释(lib,“迂回”)
typedef int(WINAPI*MyRecv)(SOCKET、char、int、int);
MyRecv OrigRecv=NULL;
int WINAPI RecvDetour(套接字s、字符*buf、int len、int标志)
{

cout
MyRecv
声明错误。第二个参数需要是
char*
而不是
char

此外,在填充接收缓冲区之前,您的迂回将输出该缓冲区。您需要先调用原始的
recv()
函数,然后才能输出它接收到的内容。此外,请确保数据不会以null结尾

typedef int (WINAPI *MyRecv) (SOCKET, char*, int, int);

MyRecv OrigRecv = NULL;

int WINAPI RecvDetour(SOCKET s, char *buf, int len, int flags)
{
    int ret = OrigRecv(s, buf, len, flags);
    if (ret > 0)
        cout.write(buf, ret) << "   -   " << ret << endl;
}
typedefint(WINAPI*MyRecv)(SOCKET,char*,int,int);
MyRecv OrigRecv=NULL;
int WINAPI RecvDetour(套接字s、字符*buf、int len、int标志)
{
int ret=原始曲线(s、buf、len、标志);
如果(ret>0)

cout.write(buf,ret)请在您的问题中逐字逐句地发布错误消息。它是德语,但可能有助于复制