Он имел в виду в user mode (r3). В ринг0 там свои прибамбасы dt - команда отладчика ядра kd, при чем тут ольки и проч? Freeman ну ясень пень что имелась в виду база сегмента с данным селектором =) чем не устраивает http://www.wasm.ru/forum/viewtopic.php?id=10118 ?
А-a, он имел ввиду юзер моде, ясно. Что ж, видимо эта ссылка это лучшее что есть. Пару дней покурю это, а потом спрошу что непонял =)
В общем, покурил я эту тему http://www.wasm.ru/forum/viewtopic.php?id=10118 и вот как понял ситуацию: При загрузке программы в оперативную память первой загружается ntdll.dll, которая смотрит на PEB.Begin_debugged, и если флаг Begin_debugged выставлен, то ntdll.dll ставит значение NtGlobalFlag = 70h. Дальше Ntdll.dll создаёт три кучи (Heap) - LDR, ProcessHeap, map. У каждой кучи есть заголовок. При создании этих куч, если NtGlobalFlag = 70h, то в заголовок КАЖДОЙ кучи по смещению +10h помещается дворд 40000060h. Дальше вроде должны в конце каждого блока должны идти 10 байт "ABAB...", а у меня под отладчиком целая куча этих АВАВ (см. аттач). Почему их так много? Ведь по идее должно быть всего 3 строки АВАВАВАВАВ: по 1 в каждой куче... И ещё возникшии вопросы по ходу прочтения топика: 2) Как leo узнал, что у него созданы 3 кучи, и где он посмотрел их названия? 3) DebugBreakPoint - это типа когда мы стоим на ЕР? 4) Что такое LOAD_DLL_DEBUG_EVENT ? 5) Какой принцип замены начальных флагов через реестр? 6) Leo представил несколько IsDebuggerPresent, вот один: mov eax,fs:[30h] mov eax,[eax+0Ch] movzx eax,byte[eax-3] and eax, 2+4 ret Что находится в байте byte[eax-3] ? (Там написано, что какие-то флаги, но я не до конца понял) P.S. Да, и ещё: то, как я понял NtGlobalFlag хотя бы приблизительно соответствует реальности?
аттача не вижу догадайся +) загрузка новой длл. LOAD_DLL_DEBUG_EVENT 6 Reports a load-dynamic-link-library (DLL) debugging event. The value of u.LoadDll specifies a LOAD_DLL_DEBUG_INFO structure. HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\GlobalFlag ?
_Poly_Glot_ Не иначе как курсовую пишешь или научный труд 1) абабы приписываются не к заголовку кучи, а к каждому блоку памяти, выделенному в куче. Поэтому их и много, и поэтому хайддебагер должен прибивать NtGlobalFlag "в зародыше", а не когда загрузчких успел загадить все кучи этими абабами 2) число куч процесса сидит в PEB.NumberOfHeaps (PEB+88h), а массив указателей на кучи в PEB.ProcessHeaps (PEB+90h). Именно отсюда их и вытаскивает функция GetProcessHeaps -> ntdll.RtlGetProcessHeaps. Названия у кучи нет, есть назначение. Указатель на основную кучу процесса сидит в PEB.ProcessHeap (PEB+18h), на кучу LDR можно выйти через PEB.Ldr (PEB+Ch) 3) DbgBreakPoint - это "типа" первый вызов отладчика из ntdll, до EP еще топать и топать. Поставь в Оле первую паузу на system breakpoint и сам увидишь 4) LOAD_DLL_DEBUG_EVENT - это отладочное событие, которое генерит система для информирования отладчика о загрузке новой длл 5) не знаю 6) поищи инфу о структурах кучи типа HEAP_ENTRY, HEAP_SEGMENT и т.п. - там и флаги блока кучи найдешь PS: HideDebugger от Asterix'а убивает NtGlobalFlag на корню, поэтому использовать антиотладочные штучки с кучами можно только "до кучи"
_Poly_Glot_ Есть один ньюанс - в момент этого евента ДЛЛ еще не в списке Например на нее не сработает GetModuleFileName
Здрасьте, сорри, что 2 дня не подходил, с инетом туго. Спасибо огромное leo и Great. Я суть топика http://www.wasm.ru/forum/viewtopic.php?id=10118 понял (оказывается, полезно вникнуть в то, что кажется ужасно сложным), остались небольшие ньюансы. Сорри, видимо он отлепился, когда я сообщение редактировал, да это уже не важно, я просто хотел показать, сколько у мну этих АВАВАВ там, а leo уже объяснил, что их и должно быть много =) Ну эту ветку реестра юзают в вышеупомянутом топике, только я не понял принципа юзанья. Нужно в этой ветке реестра создать ключ с именем исследуемого файла и в нём прописать "GlobalFlag"="0" и "Debugger"="С:\olly\ollydbg.exe" ??? Где про это можно почитать? Я думал, куча это выделенный блок памяти, куда можно писать что-либо. После этой фразы я решил погуглить слово "куча" и во многих местах говорилось, что куча - это стек. Но по-моему это не так. Что есть куча на самом деле? В том топике ты предложил идею занулить РЕВ.Begin_debugged при LOAD_DLL_DEBUG_EVENT. HideDebugger от Asterix'а убивает РЕВ.Begin_debugged или же всё-таки NtGlobalFlag? Ещё в том топике была такая фраза: Это значит, что Asterix хотел обработать в плугине к оле сообщение Create_process_debug_event, которое присылает система? АВАВ - это в конце выделенного блока кучи, FEEE - этим заполнены свободные блоки кучи. BAADF00D - что есть это? Ну и несколько совсем маленьких вопросов и я полностью пойму тот топик: 1) LDR строка. Что это? 2) Что такое хип ? 3) Почему в РЕВ+0Ch лежит 00251ЕА0, хотя в массиве указателей есть только 00250000? 4) "Force flag" в "Olly advanced" обнуляет только ProcessHeap+10h? 5) Что делает в "Olly advanced" флаг "Heap flag"? P.S. Не угадал =) Просто пытаюсь разобраться для себя и самоудовлетворения, вдруг в будущем пригодится? =)))
На самом деле куча (она же хип от англ. heap) - это сложно-навороченная структура, содержащая заголовок, служебные структуры данных и собственно саму кучу выделенных и свободных блоков памяти различного размера. Под кучу процесса по умолчанию резервируется 1Мб адресного пространства, часть которого занимается под заголовок и служебные данные, а затем из этого же пространства выделяются блоки памяти для юзера. (Главная куча является растущей, т.е. если не хватит 1Мб, то будет выделен еще один большой сегмент данных и т.д.) В том то вся фишка, что NtGlobalFlag устанавливается только при РЕВ.Being_debugged = true, а если false, то как-будто никакого отладчика вовсе нет, поэтому и NtGlobalFlag = 0 и все структуры кучи девственно чисты как без отладки Да. Только обнуление Being_debugged при CREATE_PROCESS_DEBUG_EVENT "не понравилось" Оле, а при первом LOAD_DLL_DEBUG_EVENT все проходит нормально (см. топики #46 и #47) 1) LDR строка - это жаргонизм, сообщения загрузчика отладчику, передаваемые через OutputDebugString. Если Being_debugged = false, то и строки не передаются 2) хип - это heap (куча) 3) 00250000 - это начало LDR-кучи (адрес всегда выравнен на 10000), а 00251ЕА0 - это адрес одного из блоков в этой куче 4,5) Olly advanced обнуляет только флаги заголовка кучи _HEAP.Flags (+0Ch) и _HEAP.ForcedFlags (+10h), но хвостовые маркеры и флаги в заголовках блоков остаются