Форум: "WinAPI";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
ВнизПерехват функций Найти похожие ветки
← →
Piter © (2004-12-12 00:31) [0]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-12 01:00) [1]Удалено модератором
Примечание: Offtopic
← →
Игорь Шевченко © (2004-12-12 11:56) [2]
> Есть какое-нибудь решение проблемы?
Не выгружать DLL.
> то как узнать что загрузилась Some_2.dll (чтобы переправить
> и ее таблицу импорта)?
Например, перебрать все загруженные модули и откорректировать таблицы импорта.
← →
Piter © (2004-12-12 12:51) [3]Игорь Шевченко © (12.12.04 11:56) [2]
Не выгружать DLL.
ну понятно... но если процесс, установивший хук, завершается?
Например, перебрать все загруженные модули и откорректировать таблицы импорта
в общем, так и думал... хотя может еще какие способы есть?
← →
Leonid Troyanovsky © (2004-12-12 14:23) [4]
> Piter © (12.12.04 12:51) [3]
> Не выгружать DLL.
> ну понятно... но если процесс, установивший хук, завершается?
Hook - это собственность потока, его установившего.
А чтоб либа не выгрузилась, можно сделать LoadLibrary из
зацепленного потока. Пример такой я недавно здесь приводил.
Правда, в 98 с этим были тонкости.
--
С уважением, LVT.
← →
Piter © (2004-12-12 15:07) [5]Не получается перехватить функции в некоторых приложениях. Например, перехватываю Shell_NotifyIconA и Shell_NotifyIconW.
Внедряюсь по хуку GetMessage.
Перехватываю LoadLibraryA, LoadLibraryW, LoadLibraryExA, LoadLibraryExW для определения загрузки новых модулей.
Перехватываю GetProcAddress.
Получается перехватить, например, значок языка (Ru/En), CpuIdle, Значок сетевого подключения.
Но вот значок регулятора громкости не перехватывается, также как и значок Outpost Firewall, также как и значок принтера, значки FlashGet и Demon Tools также не перехватываются.
Вот сижу и думаю - почему? Вроде все рабочее, отдельные части кода могу привести...
Судя по Exe"шнику того же FlashGet - он использует Shell_NotifyKIconA. А почему тогда не перехватывается?
Может, еще какие функции есть для добавления значка в трей?
Может, кто пробовалл перехват этих программ?
← →
Piter © (2004-12-12 15:08) [6]Leonid Troyanovsky © (12.12.04 14:23) [4]
можно сделать LoadLibrary из
зацепленного потока
О... а это идея... LoadLibray(hInstance)?
Правда, в 98 с этим были тонкости
а какие?
← →
Leonid Troyanovsky © (2004-12-12 15:36) [7]
> 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.
← →
Leonid Troyanovsky © (2004-12-12 15:50) [8]
> 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.
← →
Piter © (2004-12-12 16:01) [9]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 16:15) [10]
> Piter © (12.12.04 16:01) [9]
> проблемы с заменой хука в 98.
> про какую замену хука ты говоришь?
Ну, я думал, может ты ссылку почитаешь :)
Вопрос там возник, как оставить хук после
завершения установившего его потока.
Кстати, код там приведен работает и в 9x (вспомнил!).
Просто, в NT в Sleep нет нужды.
> А никто ничего про [5] не подскажет?
Не я :)
--
С уважением, LVT.
← →
Piter © (2004-12-12 16:18) [11]Leonid Troyanovsky © (12.12.04 15:50) [8]
А, длиные выходные? :)
угу :)
Плюс врожденное любопытство :)
И у меня еще один вопрос появился - почему по хуку внедрение в сервисы не происходит? Работаю под администратором
← →
Piter © (2004-12-12 16:21) [12]Leonid Troyanovsky © (12.12.04 16:15) [10]
Ну, я думал, может ты ссылку почитаешь :)
а я почитал
Вопрос там возник, как оставить хук после
завершения установившего его потока
а интересно, зачем это нужно? Обычно вызывающее приложение как-то взаимодействие с библиотекой, а если вызывающее приложение завершилос, какой смысл в хуке?
← →
Piter © (2004-12-12 16:35) [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 ?
← →
Хакер © (2004-12-12 16:38) [14]Piter © (12.12.04 16:18) [11]
> И у меня еще один вопрос появился - почему по хуку
> внедрение в сервисы не происходит?
имхо сервисы работают в другом декстопе
← →
Leonid Troyanovsky © (2004-12-12 16:38) [15]
> Piter © (12.12.04 16:18) [11]
> И у меня еще один вопрос появился - почему по хуку внедрение
> в сервисы не происходит? Работаю под администратором
Во-первых, часть сервисов - консольные приложения.
Ну, а остальные - работают на специальном дескотопе,
(или на своем, если запущены с неким пользовательским
аккаунтом).
--
С уважением, LVT.
← →
Burmistroff (2004-12-12 16:53) [16]>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 17:16) [17]
> Piter © (12.12.04 16:21) [12]
> Вопрос там возник, как оставить хук после
> завершения установившего его потока
> а интересно, зачем это нужно? Обычно вызывающее приложение
> как-то взаимодействие с библиотекой, а если вызывающее приложение
> завершилос, какой смысл в хуке?
Например, когда хотят сабклассировать чужое окно, вплоть
до завершения чужого приложения.
Может быть добавить некоторую функциональность, скажем,
пункт меню+обработчик. А может, наоборот, подавить.
Правда, лично у меня таких потребностей пока не возникало :)
Хотя, пример я сюда успел бросить - про окно диалога в Notepad.
--
С уважением, LVT.
← →
Хакер © (2004-12-12 17:20) [18]Leonid Troyanovsky © (12.12.04 17:16) [17]
> Например, когда хотят сабклассировать чужое окно
- я так KAD блокировал :))))
← →
Piter © (2004-12-12 18:12) [19]Leonid Troyanovsky © (12.12.04 16:38) [15]
Ну, а остальные - работают на специальном дескотопе,
а что за десктопы? Для них какие-то особенные правила хуков или как вообще?
← →
Leonid Troyanovsky © (2004-12-12 18:46) [20]
> 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.
← →
Leonid Troyanovsky © (2004-12-12 18:47) [21]
> Хакер © (12.12.04 17:20) [18]
> > Например, когда хотят сабклассировать чужое окно
> - я так KAD блокировал :))))
Ну, и на зачем? :)
--
С уважением, LVT.
← →
Piter © (2004-12-12 19:14) [22]1) И еще вопросик образовался - а если функция из библиотеки подключается статически по индексу, а не по имени, что делать то? Ведь в таблице импорта тогда не будет исправлено как надо, если я знаю только имя перехватываемой функции...
2) вот проверил перехват RasDialA и RasDialW - в тест программе все перехватывается, а вот в стандартной Windows звонилке нет :(
Хотя окошко станлартной звонилки создается Explorer"ом, в который DLL спокойно внедряется...
← →
Игорь Шевченко © (2004-12-12 22:50) [23]
> а если функция из библиотеки подключается статически по
> индексу, а не по имени, что делать то? Ведь в таблице импорта
> тогда не будет исправлено как надо, если я знаю только имя
> перехватываемой функции...
Узнать индекс по имени. Индекс есть всегда, имя - не всегда.
← →
Piter © (2004-12-13 00:51) [24]Игорь Шевченко © (12.12.04 22:50) [23]
Узнать индекс по имени
а как?
← →
Хакер © (2004-12-13 21:27) [25]Удалено модератором
Примечание: Просто потрепаться вы можете в соответствующей конференции
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.079 c