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;
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;
......你拦截的目的是什么?若没有什么其他目的就这样吧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); //调用真实函数,不然这个函数就真的什么也作不了了,除非你就是不想让它运行
若是的话则调用你的Myfunction...若不是的话则正常调用GetProcAddress吗,在拦截函数之前应该保存原函数地址的;
你那个mysendto是怎么写的?
你那个mysendto是怎么写的?
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;
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;
var from: TSockAddr; var fromlen: Integer): Integer; stdcall;
begin
showmessage('yes'); //然后这里就不知道怎么写了!
result := recvfrom(s,buf,flages,from,fromlen);
//调用真实函数,不然这个函数就真的什么也作不了了,除非你就是不想让它运行
end;
就是说,目标程序调用这个api时候,会先执行你的函数,你处理完在转到真实的函数。
我说的已经很清楚了,调用 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;
//注意返回值就是真正函数的返回值了,用这样的方法调用;
[email protected]