我使用MS彎路,我希望得到ConnectEx()指針,但負荷運行時,如何讓指針與MS走彎路使用?如何獲取ConnectEx()指針
回答
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();
}
是的,但是,如何在運行時獲取指針? –
我已經爲你添加了一個例子(你可以通過網絡搜索來找到這些信息,它很容易找到,並且已經多次發佈在StackOverflow上)。 –
非常感謝,我也發現了代碼,但我不知道如何應用到MS Destour中。 –
- 1. 指針指針,我如何獲取值?
- 2. 如何根據指針地址獲取指針內容
- 3. 獲取指針值
- 4. 如何獲取指針顏色按鈕
- 5. 如何獲取Java中的新指針?
- 6. 如何在Haskell中獲取指針值?
- 7. 如何獲取指針名稱
- 8. 如何從雙指針獲取值?
- 9. 如何獲取指南針方向
- 10. 如何獲取列表的指針?
- 11. 如何獲取片段的指針
- 12. 獲取指針字符指針的地址字符指針
- 13. 獲取智能指針的指針指針
- 14. 如何獲得wxmenu指針
- 15. 設置獲取指針
- 16. asm.js - 獲取指針的值
- 17. Javascript獲取指針功能
- 18. 獲取函數指針
- 19. 獲取指針的成員
- 20. 獲取指針位置
- 21. 獲取CallInst的指針?
- 22. 獲取指針的地址
- 23. 獲取空指針異常
- 24. 獲取C++指針c#
- 25. 獲取指針的子串
- 26. 如何獲得該指針指針指向的值的地址
- 27. 獲取void *的指針升壓任何
- 28. 如何獲取指向MSVC中二進制節的指針?
- 29. 如何獲取指向結構的指針數組?
- 30. 如何獲取指向IShellView2接口的指針
[凡ConnectEx定義?](HTTP://計算器.com/questions/10967516 /) –