首页
社区
课程
招聘
[求助]再问 WSARecv函数问题
发表于: 2015-5-15 10:48 8660

[求助]再问 WSARecv函数问题

2015-5-15 10:48
8660
MSDN:
int WSARecv(
  _In_    SOCKET                             s,
  _Inout_ LPWSABUF                           lpBuffers,
  _In_    DWORD                              dwBufferCount,
  _Out_   LPDWORD                            lpNumberOfBytesRecvd,
  _Inout_ LPDWORD                            lpFlags,
  _In_    LPWSAOVERLAPPED                    lpOverlapped,
  _In_    LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);

typedef struct __WSABUF {
  u_long   len;
  char FAR *buf;
} WSABUF, *LPWSABUF;

问题1:
一个登陆程序。输入账号和密码后。
bp WSARecv后,程序断下来,查看内存lpBuffers,第5个字节( char FAR *buf)开始才是真正的接收数据内存。
可是就是当我先查看lpBuffers,然后查看( char FAR *buf)的内存地址。然后我程序F9继续执行的时候,程序已经跑飞了。
我要关注WSARecv接收的数据,关注它接收到数据后怎么用的。该怎么来调试呢?

问题2:
另外:我用Detours 3.0 Hook   WSARecv,接收数据后,我把数据写进文件。也会导致无法登陆。不写文件就可以正常登陆。
pWSARECV pMS_WSARecv = WSARecv;//真正的库函数

int WINAPI MyWSARecv( //我的Hook函数
	_In_    SOCKET                             s,
	_Inout_ LPWSABUF                           lpBuffers,
	_In_    DWORD                              dwBufferCount,
	_Out_   LPDWORD                            lpNumberOfBytesRecvd,
	_Inout_ LPDWORD                            lpFlags,
	_In_    LPWSAOVERLAPPED                    lpOverlapped,
	_In_    LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
	)
{

	int iRet = pMS_WSARecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionRoutine);


	for (int i = 0; i < dwBufferCount; i++)
	{
		WSABUF *pWSABUF = (lpBuffers + sizeof(WSABUF)*i);
                
               //把接收的数据写文件
              //注释词句,登陆程序正常登陆,不注释,被Hook的程序(远程线程注入的方式Hook)就无法正常登陆了
		WriteCurrentFile(HookFileName::pHookDataFile, NULL, 0, pWSABUF->buf, pWSABUF->len, 2);

	}

	return iRet;
}



[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 1392
活跃值: (5177)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
2
1 问题 WSA 异步 你立马拿到的数据 一般是无效数据。
解决方案 需要HOOK GetOverlappedresult或者他使用的其他的等待函数

2 你原来的函数结束后调用了其他API 导致WSASetLastError 修改了Error值。导致后面逻辑错误
解决方案  pMS_WSARecv以后 立刻调用 WSAGETLastError 保存 Error值 在 return iRet; 之前用WSASetLastError设置回去。

PS 麻烦看看MSDN 关于函数的解释,MSDN都不看就开始HOOK。
2015-5-15 11:20
0
雪    币: 1
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
再请教下,已知它使用了WSAGetOverlappedResult这个函数。该怎么Hook它,方便调试呢?
谢谢
2015-5-15 14:29
0
雪    币: 1
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这次我是看了MSDN。

WSAGetOverlappedResult return value is TRUE. This means that the overlapped operation has completed .  returns FALSE, this means that either the overlapped operation has not completed, the overlapped operation completed but with errors

但是还是不清楚该怎么按你说的Hook WSAGetOverlappedResult 或者其他等待的函数,来使我说的,已查看数据就跑飞的情况
2015-5-15 14:38
0
雪    币: 261
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
WSABUF *pWSABUF = (lpBuffers + sizeof(WSABUF)*i);
这样必然有问题啊。。
2015-5-15 18:08
0
雪    币: 1
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
确实有问题
应该为WSABUF *pWSABUF = (WSABUF *)((char*)lpBuffers + sizeof(WSABUF)*i);
感谢提醒
2015-5-15 18:48
0
雪    币: 255
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习了 大神教训的是
2015-5-17 12:41
0
雪    币: 1392
活跃值: (5177)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
8
尼玛 老子要举报你了 我草~~~~~~
2015-5-17 13:20
0
雪    币: 1
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
什么情况?

这个程序用的完成端口进行收发数据,调得好dantong.....
2015-5-17 22:59
0
游客
登录 | 注册 方可回帖
返回
//