读书人

满分请问!实在解决不了了特来.

发布时间: 2012-03-09 16:54:57 作者: rapoo

满分请教!!!实在解决不了了特来求助...
HOOK 的 WSASEND函数

对lpBuffers.buf 数据进行修改后发送

如果修改后的数据长度小于或等于原来的长度,发送一切正常,程序无任何问题

但是如果修改后的数据大于原数据长度,发送也是正常的(接收端接收到了完整的数据包),但是程序就不再继续发包了...

不知道大家看明白没有。。。

百度 谷歌翻遍了 遇到此问题的也不在少数 但没找到答案

希望高人解答。。。



[解决办法]
那可能是接收方做了数据验证,发现数据有异常,导致程序中断
[解决办法]
不知道!
帮顶下!
[解决办法]
你是找找於madCodeHook方面的。。。有有没有madCHook.dll文件...
[解决办法]
var
pData, pOldData:PChar;
dwLen, dwOldLen:DWORD;
bDataChanged:Boolean;
begin
bDataChanged := False;
//多个包的情况,不改变。因为。。。。危险 。
if dwBufferCount=1 then
begin
//太大的包也不处理
pData := nil;
if LPWSABUFS(lpBuffers)[0].len<=1500 then
begin
dwLen := LPWSABUFS(lpBuffers)[0].len +5;
//增加5个字节长度
pData := AllocMem(dwLen);
.... //给pData赋值
pOldData := LPWSABUFS(lpBuffers)[0].buf;
dwOldLen := LPWSABUFS(lpBuffers)[0].len;
LPWSABUFS(lpBuffers)[0].buf = pData;
LPWSABUFS(lpBuffers)[0].len = dwLen;

//标识数据已改变
bDataChanged := True;
end;

end;

Result := OldSend(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine);

if bDataChanged then
begin
lpNumberOfBytesSent := dwLen;
LPWSABUFS(lpBuffers)[0].buf = pOldData;
LPWSABUFS(lpBuffers)[0].len = dwOldLen;
end;

if pData<>nil then
FreeMemory(pData);
end;
[解决办法]
错了,是
WSABUFS=array[0..0] of WSABUF;
LPWSABUFS = ^WSABUFS;
[解决办法]
很不一样,请参阅MSDN,以后慢慢体会
[解决办法]
Send可以一次发多个缓冲,所以,嗯,那啥。
其实MSDN文档里描述的很清楚

这种方式一个潜在的问题是使用IOCP的程序,可能会受影响。

非理论。

读书人网 >.NET

热点推荐