Debug bits в Win32

Тема в разделе "WASM.WIN32", создана пользователем _Poly_Glot_, 8 дек 2007.

  1. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Он имел в виду в user mode (r3).
    В ринг0 там свои прибамбасы

    dt - команда отладчика ядра kd, при чем тут ольки и проч?

    Freeman
    ну ясень пень что имелась в виду база сегмента с данным селектором =)


    чем не устраивает http://www.wasm.ru/forum/viewtopic.php?id=10118 ?
     
  2. _Poly_Glot_

    _Poly_Glot_ [poly] glot

    Публикаций:
    0
    Регистрация:
    25 июл 2007
    Сообщения:
    44
    Адрес:
    Санкт-Петербург
    А-a, он имел ввиду юзер моде, ясно.


    Что ж, видимо эта ссылка это лучшее что есть. Пару дней покурю это, а потом спрошу что непонял =)
     
  3. _Poly_Glot_

    _Poly_Glot_ [poly] glot

    Публикаций:
    0
    Регистрация:
    25 июл 2007
    Сообщения:
    44
    Адрес:
    Санкт-Петербург
    В общем, покурил я эту тему 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 хотя бы приблизительно соответствует реальности?
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    аттача не вижу
    догадайся +) загрузка новой длл.
    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 ?
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    _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 на корню, поэтому использовать антиотладочные штучки с кучами можно только "до кучи" ;)
     
  6. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    _Poly_Glot_
    Есть один ньюанс - в момент этого евента ДЛЛ еще не в списке
    Например на нее не сработает GetModuleFileName
     
  7. _Poly_Glot_

    _Poly_Glot_ [poly] glot

    Публикаций:
    0
    Регистрация:
    25 июл 2007
    Сообщения:
    44
    Адрес:
    Санкт-Петербург
    Здрасьте, сорри, что 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.
    Не угадал =) Просто пытаюсь разобраться для себя и самоудовлетворения, вдруг в будущем пригодится? =)))
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    На самом деле куча (она же хип от англ. 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), но хвостовые маркеры и флаги в заголовках блоков остаются
     
  9. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    оффтоп
    leo, с возвращением
     
  10. _Poly_Glot_

    _Poly_Glot_ [poly] glot

    Публикаций:
    0
    Регистрация:
    25 июл 2007
    Сообщения:
    44
    Адрес:
    Санкт-Петербург
    Спасибо leo.