12.07.2015 Views

img - Xakep Online

img - Xakep Online

img - Xakep Online

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

codingАдреса загрузки ntdll.dll и kernel32.dll в процессах explorer.exe и firefox.exeстановится понятно (а уж под отладчиком — тем более!),что CreateThread должен передать через APC в вызовLdrInitializeThunk параметры старта процесса.Подведем итоги: в случае, если dwReason равен DLL_PROCESS_ATTACH (при загрузке библиотеки), lpReservedравен NULL для динамической загрузки и non-NULL длястатической загрузки.В случае, если fdwReason равен DLL_PROCESS_DETACH(при выгрузке библиотеки), lpReserved равен NUL привызове FreeLibrary и при ошибке загрузки DLL, и non-NULL — при окончании процесса.Зачем Microsoft скрывать этот факт? На самом деле, я бытоже его скрыл :). Подумай сам, сколько возможностейподмены контекста открывается при этом! Что? Ты никогдане слышал о контексте процесса? И системный вызовSetThreadContext тебе тоже ни о чем не говорит? Окей,рассмотрим. Во-первых, контроль над структурой CONTEXTдаст нам контроль над регистрами процессора. Все регистрыпроцессора при старте указываются в структуреCONTEXT (смотри описание этой структуры). Это могут бытьDEBUG-регистры для контроля над определенным приложениемили же установки перехватов вызовов функций.Или, кстати, установки флага TF в регистре EFLAGSВо-вторых, путем изменения lpReserved->Eip можно изменитьточку старта библиотеки. Эта особенность также можетбыть использована в определении версии ОС, котораяиспользуется на целевой машине путем выбора точки входав зависимости от версии ОС. Незаменимое свойство дляобеспечения переносимости кода, кстати.ÀÍÀËÎÃÈ×ÍÛÅ ÀÄÐÅÑÀ ÇÀÃÐÓÇÊÈ DLLИ действительно, если ты обращал внимание, такиебиблио теки как ntdll.dll, kernel32.dll и user32.dll для всехпроцессов всегда загружаются по одному и тому системномуадресу, хотя Microsoft это никак не объясняет. Почему?Как ты знаешь, указанные библиотеки представляютпрограммисту набор системных функций для работы ссистемой. К примеру, ntdll.dll является самой важной изюзермодных библиотек. Она представляет собой своеобразнуюзаглушку для вызова системных сервисов. И онадолжна быть загружена по одному и тому же адресу именнопо этой причине. Например, создание любого юзермодногопотока всегда происходит через вызов функцииntdll!LdrInitializeThunk. Функция ntdll!KiUserApcDispatcherXÀÊÅÐ 08 /139/ 10нужна системе для того, чтобы поставить в очередьисполнение юзермодных асинхронных вызовов. Ядрооперационной системы определяет адреса этих функцийеще на стадии инициализации системы. И, так как ядроиспользует скэшированные указатели на эти функции(для быстродействия), ntdll.dll уже не может быть загруженапо другим адресам. Kernel32.dll не может бытьзагружен по различным адресам, потому что большоеколичество предоставляемых этой библиотекой сервисовиспользуются системой для кросспроцессовых инъекцийкода. Например, kernel32.dll ответственна за обработчиксобытий консоли (что делает команда Ctrl+C в консоли,помнишь?). Так как консоль могут запустить многие программы,адрес обработчика Ctrl+C должен быть одним итем же. Ну а user32.dll постоянно загружается по одномуи тому же адресу по той простой причине, что онапредоставляет кучу сервисов, используемых win32k.sys— драйвера, реализующего оконную подсистему Windows.Указатели на эти функции win32k.sys получает черезвызов NtUserInitializeClientPfnArrays во время загрузки.ÎÄÍÎÏÎÒÎ×ÍÎÑÒÜ? ÍÅ ÒÓÒ-ÒÎ ÁÛËÎ!Часто ли ты используешь в своих программах отдельныепотоки? Если программа простая, и ей не требуется обрабатыватьбольшие массивы данных, вряд ли она для тебябудет многопотоковой. Но это только на первый взгляд.Потому что многие (если не все) Win32-приложения насамом деле являются многопотоковыми программами,даже если их разработчик утверждает обратное. К примеру,при старте программы сервисом подсистемы CSRSS впрограмме по умолчанию создается отдельный поток дляобработки консольных событий типа Ctrl+C/Ctrl+Break.Во-вторых, большинство Win32-API-функций длявыполнения своего кода используют отдельные потоки.Например, вызов WSAAsyncGetHostByName исполь зуетсинхронный вызов gethostbyname в отдельном потоке,после чего возвращает результаты запрашивающемучерез оконные сообщения.ÐÀÇÍÈÖÀ ÌÅÆÄÓ ÍÀÒÈÂÍÛÌÈ X86-ÂÅÐÑÈßÌÈ ÁÈÁËÈÎÒÅÊ È ÈÕ WOW64-ÀÍÀËÎÃÀÌÈМеханизм Wow64 включает в себя полный набор 32-битныхсистемных dll, реализующий Win32 API-функцииDVDdvdНа DVD ты сможешьнайти последнююверсию WinDBG,незаменимого отладчикапод ОС Windows,а также кое-какойинтересный код, которыйпозволит тебесделать свою системуболее защищенной.HTTP://WWWlinksДля более конкретногоизучения внутренностейОС Windowsобычных форумовнедостаточно.Очень часто золотыекрупинки можноотыскать в блогахсистемных программистов,таких какwww.alex-ionescu.com или http://j00ru.vexillium.org.113

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!