На что влияет NtGlobalFlag ?

Тема в разделе "WASM.WIN32", создана пользователем Asterix, 3 июн 2005.

  1. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Ответ я не отправлял, а как ты обнуляешь, что-то я начал пробовать разные варианты, типа такого, или ещё что надо?
    Код (Text):
    1. ;=====================================================================
    2. cmp     [event.dwDebugEventCode],CREATE_PROCESS_DEBUG_EVENT
    3. jnz     @f
    4. invoke  WriteProcessMemory,[pinfo.hProcess],0x7ffdf068,a,4,0
    5. invoke  OpenProcess,PROCESS_ALL_ACCESS,0,[pinfo.dwProcessId]
    6. invoke  WriteProcessMemory,eax,0x7ffdf068,a,4,0
    7. invoke  WriteProcessMemory,[event.CreateProcessInfo.hProcess],\
    8.         0x7ffdf068,a,4,0
    9. ;=====================================================================
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    типа так для [Peb.ProcessHeap+10h], нужно без фиксированных адресов естественно:
    Код (Text):
    1. ..........................
    2.        assume eax:ptr t_thread
    3.        mov ebx, [eax].reg.base[4*4]
    4.        assume eax:nothing
    5.        add ebx, 30h
    6.        invoke ReadProcessMemory, hProcess, ebx, ADDR Buff, SIZEOF DWORD, NULL
    7.        .IF eax != 0
    8.          mov ebx, Buff
    9.          add ebx, 18h
    10.          invoke ReadProcessMemory, hProcess, ebx, ADDR Buff, SIZEOF DWORD, NULL
    11.          .IF eax != 0
    12.            mov ebx, Buff
    13.            add ebx, 10h
    14.            invoke ReadProcessMemory, hProcess, ebx, ADDR Buff, SIZEOF DWORD, NULL
    15.            .IF eax != 0
    16.              .IF Buff != 0
    17.                 mov Buff, 0
    18.                 invoke WriteToMemory, hProcess, ebx, ADDR Buff, SIZEOF DWORD
    19.              .ENDIF
    20.            .ENDIF
    21.          .ENDIF
    22.        .ENDIF
     
  3. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Если ты борешся против isdebug по [Peb.ProcessHeap+10h], то выход я нашел такой (чтоб без правки реестра):

    - по первому LOAD_DLL_DEBUG_EVENT в Peb.NtGlobalFlag записать FLG_SHOW_LDR_SNAPS (включаем отладочные строки)

    - по первому OUTPUT_DEBUG_STRING_EVENT обнуляем Peb.NtGlobalFlag (строки уже не отключаются, но хип "стал на место")



    При CREATE_PROCESS_DEBUG_EVENT это не прокатывает, потому что Peb.NtGlobalFlag обнулен в это время, а после LOAD_DLL_DEBUG_EVENT там уже 0x70, обнуление без FLG_SHOW_LDR_SNAPS чет не помагает :), в общем на конкретный издебуг можно сделать новый антидебуг и наоборот :) вариантов наверное масса, я кстати так и не понял как это у тебя прога из отладки выходила, не удалось повторить



    Ещё прикол нашел, этот издебуг работает только при format pe gui 4.0 (в PE), при format pe gui всегда говорит yes! :)



    [​IMG] 1490185888__is_anti_debug.zip
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    bogrus





    Я не обратил внимание что вставил при первом

    LOAD_DLL_DEBUG_EVENT кроме процедуры обнуления

    Peb.NtGlobalFlag еще и процедуру сбрасывания

    Peb.BeingDebugged, видимо это из-за нее %)









    Странно, но почему после обнуления Peb.NtGlobalFlag

    при первом LOAD_DLL_DEBUG_EVENT мы все равно не получаем

    чистый [Peb.ProcessHeap+10h], я правда не пробовал манипуляции с включением дебажных строк, но мне

    почему-то кажется что это сути не изменит?
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576




    Проделал в точности все описанное в OllyDbg.

    Что-то у меня ничего не получилось,

    может сброшенный флаг Peb.BeingDebugged помешал?
     
  6. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Там в аттаче два экзешника, проверь isdebug.exe должен под OllyDbg говорить yes!, а если запустить под debug.exe он уже говорит no! У меня под w2k именно так, без разницы какой Peb.BeingDebugged, debug.exe настроен на адрес Peb.NtGlobalFlag = 0x7ffdf068
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    bogrus





    Гы, если Peb.BeingDebugged сброшен дебажная строка не приходит :derisive:







    нельзя использовать фиксированные значения!



    bogrus

    поставь XP и будешь удивлен :derisive:
     
  8. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576




    У меня есть свой isdebug.exe :)

    [​IMG] _768830307__Tls.exe
     
  9. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine




    Да знаю, я же не делаю код на широкую публику, просто для себя (чтобы причину найти и код остался минимальным для лучшего понимания), а там кто уже будет использовать пускай тестирует на всех виндах и расширяет :)







    Сбрасывай Peb.BeingDebugged после строки







    Так он такой же, только ещё с проверкой Peb.BeingDebugged, подкинь свой Tls.exe к этому debug.exe, вот что у меня:
    Код (Text):
    1. ---------------------------
    2. Debugger NOT Found.
    3. ---------------------------
    4. Peb.NtGlobalFlag: 00000000
    5. ---------------------------
    6. Debugger NOT Found.
    7. ---------------------------
    8. [Peb.ProcessHeap+10h]: 00000000
    9. ---------------------------
    10. IsDebuggerPresent Test
    11. ---------------------------
    12. Application Level Debugger NOT Found.
    13. ---------------------------
    [​IMG] 638173733__minidebugger.zip
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Подправил я свои варианты IsDebuggerPresent_byLDR (первоначально какую-то фигню замутил с ABAB-ой ;)



    Asterix

    > "у них строго определенное место или нужен какой-то поиск?"

    XP при загрузке процесса создает три кучи - ProcessHeap, LDR и какой-то Map. Под отладкой у всех этих куч HeapFlags <> 0 (dword по смещению 10h от начала кучи). Поэтому по хорошему нужно обнулять флаги не только у основной кучи, а у всех. Наверное можно использовать GetProcessHeaps, если конечно винда перечисляет служебные кучи в общем списке (я сам не проверял). Если не перечисляет, то добраться до кучи LDR можно так как я привел выше - округлить адрес PEB.LDR вниз на границу 10000h.



    С хвостовыми маркерами конечно посложнее, т.к.нужно прогуляться по куче.

    Куча состоит из блоков, каждый из которых имеет 8-байтовый заголовок вида:
    Код (Text):
    1. struct HeapBlockHeader
    2.   ThisSize8  dw ? ;-8  общий размер данного блока в единицах 8 байт
    3.   PrevSize8  dw ? ;-6  общий размер предыдущего блока в единицах 8 байт
    4.   Tag1       db ? ;-4
    5.   Flags      db ? ;-3  флаги
    6.   ExtraBytes db ? ;-2  для занятого блока - число служебных байт, включая заголовок и хвост
    7.   Tag2       db ? ;-1
    8. ends              ;0 <-- указатель, возвращаемый HeapAlloc или GlobalAlloc
    9. Кодировка флагов:
    10. 01h - used
    11. 02h - tail_checking (! отладка)
    12. 04h - free_checking (! отладка)
    13. 10h - last_block
    Два первых блока - служебные (заголовок кучи и таблица сегментов) и к ним отладочные маркеры ес-но не клеятся. Начиная с 3-го, всем блокам, выделенным при HeapFlags and 60h <> 0 (tail check) устанавливаются флаги tail_checking и free_checking и занятым блокам приписывается 8-ми байтовый хвостовой маркер 0AB..ABh, а свободные блоки заполняются сигнатурой 0FEEEh. Соответственно, если кучи создаются при NtGlobalFlag and 70h <> 0, то в тех блоках, которые ось успевает выделить установлены checking-флаги и приписаны хвостовые маркеры. Как это проверяется я привел в предыдущем посте. Ну а как пройтись по куче тоже понятно - берем размер блока, умножаем на 8 и смещаемся на следующий блок. И так пока не встретится последний блок с флагом 10h.
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576




    Я же говорю, поставь XP и будешь удивлен,

    например тем что база PEB будет располагаться

    по разным адресам с каждой перезагрузкой,

    поэтому переделай пример так как нужно, иначе

    я не могу убедится в работоспособности и не смогу

    понять в чем причина неработоспособности метода







    Да, уже сделал. Хотя было бы не лишним оставить фичу

    вывода системных дебажных строк, но как совместить ее

    со сбросом флага Peb.BeingDebugged? Вот если бы можно

    было определить момент прихода последней системной

    дебажной строки. и только тогда сбросить флаг.







    Не такой, у меня проверки осуществляются в tls callback'е

    для усложнения эксперимента :derisive:







    Мы вот тут обсуждаем, а потом эти проверки появляются

    в одном небезизвестном протекторе %)
     
  12. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    > "появляются в одном небезизвестном протекторе"

    Ничего не поделаешь - война миров ;)
     
  13. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Попробуй под XP этот, должно работать, как совместить Peb.BeingDebugged со строками прийдется ещё подумать

    [​IMG] _1616284744__minidebugger.zip
     
  14. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576




    не работает
     
  15. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Под w2ksp4 и XPsp1 везде Debugger NOT Found, под NT4.0 тоже, кроме [Peb.ProcessHeap+10h]: 40000060, ты уверен что в протекторе этод метод используется? Он не совсем надежный
     
  16. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576




    дык проблема то как раз обуздать метод [Peb.ProcessHeap+10h],

    с Peb.NtGlobalFlag проблем уже нет, его можно

    обнулять при первом LOAD_DLL_DEBUG_EVENT без проблем,

    вот только на [Peb.ProcessHeap+10h] это никак не

    сказывается :-(
     
  17. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine




    Так махинация с OUTPUT_DEBUG_STRING_EVENT как раз приводит к тому что [Peb.ProcessHeap+10h] обнуляется (кроме NT4.0 и XPsp2 как я понял), но ведь ты можешь обнулять не Peb.NtGlobalFlag а сам [Peb.ProcessHeap+10h]? Хотя тогда это видимо не спасет от вариантов leo
     
  18. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576




    Могу, тогда и махинация с OUTPUT_DEBUG_STRING_EVENT

    не нужна







    именно, а хотелось убить сразу всех зайцев
     
  19. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Или я чего не понял, или задачка решается просто (под XP)

    Первой грузится ntdll, которая и устанавливает NtGlobalFlag и создает загаженые кучи. Выход простой - при первом LOAD_DLL_DEBUG_EVENT сбросывать не NtGlobalFlag (под XP он и так = 0), а PEB.BeingDebugged, а при втором включить - если нужно получать INT3 и DebugString'и (ну затем сбросить когда вздумается). В этом сл. и NtGlobalFlag сбрасывать не надо - он и так остается = 0 и все кучи девственно чисты ;))
     
  20. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    leo Хе-хе, голова! Работает и в W2K\NT4.0, это даже можно по CREATE_PROCESS_DEBUG_EVENT сделать (один раз)