Показать сообщение отдельно
Старый 07.11.2011, 23:54   #1
Jain
Гость
Аватар для Jain
Сообщений: n/a
Благодарностей:
0 всего

Падает клиент


Требуется организовать просмотр входящих пакетов рфки. Язык - делфи.
Снимаю хуки фрост-протектора (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 код:
@recvNextHook:=GetProcAddress(GetModuleHandle('gameShieldDll.dll'), 'frostRecv');
SetCodeHook(@recvNextHook, @mioRecvRestoreDATA); 

Хукаю вот таким сплайсингом, который у меня работает в других приложениях:

PHP код:
function SetCodeHook(ProcAddressNewProcAddresspointerRestoreDATA:pointer):boolean;
var
  
OldProtectJMPValue:DWORD;
begin
  Result
:=False;
  if 
not VirtualProtect(ProcAddress,5,PAGE_EXECUTE_READWRITE,OldProtectthen 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 (sTSocket; var BuflenflagsInteger): Integerstdcall;
begin
// какой-то код, записываю содержимое в txt файл
 
result:= RecvNextHook (sBuflenflags); // вызов оригинальной функции
end


При установке хука рфка падает, выводит ошибку "Программа RFOnline.bin не работает" и закрывается.

Пробовал перед установкой хука делать SuspendThread всем потокам рфки, а потом размораживать, результат тот же.


Я нуб в этом деле, люди знающие, подскажите, как решить задачу.

Последний раз редактировалось dark; 18.10.2022 в 10:12.
 
Ответить с цитированием