Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
Время: 3.299 c
1-1105706778
JohnKorsh
2005-01-14 15:46
2005.01.30
Как в старом TP7 под DOS организовать очень большой массив ?


4-1102961158
Bes
2004-12-13 21:05
2005.01.30
Оповещение основной программы о выгрузке DLL...


14-1105271522
Чеширский_Кот
2005-01-09 14:52
2005.01.30
Чужие


1-1105951254
Mouse_web
2005-01-17 11:40
2005.01.30
Стоимость работ


14-1105281755
AdmeraL
2005-01-09 17:42
2005.01.30
бинарные данные?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский