Сейчас на форуме: hgdagon, asfa, bartolomeo (+4 невидимых)

 eXeL@B —› Программирование —› Помогите перехватить процедуру Send...
Посл.ответ Сообщение

Ранг: 12.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 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.




Ранг: 12.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 11 января 2007 02:24
· Личное сообщение · #2

Все тема закрыта, во всем сам разобрался


 eXeL@B —› Программирование —› Помогите перехватить процедуру Send...
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати