2015-06-21 174 views
-2

我想寫一個.dll。我的Targetapplication是一款遊戲,使用winsock。 .dll應該將所有內容寫在控制檯中,通過winsock中的recv函數來實現遊戲(Targetapplication)。我在Visual Studio 2012 Professional中創建了一個C++ Win32控制檯應用程序,選擇了.dll和Empty項目。C++ Winsock recv hook Detours

我的代碼在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; 
    } 
} 

我不能夠編譯此。有一些錯誤。有人在這段代碼中看到錯誤嗎?

非常感謝:)

+3

POST錯誤消息請。 –

+0

它的德語,但也許它是幫助http://pastebin.com/KnSahAeZ – prophet

+0

可能重複http://stackoverflow.com/questions/19062091/detour-hook-send-recv-winsock –

回答

0

MyRecv被聲明爲錯誤。第二個參數需要是char*而不是char

此外,您的繞道在輸出接收緩衝區之前已經填充。您需要先調用原始的recv()函數,然後才能輸出接收到的內容。另外,一定要考慮到數據不會被終止。

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; 
} 

看到這個早些時候的問題:逐字在你的問題

Detour hook send/recv winsock