2017-01-19 80 views
0

我使用MS彎路,我希望得到ConnectEx()指針,但負荷運行時,如何讓指針與MS走彎路使用?如何獲取ConnectEx()指針

+0

[凡ConnectEx定義?](HTTP://計算器.com/questions/10967516 /) –

回答

0

ConnectEx()不是導出的DLL函數。每ConnectEx()文檔:

注意ConnectEx功能的函數指針必須在運行時通過調用與SIO_GET_EXTENSION_FUNCTION_POINTER操作碼WSAIoctl函數指定獲得。傳遞給WSAIoctl函數的輸入緩衝區必須包含WSAID_CONNECTEX,這是一個全局唯一標識符(GUID),其值標識ConnectEx擴展函數。成功時,WSAIoctl函數返回的輸出包含指向ConnectEx函數的指針。 在Mswsock.h頭文件中定義。

例如:

#include <winsock2.h> // Must be included before Mswsock.h 
#include <mswsock.h> 

#pragma comment(lib, "ws2_32.lib") 

... 

LPFN_CONNECTEX GetConnectExPtr(SOCKET s) 
{ 
    LPFN_CONNECTEX lpConnectEx = NULL; 
    GUID guid = WSAID_CONNECTEX; 
    DWORD dwNumBytes = 0; 
    WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid, sizeof(guid), &lpConnectEx, sizeof(lpConnectEx), &dwNumBytes, NULL, NULL); 
    return lpConnectEx; 
} 

一旦你有一個指針ConnectEx(),你可以繞路了。根據MSDetours的版本,您正在使用,您可以:

使用DetourFunction()

#include <winsock2.h> // Must be included before Mswsock.h 
#include <mswsock.h> 
#include <detours.h> 

#pragma comment(lib, "ws2_32.lib") 
#pragma comment(lib, "detours.lib") 

... 

LPFN_CONNECTEX Real_ConnectEx = NULL; 
LPFN_CONNECTEX Trampoline_ConnectEx = NULL; 

BOOL WINAPI MyConnectEx(SOCKET s, const struct sockaddr *name, int namelen, PVOID lpSendBuffer, DWORD dwSendDataLength, LPDWORD lpdwBytesSent, LPOVERLAPPED lpOverlapped) 
{ 
    // do something... 
    return Trampoline_ConnectEx(s, name, namelen, lpSendBuffer, dwSendDataLength, lpdwBytesSent, lpOverlapped); 
} 

... 

SOCKET s = ...; 
Real_ConnectEx = GetConnectExPtr(s); 
if (Real_ConnectEx) 
{ 
    Trampoline_ConnectEx = (LPFN_CONNECTEX) DetourFunction((PBYTE)Real_ConnectEx, (PBYTE)MyConnectEx); 
} 

... 

if (Trampoline_ConnectEx) 
    DetourRemoveTrampoline(Trampoline_ConnectEx); 

使用DetourAttach/Ex()

#include <winsock2.h> // Must be included before Mswsock.h 
#include <mswsock.h> 
#include <detours.h> 

#pragma comment(lib, "ws2_32.lib") 
#pragma comment(lib, "detours.lib") 
#pragma comment(lib, "detoured.lib") 

... 

LPFN_CONNECTEX Real_ConnectEx = NULL; 
LPFN_CONNECTEX Trampoline_ConnectEx = NULL; 

BOOL WINAPI MyConnectEx(SOCKET s, const struct sockaddr *name, int namelen, PVOID lpSendBuffer, DWORD dwSendDataLength, LPDWORD lpdwBytesSent, LPOVERLAPPED lpOverlapped) 
{ 
    // do something... 
    return Trampoline_ConnectEx(s, name, namelen, lpSendBuffer, dwSendDataLength, lpdwBytesSent, lpOverlapped); 
} 

... 

SOCKET s = ...; 
Real_ConnectEx = GetConnectExPtr(s); 
if (Real_ConnectEx) 
{ 
    DetourTransactionBegin(); 
    DetourUpdateThread(GetCurrentThread()); 

    // using DetourAttach()... 
    Trampoline_ConnectEx = Real_ConnectEx; 
    DetourAttach((PVOID*)&Trampoline_ConnectEx, MyConnectEx); 

    // using DetourAttachEx()... 
    // DetourAttachEx(&Real_ConnectEx, MyConnectEx, (PDETOUR_TRAMPOLINE*)&Trampoline_ConnectEx, NULL, NULL); 

    DetourTransactionCommit(); 
} 

... 

if ((Real_ConnectEx) && (Trampoline_ConnectEx)) 
{  
    DetourTransactionBegin(); 
    DetourUpdateThread(GetCurrentThread()); 

    // if using DetourAttach()... 
    DetourDetach((PVOID*)&Trampoline_ConnectEx, MyConnectEx); 

    // if using DetourAttachEx()... 
    // DetourDetach((PVOID*)&Real_ConnectEx, MyConnectEx); 

    DetourTransactionCommit(); 
} 
+0

是的,但是,如何在運行時獲取指針? –

+0

我已經爲你添加了一個例子(你可以通過網絡搜索來找到這些信息,它很容易找到,並且已經多次發佈在StackOverflow上)。 –

+0

非常感謝,我也發現了代碼,但我不知道如何應用到MS Destour中。 –