Требуется организовать просмотр входящих пакетов рфки. Язык - делфи.
Снимаю хуки фрост-протектора (frostprotector.dll).
Внедряю свою либу вот такой функцией:
PHP код:
function LoadLibrary_Ex(ProcessID:DWORD;LibName:PChar):boolean;
var
pLL,pDLLPath:Pointer;
hProcess,hThr:THandle;
LibPathLen,_WR,ThrID:DWORD;
begin
Result:=False;
LibPathLen:=Length(string(LibName));
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID);
if hProcess=0 then exit;
pDLLPath:=VirtualAllocEx(hProcess,0,LibPathLen+1,MEM_COMMIT,PAGE_READWRITE);
if DWORD(pDLLPath)=0 then exit;
pLL:=GetProcAddress(GetModuleHandle(kernel32),'LoadLibraryA');
WriteProcessMemory(hProcess,pDLLPath,LibName,LibPathLen+1,_WR);
hThr:=CreateRemoteThread(hProcess,0,0,pLL,pDLLPath,0,ThrID);
if hThr=0 then exit;
Result:=CloseHandle(hProcess);
end;
Хукаю вот таким сплайсингом, который у меня работает в других приложениях:
PHP код:
function SetCodeHook(ProcAddress, NewProcAddress: pointer; RestoreDATA:pointer):boolean;
var
OldProtect, JMPValue:DWORD;
begin
Result:=False;
if not VirtualProtect(ProcAddress,5,PAGE_EXECUTE_READWRITE,OldProtect) then exit;
JMPValue := DWORD(NewProcAddress) - DWORD(ProcAddress) - 5;
val1:= Byte(ProcAddress^);
val2:= DWORD(Pointer(DWORD(ProcAddress)+1)^);
Address:=ProcAddress;
byte(ProcAddress^):=$E9;
DWORD(Pointer(DWORD(ProcAddress)+1)^):=JMPValue;
Result:=VirtualProtect(ProcAddress,5,OldProtect,OldProtect);
end;
Перенаправляю на обработчик, который имеет такой вид:
PHP код:
function mioRecv (s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
begin
// какой-то код, записываю содержимое в txt файл
result:= RecvNextHook (s, Buf, len, flags); // вызов оригинальной функции
end;
При установке хука рфка падает, выводит ошибку "Программа RFOnline.bin не работает" и закрывается.
Пробовал перед установкой хука делать SuspendThread всем потокам рфки, а потом размораживать, результат тот же.
Я нуб в этом деле, люди знающие, подскажите, как решить задачу.
Последний раз редактировалось dark; 18.10.2022 в 10:12.