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