比方我有个C/S程序在运行,client运行在192.168.0.2,server运行在192.168.0.3
目前知道他们直接应该有的通讯过程我希望实现当client发送某个特定数据包到server的时候,在192.168.0.2上(客户机)用一个程序模拟192.168.0.3的server程序应答一个封包
同时当真的server的这个封包过来的时候,给过滤掉
这个程序可以做成loader的模式或者其他模式,执行效果要求尽量简单高效
如能提供类似的例子源代码的,单独给500分吧
给思路和建议的朋友都有分,谢谢!!!
目前知道他们直接应该有的通讯过程我希望实现当client发送某个特定数据包到server的时候,在192.168.0.2上(客户机)用一个程序模拟192.168.0.3的server程序应答一个封包
同时当真的server的这个封包过来的时候,给过滤掉
这个程序可以做成loader的模式或者其他模式,执行效果要求尽量简单高效
如能提供类似的例子源代码的,单独给500分吧
给思路和建议的朋友都有分,谢谢!!!
偶知道,这种领域的应用,对于很多高手而言,是不愿意传授,所以高分相求
网上这个组件的资料稍微少了点
学习中……
个人感觉属于hook的典型应用
网上流传的哪个delphi的APIHOOK代码,我怎么总无法得到正确的recv中的len偏大(提示总是8192),而通过WPE等则很小,且是变化长度
我想通过长度和通讯端口等信息来决定是否修改封包数据,以及是否抛弃这个封包
{---------------------------------------}
{函数功能:Recv函数的HOOK
{函数参数:同Recv
{函数返回值:integer
{---------------------------------------}
function MyRecv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
var
dwSize: cardinal;
begin MessageDlg('嘻嘻:recv长度是' + IntToStr(len) , mtWarning, [mbYes, mbNo], 1);WriteProcessMemory(ProcessHandle, AddRecv, @OldProc[1], 8, dwSize);
Result := OldRecv(S, Buf, len, flags);
JmpCode.Address := @MyRecv;
WriteProcessMemory(ProcessHandle, AddRecv, @JmpCode, 8, dwSize);
end;
MessageDlg要写在后面,老兄。前面的时候还没有接收数据呢。那个是缓冲区的大小。
WriteProcessMemory(ProcessHandle, AddRecv, @OldProc[1], 8, dwSize);
Result := OldRecv(S, Buf, len, flags);
JmpCode.Address := @MyRecv;
WriteProcessMemory(ProcessHandle, AddRecv, @JmpCode, 8, dwSize);
MessageDlg('嘻嘻:recv长度是' + IntToStr(Result) , mtWarning, [mbYes, mbNo], 1); // Result才是收到包的大小
接收了就接收了,不要传给应用程序不就完了吗?
var
sTmp: String;
begin
//恢复旧的入口函数地址
WriteProcessMemory(ProcessHandle, AddRecv, @OldProc[1], 8, dwSize);
//调用旧的函数
Result := OldRecv(S, Buf, len, flags);
//再进行入口地址修改
JmpCode.Address := @MyRecv;
WriteProcessMemory(ProcessHandle, AddRecv, @JmpCode, 8, dwSize); //接下来就可以修改数据了,比如,当数据长度为10时,我们修改它
if Result = 10 then
begin
sTmp:= 'Hello,world!';
ZeorMemory(@Buf, len); // Clear Old data
Move((@sTmp[1])^, Buf, Length(sTmp)); // Move data to buffer Result:= Length(sTmp); // Assign result
end;
end;
这样子的话,我担心会不会导致如下可能 :
我们这里在修改,客户端哪里同时在读取,最后不知道客户端给读取成了什么样子的数据了
以上是偶的理解,不了解socket通信机制和过程,请大家指点
其次,你要了解你这种API HOOK的实现原理。1) 简单解释一下:协议栈是指网络中各层协议的总和. 应用层 ---- (可以看成就是Client)
-------
传输层
-------
网络层
-------
链路层
-------
物理层 ---- (可以想象成物理网卡)
-------数据就是这样一层一层的从下到上,再从上到下严格的传递的。
2) 什么是API HOOK呢?
我们举个现实中的例子来说,从A - B是一条正常的道路,而现在,有一个匪徒,在A - B之间设置了一个路障C,将A - B截断。那么,这时候,路径就变成这样了: A
|
|
C (匪徒在次设立路障,于是,所有通过这里的车辆和行人,都必须经过匪徒的盘查。
| 可能呢,他掠夺完之后,仍然让你到B,也可能不让你到B,而直接返回A,或者,他也可能让你先到B然后,在回来的路上再对你进行掠夺。)
|
B 这就是API HOOK的形象说明。进行API HOOK,就是在函数调用的正常路径上,设立了一个“路障”,由你进行一番“掠夺”之后,或者直接返回,或者继续然你到正常的处理函数,或者在返回之后处理。
现在的这种情况,就是最后一种,我们先调用原来的函数B(原来的接收函数,它会去调用下层协议来真正的从网卡接收数据),然后它会返回到C(我们设立的“障碍”)的时候,我们将它的数据进行处理,然后再让他返回A(真正的调用者,即应用程序)。在没有返回之前,Client是不会收数据的。所以你的担心是多余的。 而API HOOK可以用多种方式来实现,你现在的方式是 修改函数入口地址API HOOK 方法实现的。(自己百度一下就会清楚了) 不知道这样解释,你明白了没?