我使用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 /) –