比方我有个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分吧
给思路和建议的朋友都有分,谢谢!!!

解决方案 »

  1.   

    这种实现是要花RMB的 呵呵
      

  2.   

    TO ideation_shang
    偶知道,这种领域的应用,对于很多高手而言,是不愿意传授,所以高分相求
      

  3.   

    如果你知道它的应用层协议,可以使用HookAPI来过滤,但是要想做到高效有点困难关键还看协议,至少来讲对原来的性能还是有相当影响的,需要对整个报文当中的“特定数据包”进行分析和分解。
      

  4.   

    嗯,我看了一晚上资料,应该是hook的应用,madCodeHook 组件应该可以胜任了
    网上这个组件的资料稍微少了点
    学习中……
      

  5.   

    监听不行吧,是伪造server封包发给客户端,而且要过滤server的封包
    个人感觉属于hook的典型应用
      

  6.   

    突然想到了一个问题就是,hook过滤封包倒是蛮轻松了,关键是如果server灭有给client那封包,怎么实现用程序伪造一个server的封包给client程序渴望指点,谢谢
      

  7.   


    网上流传的哪个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;
      

  8.   

    一定要Hook么?使用RawSocket不能伪造IP数据包么?
      

  9.   

    rawsocket是能伪造,但是不能过滤封包啊偶才疏学浅,初入delphi,麻烦大家指点
      

  10.   


    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才是收到包的大小
      

  11.   

    哦,这样子。那有什么关系?
    接收了就接收了,不要传给应用程序不就完了吗?
    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;
      

  12.   

    嗯,谢谢楼上的指点不过我的理解是,兄弟的数据处理代码是在数据已经被真正的client的Recv所接收了,再进行的内存修改
    这样子的话,我担心会不会导致如下可能  :
    我们这里在修改,客户端哪里同时在读取,最后不知道客户端给读取成了什么样子的数据了
    以上是偶的理解,不了解socket通信机制和过程,请大家指点
      

  13.   

    首先,你要知道一些基本的网络知识,比如说协议栈。
    其次,你要了解你这种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 方法实现的。(自己百度一下就会清楚了)   不知道这样解释,你明白了没?