![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| vtih |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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, например имя своего же ехе, ни к чему хорошему ни привели. |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 6 Всего: 121 |
vtih, что за бред ты несёшь? Ты внимательно прочёл статью о перехвате? Что значит из самой библиотеки? А твоя программа при вызове recv думаешь не к библиотеке обращается?
Ты вызываешь recv и программа через таблицу импорта вызывает процедуру из библиотеки, которая подгружена в адресное пространство твоего процесса, вот именно вначале этой функции и ставится переходник на функцию перехвата. Чтобы перехватывать только в своём процессе достаточно вызвать InjectDll или CreateProcessWithDll из advapihook, далее установится перехват на нужную тебе функцию только лишь в одном процессе. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| vtih |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
Да, сидел разбирался, вроде чуток понял.
Сделал dll для инжекта в требуемый экзэшник, но к сожалению не понимаю, почему не работает. Для примера не срабатывает ShowMessage на перехваченном Recv. Да и вообще программа отказывается работать с сетью, ну т.е. видимо connect делает, а при первом recv уже начинаются заморочки.
Заталкиваю dll через CreateProcessWithDll. |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 6 Всего: 121 |
Вот так попробуй:
PS Устанавливать перехват на recv из WSock32.dll смысла нет, ибо она обращается к WS2_32.dll Это сообщение отредактировал(а) W4FhLF - 3.12.2006, 12:15 -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| vtih |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
W4FhLF, увы, не помогло это, теперь просто сама программа отлично коннектится и принимает/отправляет данные...
|
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 6 Всего: 121 |
Ну а в чём тогда проблема? -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| vtih |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
Ну получается, что не перехватывается Recv, ибо я не вижу результат выполнения SendMessage. |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 6 Всего: 121 |
Ты уверен, что именно с помощью recv программа получает данные? Попробуй поставить перехват на WSARecv, так же было бы хорошо запустить программу под отладчиком и поставить бряк на recv, дабы посмотреть устаналивается ли переходник или нет.
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| vtih |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 2.12.2006 Репутация: нет Всего: нет |
Спасибо! Добавил WSARecv, на нём срабатывает. Но при применении есть маленький недостаток, при выходе из приложение случается AV: инструкция по адресу ... обратилась к памяти по пдресу ... память не может быть read.
Ну и ещё образовались вопросы такие: зачем "экранировать" вызов ShowMessage, pushad - popad'ом? Например при перехватывании recv оказывается в буфере у меня пакет принятый, необходимо его проверить, переработать чуток (вплоть до изменения размера пакета) и отдать в программу, какие тут могут быть рекомендации? |
|||
|
||||
| W4FhLF |
|
||||||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 6 Всего: 121 |
Ну тут уже надо анализировать конкретную ситуацию, ничего однозначного сказать невозможно.
Это как доп. перестраховка, можешь убрать в прицнипе, команды pushad и popad соответственно сохраняют и восстаналивают значения всех регистров в/из стека.
Ну прежде всего при изменении размера не забывай про параметр len функции recv, это важно. Во-вторых я бы посоветовал при изменении размера(а если он будет изменяться в большую сторону, то это вообще незибежно) выделять новый буфер под даннеые и работать с ним, при это не забывай переписывать указатель в параметре Buf. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
||||||
|
|||||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |