hook (ws2_32.dll / send) 怎么修改封包后再发送???buf长度不变容易修改,长度变化了就不行了.

z109876543210 2012-06-15 01:04:25
buf 长度不变的情况下很容易修改. 长度变了就不行了. buf用GetMem不允许修改长度
所以只有用自己变量替换buf, char数组/pchar都不行. 谁给个例子????



function StreamToText(Stream: TMemoryStream): String;
var
tls:TStringList;
begin
Result := '';
tls := TStringList.Create;
try
tls.LoadFromStream(Stream);
Result := tls.Text;
finally
tls.Free;
end;
end;

function TextToStream(Text: string): TMemoryStream;
var
tls:TStringList;
begin
Result := TMemoryStream.Create;
tls := TStringList.Create;
try
tls.Text := Text;
tls.SaveToStream(Result);
finally
tls.Free;
end;
end;

function mysend(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
var
ss, temp: string;
Stream, st:TMemoryStream;
begin
Stream := TMemoryStream.Create;
Stream.Write(buf,len);
Stream.Position := 0;

ss := StreamToText(Stream);
ss := StringReplace(ss, '*/*', '1/1', [rfReplaceAll, rfIgnoreCase]);
//我目的是可以任意修改buf内容长度,*/*是例子测试的
//长度不变没问题. 如果换成 111/11111 就不行了,没办法GetMeM改buf长度
st := TextToStream(ss);
st.Position := 0;
st.Read(Buf, st.Size);

Result := oldsend(s, Buf, st.Size, flags);
end;
...全文
896 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
一声叹息11 2014-12-31
  • 打赏
  • 举报
回复
报文有个pv4 header 里面有个数据叫 lenth 记录里数据的长度.改就回返回错误.就像http.会返回400错误一样
ps10086 2013-11-05
  • 打赏
  • 举报
回复
我也遇到此问题了解决的请透露下
徐公移山 2013-04-21
  • 打赏
  • 举报
回复
楼主解决了没?解决了的话透露下方法 我也遇到这个问题了,刚开始不知道是什么原因 调试了半天,终于发现原来是长度不能变,不管是加减都会卡住,buf是可以变的,唯独len不能变
z109876543210 2012-06-28
  • 打赏
  • 举报
回复
好难啊
ydtg888 2012-06-20
  • 打赏
  • 举报
回复
这应该无解. len 好像不能变
z109876543210 2012-06-16
  • 打赏
  • 举报
回复
这么难啊?!
z109876543210 2012-06-15
  • 打赏
  • 举报
回复
ss := StringReplace(ss, '*/*', '1/1', [rfReplaceAll, rfIgnoreCase]);//正确
ss := StringReplace(ss, '*/*', '11111/111', [rfReplaceAll, rfIgnoreCase]);//失败
z109876543210 2012-06-15
  • 打赏
  • 举报
回复
madCodeHook 搞的.
代码就上面那些啊. 死循环不可能的. 我替换字符串长度不变的情况是正确的. 长度变了就不行
mhhaifeng 2012-06-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

好吧,看了下你的代码,你最后把修改后的数据又传回buf。这是多此一举的
直接传递st就行了

随手写的
oldsend(s, st.memory^, st.Size, flags);
[/Quote]
这个正解
要不 你的hook 用错了 变成死循环
mhhaifeng 2012-06-15
  • 打赏
  • 举报
回复
getMem(Buf,st.Size)
这个是重新分配内存了 都不行 ?
要不
pSend:PChar;
getMem(pSend,st.Size);
st.Read(pSend,st.Size);
Result :=oldsend(s, pSend, st.Size, flags);
FreeMem(pSend);
z109876543210 2012-06-15
  • 打赏
  • 举报
回复
也不行. 一直卡在那.
一如当初 2012-06-15
  • 打赏
  • 举报
回复
好吧,看了下你的代码,你最后把修改后的数据又传回buf。这是多此一举的
直接传递st就行了

随手写的
oldsend(s, st.memory^, st.Size, flags);
z109876543210 2012-06-15
  • 打赏
  • 举报
回复
都不行


buf 长度不变的情况下很容易修改. 长度变了就不行了. buf用GetMem不允许修改长度
所以只有用自己变量替换buf, char数组/pchar都不行. 谁给个例子????



mhhaifeng 2012-06-15
  • 打赏
  • 举报
回复
mysend()
st.Read(Buf, st.Size);//当length(buf)< st.Size 时 当然出错
只能 getMem(Bufst.Size)
再 st.Read(Buf, st.Size);
一如当初 2012-06-15
  • 打赏
  • 举报
回复
把buf声明为pansichar试试

828

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧