Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> advapihook, перехват recv/WSArecv 
:(
    Опции темы
vtih
Дата 2.12.2006, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



Хочу с помошью библиотеки advapihook (от ms-rem; wasm.ru, -- http://wasm.ru/pub/21/files/advapihook.rar) перехватить у определенной программы все входящие (recv, WSArecv, -- этого жостаточно будет? [tcp]) пакеты, с целью на лету модифицировать некоторые из них и отдать обратно в программу. Но что-то совсем глупый я, смотрел примеры из этой библиотеки; а именно пример с перехватом winapi, но там они перехватывают вызов из самой библиотеки api, мне же нужно перехватить вызов только в нужной программе. Как это сделать?

Например:
...
  HookProc('user32.dll', 'MessageBoxA', @NewMessageBoxA, @TrueMessageBoxA);
...

Попытки глупо использовать вместо user32.dll, например имя своего же ехе, ни к чему хорошему ни привели.

PM MAIL   Вверх
W4FhLF
Дата 3.12.2006, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



vtih, что за бред ты несёшь? Ты внимательно прочёл статью о перехвате? Что значит из самой библиотеки? А твоя программа при вызове recv думаешь не к библиотеке обращается? 
Ты вызываешь recv и программа через таблицу импорта вызывает процедуру из библиотеки, которая подгружена в адресное пространство твоего процесса, вот именно вначале этой функции и ставится переходник на функцию перехвата. Чтобы перехватывать только в своём процессе достаточно вызвать InjectDll или CreateProcessWithDll из advapihook, далее установится перехват на нужную тебе функцию только лишь в одном процессе.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
vtih
Дата 3.12.2006, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



Да, сидел разбирался, вроде чуток понял.

Сделал dll для инжекта в требуемый экзэшник, но к сожалению не понимаю, почему не работает. Для примера не срабатывает ShowMessage на перехваченном Recv. Да и вообще программа отказывается работать с сетью, ну т.е. видимо connect делает, а при первом recv уже начинаются заморочки.

Код

type 
  TwsRecv = function (s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;

var 
  OldRecv: TwsRecv;

function NewRecv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall; 
begin
  ShowMessage('NewRecv!');
  OldRecv(s, buf, len, flags);
end;

procedure DLLEntryPoint(dwReason: DWord); 
begin
  case dwReason of
    DLL_PROCESS_ATTACH:
    begin
//        StopThreads;
        HookProc('WS2_32.dll', 'recv', @NewRecv, @OldRecv);
        HookProc('WSock32.dll', 'recv', @NewRecv, @OldRecv);
//        RunThreads;
    end;
    DLL_PROCESS_DETACH:
    begin
      UnhookCode(@OldRecv);
    end;
  end;
end;

begin 
  DllProc := @DLLEntryPoint;
  DLLEntryPoint(DLL_PROCESS_ATTACH); 
end.


Заталкиваю dll через CreateProcessWithDll.
PM MAIL   Вверх
W4FhLF
Дата 3.12.2006, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Вот так попробуй:

Код

var
TwsRecv: function (s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;

function NewRecv(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall; 
begin
asm
pushad
end;
  ShowMessage('NewRecv!');
asm
popad
end;
  Result := TwsRecv(s, buf, len, flags);
end;

procedure DLLEntryPoint(dwReason: DWord); 
begin
  case dwReason of
    DLL_PROCESS_ATTACH:
    begin
        HookProc('WS2_32.dll', 'recv', @NewRecv, @TwsRecv);
    end;
    DLL_PROCESS_DETACH:
    begin
      UnhookCode(@TwsRecv);
    end;
  end;
end;



PS Устанавливать перехват на recv из WSock32.dll смысла нет, ибо она обращается к WS2_32.dll



Это сообщение отредактировал(а) W4FhLF - 3.12.2006, 12:15


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
vtih
Дата 3.12.2006, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



W4FhLF, увы, не помогло это, теперь просто сама программа отлично коннектится и принимает/отправляет данные...
PM MAIL   Вверх
W4FhLF
Дата 3.12.2006, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Цитата

теперь просто сама программа отлично коннектится и принимает/отправляет данные...


Ну а в чём тогда проблема?



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
vtih
Дата 3.12.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



Цитата

Ну а в чём тогда проблема?

Ну получается, что не перехватывается Recv, ибо я не вижу результат выполнения SendMessage.
PM MAIL   Вверх
W4FhLF
Дата 3.12.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Ты уверен, что именно с помощью recv программа получает данные? Попробуй поставить перехват на WSARecv, так же было бы хорошо запустить программу под отладчиком и поставить бряк на recv, дабы посмотреть устаналивается ли переходник или нет.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
vtih
Дата 3.12.2006, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



Спасибо! Добавил WSARecv, на нём срабатывает. Но при применении есть маленький недостаток, при выходе из приложение случается AV: инструкция по адресу ... обратилась к памяти по пдресу ... память не может быть read.

Ну и ещё образовались вопросы такие: зачем "экранировать" вызов ShowMessage, pushad - popad'ом?

Например при перехватывании recv оказывается в буфере у меня пакет принятый, необходимо его проверить, переработать чуток (вплоть до изменения размера пакета) и отдать в программу, какие тут могут быть рекомендации?
PM MAIL   Вверх
W4FhLF
Дата 3.12.2006, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Цитата

инструкция по адресу ... обратилась к памяти по пдресу ... память не может быть read.


Ну тут уже надо анализировать конкретную ситуацию, ничего однозначного сказать невозможно.

Код

Ну и ещё образовались вопросы такие: зачем "экранировать" вызов ShowMessage, pushad - popad'ом?


Это как доп. перестраховка, можешь убрать в прицнипе, команды pushad и popad соответственно сохраняют и восстаналивают значения всех регистров в/из стека.

Цитата

Например при перехватывании recv оказывается в буфере у меня пакет принятый, необходимо его проверить, переработать чуток (вплоть до изменения размера пакета) и отдать в программу, какие тут могут быть рекомендации?


Ну прежде всего при изменении размера не забывай про параметр len функции recv, это важно. Во-вторых я бы посоветовал при изменении размера(а если он будет изменяться в большую сторону, то это вообще незибежно) выделять новый буфер под даннеые и работать с ним, при это не забывай переписывать указатель в параметре Buf.




--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.