有个外部程序每秒钟会检测一下读卡器,dll里面的函数是:
function CheckPort(p:integer):integer;这个函数如果检测到了读卡器会返回结果 1现在我想hook 住这个  CheckPort ,它检测时直接返回 1 ,不管有没有接读卡器。请问该怎么做?谢谢

解决方案 »

  1.   

    我写了个注入程序,但不起作用function CheckPort(p:integer):integer;stdcall;external 'check.dll';type
      TCheckPort= function (p:integer):integer;stdcall;var
       OldCheckPort: TCheckPort;
    function MyCheckPort():integer;stdcall;
    begin
      ShowMessage('111111');
      Result:=1;
    end;procedure API_Hookup; stdcall;
    begin 
      if @OldCheckPort = nil then
        @OldCheckPort := LocateFunctionAddress(@CheckPort);
      RepointFunction(@OldCheckPort, @MyCheckPort);end; procedure API_HookDown; stdcall; 
    begin 
      if @OldCheckPort <> nil then
        RepointFunction(@MyCheckPort, @OldCheckPort);
    end; 
    //注入接口
    function GetMsgProc(nCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall; 
    begin
      Result := 0; 
    end; procedure SetHook; 
    begin 
      Hook := SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,hInstance,0); 
    end; procedure RemoveHook; 
    begin 
      UnHookWindowsHookEx(Hook); 
    end; 
      

  2.   

    既然在外部,可以考虑替换这个DLL(如果这个DLL中导出函数较少的情况下)
      

  3.   

    替换可能行不能,因为这个 check.dll 还调用了其它 dll,也不知道这些 dll 的接口
      

  4.   

    你的注入程序只挂了钩子,但没有调用API_Hookup啊要在消息钩子的消息处理函数中,判断是否替换了函数地址,没替换的话替换掉
      

  5.   

    你可以再调用回原来的check.dll。
      

  6.   

    不需要注入,不需要外部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来显示失败信息.