Ответ я не отправлял, а как ты обнуляешь, что-то я начал пробовать разные варианты, типа такого, или ещё что надо? Код (Text): ;===================================================================== cmp [event.dwDebugEventCode],CREATE_PROCESS_DEBUG_EVENT jnz @f invoke WriteProcessMemory,[pinfo.hProcess],0x7ffdf068,a,4,0 invoke OpenProcess,PROCESS_ALL_ACCESS,0,[pinfo.dwProcessId] invoke WriteProcessMemory,eax,0x7ffdf068,a,4,0 invoke WriteProcessMemory,[event.CreateProcessInfo.hProcess],\ 0x7ffdf068,a,4,0 ;=====================================================================
типа так для [Peb.ProcessHeap+10h], нужно без фиксированных адресов естественно: Код (Text): .......................... assume eax:ptr t_thread mov ebx, [eax].reg.base[4*4] assume eax:nothing add ebx, 30h invoke ReadProcessMemory, hProcess, ebx, ADDR Buff, SIZEOF DWORD, NULL .IF eax != 0 mov ebx, Buff add ebx, 18h invoke ReadProcessMemory, hProcess, ebx, ADDR Buff, SIZEOF DWORD, NULL .IF eax != 0 mov ebx, Buff add ebx, 10h invoke ReadProcessMemory, hProcess, ebx, ADDR Buff, SIZEOF DWORD, NULL .IF eax != 0 .IF Buff != 0 mov Buff, 0 invoke WriteToMemory, hProcess, ebx, ADDR Buff, SIZEOF DWORD .ENDIF .ENDIF .ENDIF .ENDIF
Если ты борешся против 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! 1490185888__is_anti_debug.zip
bogrus Я не обратил внимание что вставил при первом LOAD_DLL_DEBUG_EVENT кроме процедуры обнуления Peb.NtGlobalFlag еще и процедуру сбрасывания Peb.BeingDebugged, видимо это из-за нее %) Странно, но почему после обнуления Peb.NtGlobalFlag при первом LOAD_DLL_DEBUG_EVENT мы все равно не получаем чистый [Peb.ProcessHeap+10h], я правда не пробовал манипуляции с включением дебажных строк, но мне почему-то кажется что это сути не изменит?
Проделал в точности все описанное в OllyDbg. Что-то у меня ничего не получилось, может сброшенный флаг Peb.BeingDebugged помешал?
Там в аттаче два экзешника, проверь isdebug.exe должен под OllyDbg говорить yes!, а если запустить под debug.exe он уже говорит no! У меня под w2k именно так, без разницы какой Peb.BeingDebugged, debug.exe настроен на адрес Peb.NtGlobalFlag = 0x7ffdf068
bogrus Гы, если Peb.BeingDebugged сброшен дебажная строка не приходит нельзя использовать фиксированные значения! bogrus поставь XP и будешь удивлен
Да знаю, я же не делаю код на широкую публику, просто для себя (чтобы причину найти и код остался минимальным для лучшего понимания), а там кто уже будет использовать пускай тестирует на всех виндах и расширяет Сбрасывай Peb.BeingDebugged после строки Так он такой же, только ещё с проверкой Peb.BeingDebugged, подкинь свой Tls.exe к этому debug.exe, вот что у меня: Код (Text): --------------------------- Debugger NOT Found. --------------------------- Peb.NtGlobalFlag: 00000000 --------------------------- Debugger NOT Found. --------------------------- [Peb.ProcessHeap+10h]: 00000000 --------------------------- IsDebuggerPresent Test --------------------------- Application Level Debugger NOT Found. --------------------------- 638173733__minidebugger.zip
Подправил я свои варианты IsDebuggerPresent_byLDR (первоначально какую-то фигню замутил с ABAB-ой Asterix > "у них строго определенное место или нужен какой-то поиск?" XP при загрузке процесса создает три кучи - ProcessHeap, LDR и какой-то Map. Под отладкой у всех этих куч HeapFlags <> 0 (dword по смещению 10h от начала кучи). Поэтому по хорошему нужно обнулять флаги не только у основной кучи, а у всех. Наверное можно использовать GetProcessHeaps, если конечно винда перечисляет служебные кучи в общем списке (я сам не проверял). Если не перечисляет, то добраться до кучи LDR можно так как я привел выше - округлить адрес PEB.LDR вниз на границу 10000h. С хвостовыми маркерами конечно посложнее, т.к.нужно прогуляться по куче. Куча состоит из блоков, каждый из которых имеет 8-байтовый заголовок вида: Код (Text): struct HeapBlockHeader ThisSize8 dw ? ;-8 общий размер данного блока в единицах 8 байт PrevSize8 dw ? ;-6 общий размер предыдущего блока в единицах 8 байт Tag1 db ? ;-4 Flags db ? ;-3 флаги ExtraBytes db ? ;-2 для занятого блока - число служебных байт, включая заголовок и хвост Tag2 db ? ;-1 ends ;0 <-- указатель, возвращаемый HeapAlloc или GlobalAlloc Кодировка флагов: 01h - used 02h - tail_checking (! отладка) 04h - free_checking (! отладка) 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.
Я же говорю, поставь XP и будешь удивлен, например тем что база PEB будет располагаться по разным адресам с каждой перезагрузкой, поэтому переделай пример так как нужно, иначе я не могу убедится в работоспособности и не смогу понять в чем причина неработоспособности метода Да, уже сделал. Хотя было бы не лишним оставить фичу вывода системных дебажных строк, но как совместить ее со сбросом флага Peb.BeingDebugged? Вот если бы можно было определить момент прихода последней системной дебажной строки. и только тогда сбросить флаг. Не такой, у меня проверки осуществляются в tls callback'е для усложнения эксперимента Мы вот тут обсуждаем, а потом эти проверки появляются в одном небезизвестном протекторе %)
Попробуй под XP этот, должно работать, как совместить Peb.BeingDebugged со строками прийдется ещё подумать _1616284744__minidebugger.zip
Под w2ksp4 и XPsp1 везде Debugger NOT Found, под NT4.0 тоже, кроме [Peb.ProcessHeap+10h]: 40000060, ты уверен что в протекторе этод метод используется? Он не совсем надежный
дык проблема то как раз обуздать метод [Peb.ProcessHeap+10h], с Peb.NtGlobalFlag проблем уже нет, его можно обнулять при первом LOAD_DLL_DEBUG_EVENT без проблем, вот только на [Peb.ProcessHeap+10h] это никак не сказывается :-(
Так махинация с OUTPUT_DEBUG_STRING_EVENT как раз приводит к тому что [Peb.ProcessHeap+10h] обнуляется (кроме NT4.0 и XPsp2 как я понял), но ведь ты можешь обнулять не Peb.NtGlobalFlag а сам [Peb.ProcessHeap+10h]? Хотя тогда это видимо не спасет от вариантов leo
Могу, тогда и махинация с OUTPUT_DEBUG_STRING_EVENT не нужна именно, а хотелось убить сразу всех зайцев
Или я чего не понял, или задачка решается просто (под XP) Первой грузится ntdll, которая и устанавливает NtGlobalFlag и создает загаженые кучи. Выход простой - при первом LOAD_DLL_DEBUG_EVENT сбросывать не NtGlobalFlag (под XP он и так = 0), а PEB.BeingDebugged, а при втором включить - если нужно получать INT3 и DebugString'и (ну затем сбросить когда вздумается). В этом сл. и NtGlobalFlag сбрасывать не надо - он и так остается = 0 и все кучи девственно чисты )
leo Хе-хе, голова! Работает и в W2K\NT4.0, это даже можно по CREATE_PROCESS_DEBUG_EVENT сделать (один раз)