Однажды возникла надобность исследовать работу одной программы и
проконтролировать вызовы каких-то апишных функций. С помощью софтайса
сделать это было нереально, функций несколько, вызывались они много раз,
получали множество аргументов... Я решил переделать kernel, gdi и user,
чтобы в них отлавливать интересующие меня функции, анализировать аргументы,
результаты и т.д., если надо записывать все это в лог-файл или еще
куда-нибудь.
Не тут-то было. Дизассемблировал я кернел, а вот назад собрать не удалось.
Дело в том, что в нем была сделана статическая линковка с другими
библиотеками и некоторые использованые функции из них не имели имен, а
только порядковые номера. Более того, адреса находились в секции .rdata в
виде ячеек, которые заполнялись на стадии загрузки программы. Как их
прилинковать я так и не понял. .DEF-файл (где можно было бы указать
порядковый номер функции) линковщик из vc5 игнорировал, с другими
линковщиками
тоже что-то не заладилось, поэтому прилинковать библиотеки у меня сразу не
получилось. А потом и вся идея накрылась, я это дело бросил. Немного спустя,
я чтоб подшутить над кем-то переделал welcome.exe и там решил проблему
статической линковки топорно: сделал свой стартовый код в котором
происходила динамическая линковка и с помощью GetProcAddr заполнялись ячейки
в самом welcome. Затем вызывался код welcom'a, в секции .rdata которого были
записаны мною адреса вызываемых функций.
Вот вопрос: можно ли более изящно перехватывать вызовы функций апи? И, если
это невозможно (а я думаю что так), как собрать переделаную библиотеку из
Windows? Так что бы функции из статических библиотек линковались по
порядковым номерам. Напишите... если кто-то уже с этим сталкивался, то он
понял что я имею в виду...
best regards
Anton
> Я решил переделать kernel, gdi и user,
> чтобы в них отлавливать интересующие меня функции, анализировать
аргументы,
> результаты и т.д., если надо записывать все это в лог-файл или еще
> куда-нибудь.
> Не тут-то было. Дизассемблировал я кернел, а вот назад собрать не удалось.
Ну тут ты сильно погорячился :) Дизассемблировать кернел - это круто! Я вот
ndis дизассемблировал,
потом месяц назад собирал, хотя он и мелкий ~ 100 кил всего.
> А потом и вся идея накрылась, я это дело бросил. Немного спустя,
> я чтоб подшутить над кем-то переделал welcome.exe и там решил проблему
> статической линковки топорно: сделал свой стартовый код в котором
> происходила динамическая линковка и с помощью GetProcAddr заполнялись
ячейки
> в самом welcome. Затем вызывался код welcom'a, в секции .rdata которого
были
> записаны мною адреса вызываемых функций.
> Вот вопрос: можно ли более изящно перехватывать вызовы функций апи? И,
если
> это невозможно (а я думаю что так), как собрать переделаную библиотеку из
> Windows? Так что бы функции из статических библиотек линковались по
> порядковым номерам. Напишите... если кто-то уже с этим сталкивался, то он
> понял что я имею в виду...
Есть способ лучше! Я его не предлагал здесь, так как он тоже приводит с
изменению системных файлов, а это не есть хорошо. Имя этому способу -
Detours. Поясню - это такая либа, которая позволяет патчить исполняемый
файл, т.е. перехватывать любую функцию, если известен ее адрес (из dbg, из
export table или еще откуда-то). Перехват там делается следующим образом - в
начало исправляемой функции проставляет jmp на твою функцию, ну и далее все
ясно. Расписывать не буду, так как Detours идет с исходниками. Но если
отслеживать запуск приложений _только_ из 32-битных программ, то есть
способы еще лучше. Для этого нужно попасть в адресное пространство той
программы, которая является оболочкой для запуска Explorer, Windows
Commander, etc и поменять у нее import table.
--
Sincerely,
Arthur (ar...@penza.net)
А как собирал-то? И заработало потом?
> способы еще лучше. Для этого нужно попасть в адресное пространство той
> программы, которая является оболочкой для запуска Explorer, Windows
> Commander, etc и поменять у нее import table.
Мудрено это, ну да ладно, со временем разберусь... :)
--
best regards
Anton
05 ноября 2000 года (а было тогда 12:32)
Anton Krivoshejev в своем письме к All писал:
AK> Вот вопрос: можно ли более изящно перехватывать вызовы функций апи?
AK> И,
AK> если это невозможно (а я думаю что так), как собрать переделаную
AK> библиотеку из Windows? Так что бы функции из статических библиотек
AK> линковались по порядковым номерам. Hапишите... если кто-то уже с этим
AK> сталкивался, то он понял что я имею в виду...
Hе так давно в эхе PVT.VIRII спрашивали, как спрятать процесс в вин9х.
Мое решение той проблемы может помочь тебе решить эту :)
=== Файл GOLDED.OUT ===
─ Auto-added (2:5080/169.5) ─────────────────────────────────────── PVT.VIRII ─
Msg : 387 из 403 Snt Loc
От : Alexey Belash 2:5080/169.5 29 октября 00, 00:2
Кому : All 28 октября 00, 23:2
Тема : скрыть процесс в win32
───────────────────────────────────────────────────────────────────────────────
Привет All!
Вот вам несколько шагов для достижения сабжа:
Для того, чтобы некоторая задача не появлялась в списке процессов windows 9x,
я использую след. прием:
1. С помощью недокументированной функции kernel'a VxDCall (ординал 1) делается
доступной для модификации таблица экспорта того же kernel'a.
2. Выделяется участок shared memory, в котором размещаются функции-переходники
(warp) для функций: Process32First,Process32Next,Thread32First,Thread32Next,
Module32First,Module32Next. Алгоритм работы которых заключается в том, чтобы
вначале вызвать оригинальную функцию, и если она вернет значение, соотв.
текущей задаче, не возвращать его, а вызвать оригинальную функцию еще раз (для
следующего процесса, напр.) и вернуть уже ее значение. Тем самым достигается
то, что задачи, вызывающие функции-переходники вместо оригинальных, никогда не
получат параметры, соотв. защищаемой задаче.
3. Таблица экспорта kernel'a модифицируется так, чтобы адреса функций
Process32First,Process32Next,Thread32First,Thread32Next, Module32First,
Module32Next указывали на подготовленные ранее переходники в shared memory.
После этого, любая задача (напр. Proccess Viewer или плагин Far'a) запущенная
ПОСЛЕ вышеописанной модификации будет стандартным образом получать адреса
warp'ов вместо оригинальных функций, и следовательно, используя их, _HЕ СМОЖЕТ_
узнать о сущесвовании защищаемой программы :). Естесвенно, Far, запущенный
ранее, до модификации таблицы экспорта, уже будет иметь правильные адреса
соотв. функций, и будет продолжать видеть защищаемую программу :(.
А для того, чтобы процесс небыло видно по Ctrl+Alt+Del необходимо объявить
процесс как сервис, с помощью ф-ции SimpleServiceRegister
Лично реализовал под Builder и VC.
С уважением, Alexey 29 октября 2000 года 00:13
... Самое страшное - это когда человек достигает своей единственной цели.
-+- Destructive Labs, Ltd. <Web page: www.chat.ru/~dlab E-mail: dl...@chat.ru>
+ Origin: [Думаю... █████████████░░░░░░░░░░░░░ 50% completed.] (2:5080/169.5)
=== Конец ===
С уважением, Alexey 09 ноября 2000 года 10:59
... The god that failed.