![]() |
eXeL@B —› Основной форум —› Как IP tools перехватывает Api? |
Посл.ответ | Сообщение |
|
Создано: 22 декабря 2005 00:47 · Личное сообщение · #1 В сниффере IP tools(by Erwan L.) реализован перехват Api по работе с сокетами (recv, send и т.д.) Причем после установки перехвата на одну сетевую игрушку Ip tools пишет, что recv принял пакеты разного размера. Я написал свою программу по перехвату, но почему-то recv принимает пакеты строго 2048 байт, хотя send посылает точно такие же как и Ip tools. Почему так? Помогите пожалуйста разобраться. (Реализация перехватов на send и recv вроде идентичная, поэтому ошибки в моем перехвате маловероятны) ![]() |
|
Создано: 22 декабря 2005 01:07 · Личное сообщение · #2 |
|
Создано: 22 декабря 2005 01:48 · Личное сообщение · #3 Вот сорцы библиотеки, которая запускается в пространстве процесса игрушки, а затем посылает сообщение с нужными данными. Я использовал модуль из статьи Ms-Rem про перехват Api. Library Naturs; uses Windows, advApiHook; {$R *.res} const WM_COPYDATA=$004A; WM_DATA=$0400+256; ID_RECV=0; ID_SEND=1; type TSocket=integer; TSendRecProc=function (s: TSocket; var Buf; len, flags: Integer): Integer; stdcall; var OldRecv, OldSend:TSendRecProc; hinst, s,flags,h:integer; function NewRecv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall; var d:TCopyDataStruct; begin d.dwData:=ID_RECV; d.cbData:=len; d.lpData:=@buf; SendMessage(h, WM_COPYDATA, Longint(flags), Longint(@d)); result:=OldRecv(s,buf,len,flags); end; function NewSend(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall; var d:TCopyDataStruct; begin d.dwData:=ID_SEND; d.cbData:=len; d.lpData:=Addr(string(buf)); SendMessage(h, WM_COPYDATA, Longint(hinst), Longint(@d)); result:=OldSend(s,buf,len,flags); end; procedure DLLEntryPoint(dwReason: DWord); var d:TCopyDataStruct; begin case dwReason of DLL_PROCESS_ATTACH: begin hinst:=GetModuleHandle(nil); h:=findwindow(nil,'bot'); if h<>0 then begin StopThreads; HookProc('WS2_32.dll','recv',@NewRecv,@OldRecv); HookProc('WS2_32.dll','send',@NewSend,@OldSend); RunThreads; end; end; DLL_PROCESS_DETACH: begin UnhookCode(@Oldsend); UnhookCode(@OldRecv); end; end; end; begin DllProc := @DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH); end. ![]() |
|
Создано: 22 декабря 2005 03:07 · Личное сообщение · #4 teran пишет: (Реализация перехватов на send и recv вроде идентичная, поэтому ошибки в моем перехвате маловероятны) Но все же они там есть ![]() Обрати внимание на этот код:teran пишет: function NewRecv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall; var d:TCopyDataStruct; begin d.dwData:=ID_RECV; d.cbData:=len; d.lpData:=@buf; SendMessage(h, WM_COPYDATA, Longint(flags), Longint(@d)); result:=OldRecv(s,buf,len,flags); end; 2048 байт это не размер принятых данных, а размер буфера который передается функции recv. Размер принятых данных будет в Result после выполнения result:=OldRecv(s,buf,len,flags); Не нужно путать размер буфера для данных, с размером принятых данных, это совсем разные вещи. ----- Скажем дружно - нафиг нужно. ![]() |
|
Создано: 22 декабря 2005 11:51 · Личное сообщение · #5 |
![]() |
eXeL@B —› Основной форум —› Как IP tools перехватывает Api? |