首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

阻截api并返回修改后的数据

2014-05-14 
拦截api并返回修改后的数据有个外部程序每秒钟会检测一下读卡器,dll里面的函数是:function CheckPort(p:in

拦截api并返回修改后的数据
有个外部程序每秒钟会检测一下读卡器,dll里面的函数是:
function CheckPort(p:integer):integer;

这个函数如果检测到了读卡器会返回结果 1

现在我想hook 住这个  CheckPort ,它检测时直接返回 1 ,不管有没有接读卡器。请问该怎么做?谢谢
[解决办法]
不需要注入,不需要外部DLL,直接改代码即可

var
  dwPID : DWORD;
  hLibrary , hProcess : THandle;
  pDestAddr : Pointer;
  dwBytes : DWORD;
  Buf : array [0..7] of Byte;
begin
  hLibrary := LoadLibrary('check.dll');  //注意check.dll的路径,如果系统不能访问到,就需要带上路径
  if hLibrary=0 then exit;               //装入失败
  pDestAddr := GetProcAddress(hLibrary , 'CheckPort');
  if pDestAddr<>NIL then begin           //获取函数地址失败
    dwPID := GetProcessID('xxxx.exe');   //获取目标进程的ID,Windows无这个API,需要自己写,可以用PSAPI函数来获取
    if dwPID<>0 then begin
      hProcess := Windows.OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_WRITE , False , dwPID);
      if hProcess<>0 then begin
        PInt64(@Buf)^      := 0;    //FillChar(Buf , 8 , 0);
        Buf[0]             := $B8;  //MOV EAX ,
        PDWORD(@Buf[1])^   := 1;    //n
        Buf[5]             := $C2;  //RET
        Buf[6]             := $04;  //4
        if WriteProcessMemory(hProcess , pDestAddr , @Buf , SizeOf(Buf) , dwBytes) then begin
          //成功.....之后这个函数就始终返回1
          //如果要恢复,把上面这句改成下面这句就恢复了
          //WriteProcessMemory(hProcess , pDestAddr , pDestAddr , 8 , dwBytes)
        end;
        CloseHandle(hProcess);
      end;
    end;
  end;
  FreeLibrary(hLibrary);
end;

LZ自己把if后面加上else来显示失败信息.

热点排行