拦截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;