首页
社区
课程
招聘
请教下论坛大神,HOOK ConnectEx,我这里为什么老错啊。
发表于: 2016-9-17 21:17 4426

请教下论坛大神,HOOK ConnectEx,我这里为什么老错啊。

2016-9-17 21:17
4426
论坛大神们帮忙看下,这个HOOK哪里有问题
用的是微软的detours HOOK库,HOOK普通的Connect完全没问题。

LPFN_CONNECTEX lpfnConnectEx = NULL;

int (WINAPI *ConnectEx)(
SOCKET s,
const struct sockaddr* name,
int namelen,
PVOID lpSendBuffer,
DWORD dwSendDataLength,
LPDWORD lpdwBytesSent,
LPOVERLAPPED lpOverlapped
) = lpfnConnectEx;

int WINAPI HookConnectEx(
__in          SOCKET s,
__in          const struct sockaddr* name,
__in          int namelen,
__in_opt      PVOID lpSendBuffer,
__in          DWORD dwSendDataLength,
__out         LPDWORD lpdwBytesSent,
__in          LPOVERLAPPED lpOverlapped
)
{
        sockaddr_in saddr = *((SOCKADDR_IN*)name);

        int nHostPort = ntohs(saddr.sin_port);
        char* p = inet_ntoa(saddr.sin_addr);
        char lpszHostAddress[80] = { 0 };
        strcpy(lpszHostAddress, p);
//这里调用自身的API code......
        OutputDebugString(lpszHostAddress);
}

                              DetourTransactionBegin();
                DetourUpdateThread(GetCurrentThread());
                DetourAttach(&(PVOID&)ConnectEx, HookConnectEx);
                DetourTransactionCommit();

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
做HOOK ,  获取到的输入输出参数, 都检查好

栈上的数据还好, 但指针之类的 , 一定要特别检查

btw:

好歹描述下问题现象嘛

这样丢一段代码  问人哪里有问题    这等于是要求别人一点点看你代码  虽然代码不多  但多数人还是不会给你看的  比如我就没看
2016-9-18 00:20
0
雪    币: 261
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
因为从导入表拿的地址不是connectex真正的地址
自己调用WSAIoctl拿地址吧
2016-9-18 07:06
0
雪    币: 1392
活跃值: (5162)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
4
你的关键点错了

关键点在于 connectex 一般是非阻塞的。最后通过setlasterror设置了err=WSAEWOULDBLOCK

后续逻辑通过getlasterror得到这个err。说明处于BLOCK状态,是正常的。
楼主在调用原函数之后。又调用了一些函数。这些函数将lasterror重新设置为OK。导致后续逻辑判断错误。

在调用原connectex函数之后 应该立即使用getlasterror保存这个error值。
再继续调用其他函数。比如outputdebugstring.
在return之前 使用setlasterror将该错误值恢复。
2016-9-18 13:44
0
雪    币: 261
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
有理,我没注意到lpfnConnectEx的存在,我的错……
然而我还是觉得根本没有hook到
你看下面的代码

LPFN_CONNECTEX lpfnConnectEx = NULL;
int (WINAPI *ConnectEx)(
SOCKET s,
const struct sockaddr* name,
int namelen,
PVOID lpSendBuffer,
DWORD dwSendDataLength,
LPDWORD lpdwBytesSent,
LPOVERLAPPED lpOverlapped
) = lpfnConnectEx;

ConnectEx被赋值成NULL了
DetourAttach(&(PVOID&)ConnectEx, HookConnectEx);
这里就出错了吧?
2016-9-18 16:59
0
雪    币: 1392
活跃值: (5162)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
6
我相信楼主应该没这么蠢。应该是省略了一些wsaioctl获取的代码。
2016-9-18 18:05
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主你怎么解决这个问题的啊,我也遇到了,不知道怎么办啊,请指教!
2017-5-26 15:30
0
游客
登录 | 注册 方可回帖
返回
//