Ранг: 12.4 (новичок) Активность: 0.01↘0 Статус: Участник
|
Создано: 08 января 2007 04:00 · Личное сообщение · #1
Помогите перехватить процедуру Send...
Нашел только реализацию перехвата процедуру Recv, пытался переделать под процедуру Send но без успешно(после первого пакета приложение виснит) =(
ЗЫ. Вот код:
library HookDLL;
uses
Windows,
Messages,
AdvApiHook,
Winsock;
const
GlobMapID = 'Global Hook for API Interception {2E662583-74C4-45DB-B6DF-FE318C94258D}';
const
NOTIFY_DLL_INJECT = 1;
NOTIFY_API_CALL = 2;
NOTIFY_API_INTERCEPT_SUCCESS = 3;
NOTIFY_API_INTERCEPT_FAILED = 4;
type
TLogData = record
AppName: ShortString;
FuncName: String[8];
FuncPointer: Integer;
IP: String[15];
Port: Cardinal;
Buff: array [0..$FFFF] of Char;
BuffSize: integer;
end;
PShareInf = ^TShareInf;
TShareInf = record
AppWndHandle: HWND;
OldHookHandle: HHOOK;
hm:THandle;
end;
TIIDUnion = record
case Integer of
0: (Characteristics: DWORD);
1: (OriginalFirstThunk: DWORD);
end;
PImageImportDescriptor = ^TImageImportDescriptor;
TImageImportDescriptor = record
Union: TIIDUnion;
TimeDateStamp: DWORD;
ForwarderChain: DWORD;
Name: DWORD;
FirstThunk: DWORD;
end;
PImageThunkData = ^TImageThunkData32;
TImageThunkData32 = packed record
_function : PDWORD;
end;
var
MapHandle: THandle = 0;
ShareInf: PShareInf = nil;
AppTitle: ShortString;
TrueRecv: function(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
WND:HWND;
ws:string;
function InterceptedRecv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
type
TrecvImage = function(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
var
CDS: TCopyDataStruct;
SockAddr: TSockAddr;
AddrLen: Integer;
Data: TLogData;
begin
Result := TrecvImage(TrueRecv)(s, Data.Buff[0], len, flags);
if getpeername(s, SockAddr, AddrLen) = SOCKET_ERROR then Exit;
Data.IP := inet_ntoa(SockAddr.sin_addr);
Data.Port := ntohs(SockAddr.sin_port);
Data.BuffSize := Result;
Data.AppName := AppTitle;
if Data.BuffSize>0 then if flags<>MSG_PEEK then
begin
Move(Data.Buff[0], Buf, Result);
CDS.dwData := NOTIFY_API_CALL;
CDS.cbData := SizeOf(TLogData);
CDS.lpData := @Data;
SendMessage(wnd, WM_COPYDATA, 0, Integer(@CDS));
end;
end;
procedure DLLEntryPoint(dwReason: DWORD);
var
CDS: TCopyDataStruct;
Data: TLogData;
ImageBase: Cardinal;
FileName: array [0..MAX_PATH - 1] of Char;
begin
case dwReason Of
DLL_PROCESS_ATTACH:
begin
MapHandle := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TShareInf), GlobMapID);
ShareInf := MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TShareInf));
DisableThreadLibraryCalls(hInstance);
ImageBase:=GetModuleHandle(nil);
ZeroMemory(@FileName, SizeOf(FileName));
GetModuleFileName(ImageBase, @FileName, SizeOf(FileName));
AppTitle := String(FileName);
ZeroMemory(@Data, SizeOf(TLogData));
Data.AppName := AppTitle;
Data.FuncName := 'recv';
ws:='wsock32.dll';
if Pos('L2WALKER.EXE', AnsiUpper(@FileName))<>0 then ws:='ws2_32.dll';
CDS.dwData := NOTIFY_DLL_INJECT;
CDS.cbData := SizeOf(TLogData);
CDS.lpData := @Data;
SendMessage(wnd, WM_COPYDATA, 0, Integer(@CDS));
if HookProc(PChar(ws),'recv',@InterceptedRecv,@TrueRecv) then
begin
CDS.dwData := NOTIFY_API_INTERCEPT_SUCCESS;
end
else CDS.dwData := NOTIFY_API_INTERCEPT_FAILED;
CDS.cbData := SizeOf(TLogData);
CDS.lpData := @Data;
SendMessage(wnd, WM_COPYDATA, 0, Integer(@CDS));
end;
DLL_PROCESS_DETACH:
begin
UnMapViewOfFile(ShareInf);
CloseHandle(MapHandle);
end;
end;
end;
begin
wnd:=FindWindow(nil,'My App');
DLLProc := @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
| Сообщение посчитали полезным: |