Перехват вызовов Win32 API фукнций под Windows 95/98/NT
В этой статье я попробую описать метод исследования программ, которые я бы назвал
"нежным" в отличие от "жестких" методов, описанных ранее и включающих изменение
используемых программой модулей.
Вы, конечно, увидели простой MessageBox (нажмите на Cancel). Теперь закроем NOTEPAD,
пойдем в поддиректорию "GentleHack_9xRelease" и запустим там "samp1.exe".
Должен снова запуститься NOTEPAD. Наберем, снова, несколько символов в NOTEPAD и
опять Alt-F4.
"... It's a kind of magic..."
Теперь, собственно, разберемся, что же случилось? А случилось вот что:
только что вызов функции MessageBoxW() был перехвачен программой samp1.exe и выдает
что-то странное. Как это произошло? Все довольно просто. Обратите внимание на
поддиректорию "GentleHack_9xRelease". Там находяться следующие файлы:
samp1_inj.dll
syringe.dll
samp1.exe
Что это?
samp1.exe - это некая программа, которая инициализирует процессe "заражения"
samp1_inj.dll - это, собственно, "зараза", некий код, который встраивается в
NOTEPAD.EXE (или еще что-нибудь)
syringe.dll - это шприц, которым вся эта "зараза" будет впрыснута в NOTEPAD.EXE.
А как это происходит?
Посмотрим в samp1samp1.cpp. samp1 запускает NOTEPAD.EXE с флагом
CREATE_SUSPENDED, а затем делает:
...
!InjectModule(
ProcessInformation.hProcess, ProcessInformation.hThread,
szDllToInject, "HackMessageBox",
NULL, 0, (void**)&uResult, INFINITE
) /*!InjectModule*/
...
Собственно, это и есть АКТ, после которого NOTEPAD.EXE подхватывает "заразу".
Эта фукнция определена в syringe.dll и позволяет в любой процесс впрыснуть некую DLL и
запустить в этой DLL некую функцию (в данном случае DLL - это samp1_inj.dll,
а функция - "HackMessageBox").
Посмотрим samp1_injsamp1_ing.cpp. "HackedMessageBoxA" и "HackedMessageBoxW",
это то, во что превращается MessageBox. Обратите внимание на структуру TInjectInfo,
в ней содержатся необходимые описатели и могут быть переданы параметры
(смотрите "GentleHack_9xsyringesyringe.h").
Данный пример перехватывает только вызовы к DLL, которые уже загружены программой к
моменту запуска. Но кто мешает перехватить CreateProcess и/или LoadLibrary и
заражать позднее загружаемые DLL?
Данный пример не любит компиляций samp1.exe и samp1_inj.exe с BoundsChecker'ом.
Ну это ясно почему.
Модификация данного примера для "заражения" уже загруженой программы (для Windows NT) -
Данный пример позволяет изменить поведение для некой конкретной программы и на некое
определенное время. В следующей статье я опишу syringe.dll и приведу ее исходный текст.
Дополнительные примеры Вы найдете на
OK Thinking Software Web Page
или на
OK Thinking Software Web Page (mirror)
P.S. Эти материалы публикуются ТОЛЬКО в целях обучения. Автор не несет никакой
ответственности за любой ущерб, нанесенный в результате использования информации
и/или инструментов, представленных здесь.
P.P.S. Коллеги! Давайте уважать друг друга и не мучить "братьев наших меньших"...
Good Luck...
|