![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перехват функций
Piter © (2004-12-12 00:31:00)1) Внедряюсь в процесс с помощью DLL, перехватываю в том числе GetProcAddress, чтобы подставлять адрес заменяемой функции. Но вот при выгрузке DLL что делать? Секции импорта можно переправить обратно, а вот результаты GetProcAddress уже не поменяешь!
Процесс возможно где-то запомнил адрес измененной функции. А после выгруза DLL этот адрес уже недействителен и процесс вполне может вылететь по AV при вызове такой функции!
Есть какое-нибудь решение проблемы?
2) если процесс с помощью LoadLibrary загружает Some_1.dll, а у ней в таблице импорта прописана Some_2.dll - получается, что будут загружены обе DLL. Но если про загрузку Some_1.dll я могу узнать, перехватит LoadLibrary, то как узнать что загрузилась Some_2.dll (чтобы переправить и ее таблицу импорта)?
Рихтер такой ситуации не предусматривает, а мне кажется зря.
Хакер (2004-12-13 21:27:00) [1]Удалено модератором
Примечание: Просто потрепаться вы можете в соответствующей конференции
Piter (2004-12-13 00:51:00) [2]Игорь Шевченко © (12.12.04 22:50) [23]
Узнать индекс по имени
а как?
Игорь Шевченко (2004-12-12 22:50:00) [3]
> а если функция из библиотеки подключается статически по
> индексу, а не по имени, что делать то? Ведь в таблице импорта
> тогда не будет исправлено как надо, если я знаю только имя
> перехватываемой функции...
Узнать индекс по имени. Индекс есть всегда, имя - не всегда.
Piter (2004-12-12 19:14:00) [4]1) И еще вопросик образовался - а если функция из библиотеки подключается статически по индексу, а не по имени, что делать то? Ведь в таблице импорта тогда не будет исправлено как надо, если я знаю только имя перехватываемой функции...
2) вот проверил перехват RasDialA и RasDialW - в тест программе все перехватывается, а вот в стандартной Windows звонилке нет :(
Хотя окошко станлартной звонилки создается Explorer'ом, в который DLL спокойно внедряется...
Leonid Troyanovsky (2004-12-12 18:47:00) [5]
> Хакер © (12.12.04 17:20) [18]
> > Например, когда хотят сабклассировать чужое окно
> - я так KAD блокировал :))))
Ну, и на зачем? :)
--
С уважением, LVT.
Leonid Troyanovsky (2004-12-12 18:46:00) [6]
> Piter © (12.12.04 18:12) [19]
> Ну, а остальные - работают на специальном дескотопе,
> а что за десктопы? Для них какие-то особенные правила хуков
> или как вообще?
The SetWindowsHookEx function installs an application-defined hook procedure into a hook chain. You would install a hook procedure to monitor the system for certain types of events. These events are associated either with a specific thread or with all threads in the same desktop as the calling thread.
Т.е., ловится только с одного десктопа.
Ну, а где они живут почитай в msdn: Interactive Services
или где-то рядом.
Мне кажется у Alex Fedotov была статья на эту тему в rsdn(?)
--
С уважением, LVT.
Piter (2004-12-12 18:12:00) [7]Leonid Troyanovsky © (12.12.04 16:38) [15]
Ну, а остальные - работают на специальном дескотопе,
а что за десктопы? Для них какие-то особенные правила хуков или как вообще?
Хакер (2004-12-12 17:20:00) [8]Leonid Troyanovsky © (12.12.04 17:16) [17]
> Например, когда хотят сабклассировать чужое окно
- я так KAD блокировал :))))
Leonid Troyanovsky (2004-12-12 17:16:00) [9]
> Piter © (12.12.04 16:21) [12]
> Вопрос там возник, как оставить хук после
> завершения установившего его потока
> а интересно, зачем это нужно? Обычно вызывающее приложение
> как-то взаимодействие с библиотекой, а если вызывающее приложение
> завершилос, какой смысл в хуке?
Например, когда хотят сабклассировать чужое окно, вплоть
до завершения чужого приложения.
Может быть добавить некоторую функциональность, скажем,
пункт меню+обработчик. А может, наоборот, подавить.
Правда, лично у меня таких потребностей пока не возникало :)
Хотя, пример я сюда успел бросить - про окно диалога в Notepad.
--
С уважением, LVT.
Burmistroff (2004-12-12 16:53:00) [10]>Piter
Проведи эксперимент - запусти FlashGet в замороженном состоянии
(например так
var
SI: TStartupInfo;
PI: TProcessInformation;
begin
GetStartupInfo(SI);
si.wShowWindow:=sw_show;
CreateProcess(nil, 'notepad', nil, nil, False, CREATE_SUSPENDED, nil,
nil, SI, PI);
ResumeThread(pi.hThread);
Sleep(100);
SuspendThread(pi.hThread);
end;
)
Затем подключись отладчиком Delphi и установи breakpoint'ы на этот самый ShellNotify и посмотри доходит ли до них дело, и если доходит, то как.
Вообще говоря, ИМХО лучше исправлять начало самой функции (т.е. непосредственно данные по адресу больше где-то $7000000 - точно не помню. ну вобщем там где user32.dll или что-то в этом духе). Т.е. поставить jmp на функцию фильтрации. Тогда не будет и проблем с выгрузкой. А если в самой функции ShellNotify нет jmp'ов на первые 6 байт, то можно сделать и вообще потокобезопасный перехват
Leonid Troyanovsky (2004-12-12 16:38:00) [11]
> Piter © (12.12.04 16:18) [11]
> И у меня еще один вопрос появился - почему по хуку внедрение
> в сервисы не происходит? Работаю под администратором
Во-первых, часть сервисов - консольные приложения.
Ну, а остальные - работают на специальном дескотопе,
(или на своем, если запущены с неким пользовательским
аккаунтом).
--
С уважением, LVT.
Хакер (2004-12-12 16:38:00) [12]Piter © (12.12.04 16:18) [11]
> И у меня еще один вопрос появился - почему по хуку
> внедрение в сервисы не происходит?
имхо сервисы работают в другом декстопе
Piter (2004-12-12 16:35:00) [13]Leonid Troyanovsky © (12.12.04 15:50) [8]
Не знаю, как насчет всех, но посмотри такое:
http://groups.google.com/groups?selm=1059993591%40p25.f8.n454.z2.FidoNet.ftn
идея понял. Но все таки интересно - почему не могу перехватить вызов Shell_NotifyIcon в, например, FlashGet? Не перехватывается и все...
Не посылает же FlashGet напрямую сообщение WM_COPYDATA в Explorer?
И там упомянута TNotifyIconDataEx, может есть и Shell_NotifyIconEx ?
Piter (2004-12-12 16:21:00) [14]Leonid Troyanovsky © (12.12.04 16:15) [10]
Ну, я думал, может ты ссылку почитаешь :)
а я почитал
Вопрос там возник, как оставить хук после
завершения установившего его потока
а интересно, зачем это нужно? Обычно вызывающее приложение как-то взаимодействие с библиотекой, а если вызывающее приложение завершилос, какой смысл в хуке?
Piter (2004-12-12 16:18:00) [15]Leonid Troyanovsky © (12.12.04 15:50) [8]
А, длиные выходные? :)
угу :)
Плюс врожденное любопытство :)
И у меня еще один вопрос появился - почему по хуку внедрение в сервисы не происходит? Работаю под администратором
Leonid Troyanovsky (2004-12-12 16:15:00) [16]
> Piter © (12.12.04 16:01) [9]
> проблемы с заменой хука в 98.
> про какую замену хука ты говоришь?
Ну, я думал, может ты ссылку почитаешь :)
Вопрос там возник, как оставить хук после
завершения установившего его потока.
Кстати, код там приведен работает и в 9x (вспомнил!).
Просто, в NT в Sleep нет нужды.
> А никто ничего про [5] не подскажет?
Не я :)
--
С уважением, LVT.
Piter (2004-12-12 16:01:00) [17]Leonid Troyanovsky © (12.12.04 15:36) [7]
GetModuleFileName(Hinstance, buf, SizeOf(buf));
lib := LoadLibrary(buf);
ну я это и имел в виду :)
Leonid Troyanovsky © (12.12.04 15:36) [7]
сейчас подумал, что может быть с оной и не было
проблемы с заменой хука в 98.
про какую замену хука ты говоришь?
Может, ты говоришь про то, что в Win98 под отладчиком вместо указателя на функцию идет оп код перехода на эту функцию?
А никто ничего про [5] не подскажет?
Leonid Troyanovsky (2004-12-12 15:50:00) [18]
> Piter © (12.12.04 15:07) [5]
> Не получается перехватить функции в некоторых приложениях.
> Например, перехватываю Shell_NotifyIconA и Shell_NotifyIconW.
А, длиные выходные? :)
Не знаю, как насчет всех, но посмотри такое:
http://groups.google.com/groups?selm=1059993591%40p25.f8.n454.z2.FidoNet.ftn
--
С уважением, LVT.
Leonid Troyanovsky (2004-12-12 15:36:00) [19]
> Piter © (12.12.04 15:08) [6]
> можно сделать LoadLibrary из
> зацепленного потока
> О... а это идея... LoadLibray(hInstance)?
GetModuleFileName(Hinstance, buf, SizeOf(buf));
lib := LoadLibrary(buf);
> Правда, в 98 с этим были тонкости
> а какие?
Подзабыл уж. Хотя вот тут что-то про это.
http://groups.google.com/groups?selm=860347176%40p2.f175.n5020.z2.ftn
Правда, про LoadLibrary там ничего и нет (кроме того,
что в NT4 можно даже без оной - и зачем?).
А сейчас подумал, что может быть с оной и не было
проблемы с заменой хука в 98.
Т.е., можно попробывать. Только 9х нет под рукой.
--
С уважением, LVT.
Piter (2004-12-12 15:08:00) [20]Leonid Troyanovsky © (12.12.04 14:23) [4]
можно сделать LoadLibrary из
зацепленного потока
О... а это идея... LoadLibray(hInstance)?
Правда, в 98 с этим были тонкости
а какие?