Сейчас на форуме: YDS, _MBK_, user99 (+10 невидимых)

 eXeL@B —› Основной форум —› Как IP tools перехватывает Api?
Посл.ответ Сообщение

Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 22 декабря 2005 00:47
· Личное сообщение · #1

В сниффере IP tools(by Erwan L.) реализован перехват Api по работе с сокетами (recv, send и т.д.) Причем после установки перехвата на одну сетевую игрушку Ip tools пишет, что recv принял пакеты разного размера.
Я написал свою программу по перехвату, но почему-то recv принимает пакеты строго 2048 байт, хотя send
посылает точно такие же как и Ip tools. Почему так? Помогите пожалуйста разобраться.

(Реализация перехватов на send и recv вроде идентичная, поэтому ошибки в моем перехвате маловероятны)




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 22 декабря 2005 01:07
· Личное сообщение · #2

teran
А сорсы можно было бы увидеть? Довольно-таки интересно...



Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

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




Ранг: 120.6 (ветеран)
Активность: 0.090
Статус: Участник
rootkit developer

Создано: 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);
Не нужно путать размер буфера для данных, с размером принятых данных, это совсем разные вещи.

-----
Скажем дружно - нафиг нужно.




Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 22 декабря 2005 11:51
· Личное сообщение · #5

Большое спасибо за то, что помогли найти ошибку. Пойду литературу по сокетам перечитывать. Спасибо.


 eXeL@B —› Основной форум —› Как IP tools перехватывает Api?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати