绕过winsock recv不会返回任何东西

时间:2013-05-09 18:59:26

标签: c++ dll detours

我将一个dll注入服务器,因为我需要阻止服务器不丢弃的一些坏包。

我的代码片段:

#pragma comment(lib, "detours.lib")
#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "Mswsock.lib")

(...)

int (WINAPI *pRecv)(SOCKET s, char* buf, int len, int flags) = recv;
int WINAPI MyRecv(SOCKET s, char* buf, int len, int flags);

(...)

AllocConsole();
freopen("CONOUT$", "w", stdout);

DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)pRecv, MyRecv);
if(DetourTransactionCommit() == NO_ERROR)
    cout << "[" << MyRecv << "] successfully detoured." << endl;

出于测试目的,我只是打印数据。

int WINAPI MyRecv(SOCKET s, char* buf, int len, int flags)
{

    cout << "[ RECV " << len << " ] ";
    for ( int i = 0; i < len; i++ ) 
    {
         printf( "%02x ", unsigned char (buf[i]) );
    }
    printf( "\n" );

    return pRecv(s, buf, len, flags);
 }

现在我挂了它,它显示[ address ] successfully detoured. 我想一切都是迷上了工作。

现在我去客户端开始发送数据包 例如,我登录,现在将数据包发送到服务器 我成功登录,所以服务器应该收到我发送的数据包。

现在我检查连接到server的控制台,没有任何内容被打印出来 这很奇怪,所以我尝试在服务器上挂钩WPE_PRO并再次开始与客户端通信。现在我发现即使是WPE也无法记录数据包。

这怎么可能?为什么会这样?

我正在尝试在服务器上构建一个数据包记录器/过滤器,以防止丢包 黑客正在使用数据包来破坏我们的服务器。

关于我试图挂钩的应用程序的信息:

It works like a relay server. It receives info from the client then sends it to the right server inside the internal network.

So Client <-> `Application` <-> Servers
So what I'm trying to hook is the Application .

更新

尝试在recv()WSArecv()函数上设置断点,但不会中断。

Address  Ordinal Name                        Library 
-------  ------- ----                        ------- 
004121A8 23      socket                      WS2_32  
004121A4 20      sendto                      WS2_32  
004121E8 3       closesocket                 WS2_32  
0041219C 9       htons                       WS2_32  
004121A0 17      recvfrom                    WS2_32  
004121E4 111     WSAGetLastError             WS2_32  
004121E0 115     WSAStartup                  WS2_32  
004121DC 11      inet_addr                   WS2_32  
004121D8         WSAIoctl                    WS2_32  
004121D4         WSAConnect                  WS2_32  
004121D0 22      shutdown                    WS2_32  
004121CC 12      inet_ntoa                   WS2_32  
004121C8 2       bind                        WS2_32  
004121C4 8       htonl                       WS2_32  
004121B4 16      recv                        WS2_32  
004121BC         WSASocketA                  WS2_32  
004121B8 19      send                        WS2_32  
004121B0         WSAAccept                   WS2_32  
004121AC 13      listen                      WS2_32  
004121C0 21      setsockopt                  WS2_32  

当我检查PE时,只导入了这些dll:

pdh.dll
WS2_32.dll
KERNEL32.dll
USER32.dll
GDI32.dll
WINMM.dll

更新

为了测试我的代码是否有效,我将DLL挂钩到客户端,是的,数据包被记录/打印。确认我的代码有效。 Hmmmm。


更新

还试图绕开ff。

int ( WINAPI *pSend )( SOCKET s, const char *buf, int len, int flags ) = send;
int ( WINAPI *pRecv )( SOCKET s, char *buf, int len, int flags ) = recv;
int ( WINAPI *pRecvFrom )( SOCKET s, char *buf, int len, int flags, sockaddr *from, int *fromlen ) = recvfrom;
int ( WINAPI *pWSARecvEx )( SOCKET s, char *buf, int len, int *flags ) = WSARecvEx;

但仍然没有。


更新

所以我使用wireshark并看到数据包通过 我一直在调试程序,在所有winsock调用中设置断点,但仍然没有任何结果。

0 个答案:

没有答案