我要拦截getprocaddress函数!拦截成功后,并且已经转到了自己的mygetprocaddress函数里,请问在自己的函数里处理完数据后,怎么才能恢复他原来的getprocaddress函数的地址呢?我到自己的函数里处理完数据就不知道怎么做了!望高手指教!强烈感谢!

解决方案 »

  1.   

    哦,你拦截GetProcAddr是为了判断它调用的函数是不是你的目标函数?
    若是的话则调用你的Myfunction...若不是的话则正常调用GetProcAddress吗,在拦截函数之前应该保存原函数地址的;
      

  2.   

    然后用这个地址去调用真实函数啊!
    你那个mysendto是怎么写的?
      

  3.   

    然后用这个地址去调用真实函数啊!
    你那个mysendto是怎么写的?
      

  4.   

    function myrecvfrom(s: TSocket; var Buf; len, flags: Integer;
      var from: TSockAddr; var fromlen: Integer): Integer; stdcall;
       begin
      showmessage('yes');   然后这里就不知道怎么写了!
       
      end;function mygetproc(hModule: HMODULE; lpProcName: LPCSTR): FARPROC; stdcall;
         begin     if b='recvfrom' then
         begin
         recvadr:=getprocaddress(hmodule,lpprocname);//var recvadr:pointer 保存原来的地址
         result:=@myrecvfrom;//转到我的函数!
         end
         else
         
         result:=getprocaddress(hmodule,lpprocname);
        end;
      

  5.   

    function myrecvfrom(s: TSocket; var Buf; len, flags: Integer;
      var from: TSockAddr; var fromlen: Integer): Integer; stdcall;
       begin
      showmessage('yes');   然后这里就不知道怎么写了!
       
      end;function mygetproc(hModule: HMODULE; lpProcName: LPCSTR): FARPROC; stdcall;
         begin     if lpprocname='recvfrom' then
         begin
         recvadr:=getprocaddress(hmodule,lpprocname);// recvadr是pointe类型变量 保存原来的地址
         result:=@myrecvfrom;//转到我的函数!
         end
         else
         
         result:=getprocaddress(hmodule,lpprocname);
        end;
      

  6.   

    ......你拦截的目的是什么?若没有什么其他目的就这样吧function myrecvfrom(s: TSocket; var Buf; len, flags: Integer;
      var from: TSockAddr; var fromlen: Integer): Integer; stdcall;
       begin
      showmessage('yes');   //然后这里就不知道怎么写了!
      result := recvfrom(s,buf,flages,from,fromlen);
      //调用真实函数,不然这个函数就真的什么也作不了了,除非你就是不想让它运行
       
      end;
      

  7.   

    还有这段代码应该在dll中,若都在一个.exe文件中一定死循环到堆栈溢出。
    就是说,目标程序调用这个api时候,会先执行你的函数,你处理完在转到真实的函数。
      

  8.   

    result := recvfrom(s,buf,flages,from,fromlen);不行啊!总是出现showmessage('yes');,好象已经把recvfrom函数的地址给变为我的地址了!我的目的是先让程序执行我的函数,然后在执行默认的recvfrom函数
      

  9.   

    是这样的,你的hook代码在要hook的.exe中吧,那是一定的了。
    我说的已经很清楚了,调用 recvfrom 后会转到 myrecvfrom ,但是在这里又调用 recvfrom ,当然是死循环了!
    要解决也不难,在.exe执行最初(在你正常开始调用 recvfrom 以前),用getprocaddress 取得recvfrom的真实地址,然后进行拦截动作。
    在你 myrecvfrom 中,使用这个真实地址调用真正的recvfrom就可以了。比如:type
        TShowWindow = function(hWnd: HWND; nCmdShow: Integer):Boolean; stdcall;
    //声明这个函数类型,我要拦截showwindow;function MyShowWindow(hWnd: HWND; nCmdShow: Integer):Boolean; stdcall;
    var
        RealFunction: TShowWindow;
    begin
        @RealFunction := form1.FAPIAddr;//这里是真实函数的地址
        Result := RealFunction(hWnd,nCmdShow);
      //  Form1.Button6.Caption := 'ok';
    end;
    //实现我的myshowwindow;
    //注意返回值就是真正函数的返回值了,用这样的方法调用;
      

  10.   

    怎样拦截的有代码和说明吗 可否给我一份谢谢了
    [email protected]