Пользователь
Регистрация: 23.02.2009
Сообщений: 78
|
Подмена функций
Доброго времени суток форумчане. Пытаюсь реализовать программу которая будет ловить пакеты сообщений передаваемых от программы на моём компе к серверу. программа явно многопоточная, перехват реализовываю следующим образом:
Код:
library mydll;
uses
Windows,psapi,winsock,sysutils;
type
OldCode = packed record
One: dword;
two: word;
end;
far_jmp = packed record
PuhsOp: byte;
PushArg: pointer;
RetOp: byte;
end;
TSocket=integer;
var
hhPort:HWND;
Jmp_Recv,Jmp_Send: far_jmp;
Old_Recv,Old_Send: OldCode;
Recv_Adr,Send_Adr: Pointer;
FHandle:THandle;
SendText:PChar=#13#10'Send ';
RecvText:PChar=#13#10'Recv ';
Procedure Unhook();
var
Bytes: dword;
begin
WriteProcessMemory(INVALID_HANDLE_VALUE, Recv_Adr, @Old_Recv, SizeOf(OldCode), Bytes);
WriteProcessMemory(INVALID_HANDLE_VALUE, Send_Adr, @Old_Send, SizeOf(OldCode), Bytes);
end;
var
sendok:boolean=false;
recvok:boolean=false;
function New_Recv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
var
Written:dword;
i:integer;
buf2:string;
begin
WriteProcessMemory(INVALID_HANDLE_VALUE, Recv_Adr,@Old_Recv, SizeOf(OldCode), Written);
Result:=Recv(s,Buf,len,flags);
if(len<30)then
begin
WriteFile(FHandle,RecvText^,7,Written,nil);
WriteFile(FHandle,buf,Cardinal(len),Written,nil);
end;
WriteProcessMemory(INVALID_HANDLE_VALUE, Recv_Adr,@Jmp_Recv, SizeOf(far_jmp), Written);
//
end;
function New_Send(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
var
Written:dword;
i:integer;
buf2:string;
begin
WriteProcessMemory(INVALID_HANDLE_VALUE, Send_Adr,@Old_Send, SizeOf(OldCode), Written);
if(len<30)then
begin
WriteFile(FHandle,SendText^,7,Written,nil);
WriteFile(FHandle,buf,Cardinal(len),Written,nil);
end;
Result:=Send(s,Buf,len,flags);
WriteProcessMemory(INVALID_HANDLE_VALUE, Send_Adr,@Jmp_Send, SizeOf(far_jmp), Written);
end;
Procedure SetHook();
var
hkernel32: dword;
Bytes: dword;
s:string;
begin
hkernel32 := GetModuleHandle('wsock32.dll');
Recv_Adr:=GetProcAddress(hkernel32, 'recv');
Send_Adr:=GetProcAddress(hkernel32, 'send');
ReadProcessMemory(INVALID_HANDLE_VALUE, Recv_Adr, @Old_Recv, SizeOf(OldCode), Bytes);
ReadProcessMemory(INVALID_HANDLE_VALUE, Send_Adr, @Old_Send, SizeOf(OldCode), Bytes);
with Jmp_Recv do
begin
PuhsOp := $68;
PushArg := @New_Recv ;
RetOp := $C3;
end;
with Jmp_Send do
begin
PuhsOp := $68;
PushArg := @New_Send ;
RetOp := $C3;
end;
WriteProcessMemory(INVALID_HANDLE_VALUE, Recv_Adr, @Jmp_Recv, SizeOf(far_jmp), Bytes);
WriteProcessMemory(INVALID_HANDLE_VALUE, Send_Adr, @Jmp_Send, SizeOf(far_jmp), Bytes);
s:=ParamStr(0);
FHandle:=CreateFile(PChar(s+'.log'),GENERIC_WRITE,0,nil,OPEN_ALWAYS,0,0);
end;
//*******************************************************************************
//*******************************************************************************
Function MessageProc(code : integer; wParam : word;
lParam : longint) : longint; stdcall;
begin
CallNextHookEx(0, Code, wParam, lparam);
Result := 0;
end;
var
HookH:HHOOK=0;
hMutex: dword=0;
dwThreadId:Cardinal=0;
//*******************************************************************************
Procedure SetGlobalHookProc();
begin
HookH:=SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, dwThreadId);
Sleep(INFINITE);
end;
//*******************************************************************************
Procedure SetGlobalHook(TID:cardinal);
var
TrId: dword;
begin
dwThreadId:=TID;//ГЛАВНЫЙ ПОТОК НУЖНОЙ ПРОГРАММЫ
hMutex := CreateMutex(nil, false, {'AdvareHook'}'java');
if GetLastError = 0 then
CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId)
else
CloseHandle(hMutex);
end;
//*******************************************************************************
procedure DLLEntryPoint(dwReason: DWord);
begin
case dwReason of
DLL_PROCESS_ATTACH: SetHook();
DLL_PROCESS_DETACH: UnHook();
end;
end;
procedure RemoveGlobalHook; stdcall;
begin
if HookH<>0 then
begin
UnHookWindowsHookEx(HookH);
CloseHandle(hMutex);
HookH:=0;
end;
end;
exports
SetGlobalHook,RemoveGlobalHook;
//*******************************************************************************
begin
DllProc := @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
библиотека запускается вызовом функции SetGlobalHook, в аргументах которой передаю главный поток нужного приложения
файл логов создается и что то даже записывается, но большая часть пакетов пропускается, грешу на многопоточность, в чём моя ошибка, не посылайте на литературу, не новичёк, а реально подскажите, заранее благодарен)
|