12.07.2015 Views

img - Xakep Online

img - Xakep Online

img - Xakep Online

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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

CODINGАлександр Эккерт aleksandr-ehkkert@rambler.ruÏÎÒÀÅÍÍÛÅÑÀÄÛ WINDOWSÈññëåäóåì íåäðà îïåðàöèîííîé ñèñòåìûñ ïîìîùüþ äåáàããåðà è íå òîëüêîÓ Ñòèâåíà Êèíãà åñòü ïðîèçâåäåíèå «Ïîòàåííîå îêíî, ïîòàåííûéñàä». Íå ìîãó ñêàçàòü, ÷òî ÿ ëþáëþ òâîð÷åñòâî ýòîãî ïèñàòåëÿ, íîåñëè òû íå ÷èòàë ýòó êíèãó, íàñòîÿòåëüíî ñîâåòóþ íàéòè è ïðî÷åñòü.Î÷åíü çàíèìàòåëüíàÿ è îäíîâðåìåííî ïóãàþùàÿ êíèãà.  íåé ñîâñåé ïðèñóùåé Ñòèâåíó Êèíãó óæàñàþùåé êðàñîòîé èçëîæåíèÿðàññêàçûâàåòñÿ î òîì, êàêèå òàéíû ìîæåò õðàíèòü â ñåáå ñîçíàíèåëþáîãî ÷åëîâåêà.Вот и сегодня мы, наверное, не будем разговаривать на какую-то конкретнуютему. Мы просто немного полазаем в потаенном саду Windows,забравшись туда через потаенное окно дебаггера :). Я попробую рассказатьо скрытых местах, странностях и неизвестностях операционнойсистемы Windows. Эти знания помогут тебе, как программисту, лучшезнать, понимать и использовать эти самые потаенные места в своихгрязных целях.ÂÂÅÄÅÍÈÅДаже по прошествии многих лет, потраченных на изучение внутренностейоперационной системы и системного кодинга, понимаешь, что постичьвсе тонкости ОС вряд ли удастся. Я не имею в виду именно себя — такогомнения придерживаются многие программисты, с которыми я знаком.При этом зачастую единственным инструментом, позволяющим выпытатьте или иные секреты операционной системы, становится отладчик илидебаггер. Хотя не все любят возиться с отладчиком, положения дел это неменяет — если хочешь находить, простите за каламбур, потаенные окна вWindows — без него не обойтись. Итак, начнем.ÇÀÃÀÄÎ×ÍÛÉ ÏÀÐÀÌÅÒÐ LPRESERVED  DLLMAINВсем нам известна точка входа при старте библиотек — DllMain:BOOL WINAPI DllMain(__in HINSTANCE hinstDLL,112__in DWORD dwReason,__in LPVOID lpReserved);Принимает она (точка входа) три параметра. С первыми двумя всепонятно, но как быть с третьим? И действительно, зачем нужен этотпараметр lpReserved, если нигде в коде при инициализации библиотекион больше не используется? Оказывается не все так просто, как пытаетсяэто показать Microsoft.MSDN утверждает, что этот параметр используется при загрузке/выгрузкебиблиотеки; в частности, при статических операциях библиотеки этотпараметр содержит отличное от нуля значение. И, наоборот, при динамическихоперациях lpReserved будет равным нулю.Открою страшную тайну: lpReserved есть ничто иное, как указательна контекст стартующего процесса, который грузит библиотеку!Подробности таковы: при старте нового потока ядро ставит его вочередь для исполнения в виде APC — AsyncProcedureCall, которыйпередается в функцию LdrInitializeThunk, который вызывается Ntdll.dll.Одним из параметров, который передается LdrInitializeThunk, являетсяуказатель на структуру CONTEXT, которая описывает начальное состояниепотока — регистры, данные и т.п. После выполнения APC, контрольпередается LdrInitializeThunk. Раз уж исполнение нового потока начинаетсяс вызова ntdll!LdrInitializeThunk, то этой функции передаетсястартовый адрес, определенный функцией CreateThread. Таким образомXÀÊÅÐ 08 /139/ 10

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

Saved successfully!

Ooh no, something went wrong!