Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.30;
Скачать: CL | DM;

Вниз

Перехват функций   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2005.01.30;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.062 c
3-1104134539
Dell3r
2004-12-27 11:02
2005.01.30
Query не дает редактировать


1-1105772635
Шишкин Илья
2005-01-15 10:03
2005.01.30
TShellListView


3-1103603272
bers
2004-12-21 07:27
2005.01.30
Доброго времени суток, мастера! Тормоза при повторном выполнении


14-1105377546
KilkennyCat
2005-01-10 20:19
2005.01.30
Продолжение о самогоне.


3-1103808932
jenbond
2004-12-23 16:35
2005.01.30
решение проблемы с gds32.dll