Сейчас на форуме: (+8 невидимых) |
eXeL@B —› Основной форум —› Vmprotect. Хитрая защита от отладки. |
<< . 1 . 2 . 3 . 4 . 5 . >> |
Посл.ответ | Сообщение |
|
Создано: 24 мая 2017 20:14 · Поправил: Vamit · Личное сообщение · #1 При реверсе одной проги встретил хитрую защиту от отладки: она не позволяет работать проге под дебагером, после F9 терминация, приаттачиться к работающей то же нельзя - сразу терминация. Приложение накрыто последним Vmprotect, все функции защиты также под протектором, основные виртуализованы, остальные обфусцированы, а всего их более 200шт. Терминирует именно защита, а не вмпрот. В TLS сидят 2 каллбака защиты, первый из них есть в листинге. Дебаг работает только до первого каллбака, тут можно снять дамп проги и девиртуализовать вмпрот. А суть задачи такова: прога посылает запрос на сервер, в котором одним из куков является состояние защиты (32 бита), проэмулировать мне его не удалось и сервак не отвечает. Прошу любые идеи как победить, или идентифицировать защиту, она явно не самописная, и прилинкована к проге из какой-то либы. Вот листинг нескольких функций ядра защиты, вытащенных из под Vmprotect: Code:
----- Everything is relative... |
|
Создано: 05 июня 2017 19:00 · Личное сообщение · #2 Vamit Тоесть защита делится на две части - детект гипервизора и снятие тайминга. В нормальной оси(не под hvl) первая часть смысла не имеет, вторая же проблемна. Вот и сколько времени у вас ушло на то, что можно решить за пол часа если не секрет ? > Буду признателен если кто-то даст подробное описание инфы в этой области в зависимости от операционки, я ничего толкового не нашел. Очень давно была моя публикация, про эти таймеры, но мне нет смысла и желания её искать. hash87szf А ничо что есть предупреждение: Code:
Зачем туда лазить, раз матчасти не знаете. ----- vx |
|
Создано: 05 июня 2017 19:20 · Личное сообщение · #3 difexacaw пишет: Вот и сколько времени у вас ушло на то, что можно решить за пол часа если не секрет ? Я уже говорил, можешь - решай, пока что кроме чеса языком ничего толкового от тебя нет, т.ч. идите мимо... ----- Everything is relative... | Сообщение посчитали полезным: Bronco, zNob, v00doo, hlmadip, Larry |
|
Создано: 05 июня 2017 20:13 · Личное сообщение · #4 раз работа по паблику служебного кода продолжилась, плюсану. хотя честно сказать, после трёпа демотиваторов, не сколько неожиданно. эти отобьют желание паблить у любого. ----- Чтобы юзер в нэте не делал,его всё равно жалко.. | Сообщение посчитали полезным: v00doo |
|
Создано: 06 июня 2017 09:46 · Личное сообщение · #5 Проясните один вопрос - когда вызывается TLS callback? Понятен его вызов до EP с reason = DLL_PROCESS_ATTACH, но ещё имеется reason = DLL_THREAD_ATTACH, т.е. получается, что TLS callback экзешника будет вызываться каждый раз при создании в нем треда, это так? С DllMain всё понятно, но имеется же разница между dll и exe. И ещё один вопрос, можно ли запретить в системе вызов TLS callback с конкретным reason? ----- Everything is relative... |
|
Создано: 06 июня 2017 14:22 · Поправил: redlord · Личное сообщение · #6 Vamit http://www.nynaeve.net/?p=183 Vamit пишет: запретить в системе вызов TLS callback с конкретным reason? имхо, будет свал приложения, если придавить thread_attach. выделяется память для потока thread_detach - будет память течь https://msdn.microsoft.com/en-us/library/windows/desktop/ms686997(v=vs.85).aspx Add: The CRT code also provides a mechanism to allow a program to register a set of TLS callbacks, which are functions with a similar prototype to DllMain that are called when a thread starts or exits (cleanly) in the current process | Сообщение посчитали полезным: Vamit |
|
Создано: 06 июня 2017 14:54 · Личное сообщение · #7 redlord пишет: http://www.nynaeve.net/?p=183 Я эту статейку смотрел, в ней говорится что TLS callback экзешника идентичен DllMain библиотеки, но в ней нет явного указания, что он будет вызываться каждый раз при создании в нем треда, поэтому и спросил... Можно предположить, что если идентичен, то и вызовы будут идентичны. имхо, будет свал приложения, если придавить thread_attach. выделяется память для потокаthread_detach - будет память течь Это понятно, но вернемся к защите, её 3ий TLS callback имеет две ветки кода, для DLL_PROCESS_ATTACH, тут всё понятно - выполняется однократно, и для DLL_THREAD_ATTACH, которая должна выполняться для каждого нового треда, в ней выделение памяти отсутствует, так же отсутствует код и для DLL_THREAD_DETACH (и в постах к статье говорится что DLL_THREAD_DETACH для TLS не вызывается), поэтому и спросил про возможность блокировки вызова TLS callback для тредов. ----- Everything is relative... |
|
Создано: 06 июня 2017 15:53 · Личное сообщение · #8 |
|
Создано: 06 июня 2017 15:58 · Личное сообщение · #9 |
|
Создано: 06 июня 2017 18:22 · Личное сообщение · #10 |
|
Создано: 06 июня 2017 20:10 · Личное сообщение · #11 |
|
Создано: 09 июня 2017 10:35 · Поправил: Vamit · Личное сообщение · #12 Добрался до ядерных функций, но у меня проблема с их идентификацией, прошу помочь... В приведенном примере выполняется вызов 3х функций последовательно: Code:
Я так понимаю, что в зависимости от версии OS вызывается одна и та же функа (ординалы разные в eax) из системной либы. ----- Everything is relative... |
|
Создано: 09 июня 2017 10:48 · Поправил: vden · Личное сообщение · #13 Вот таблица http://j00ru.vexillium.org/ntapi/ Это вызов NtSetInformationThread | Сообщение посчитали полезным: Vamit, gggeorggge, DenCoder, bizkitlimp |
|
Создано: 09 июня 2017 11:14 · Личное сообщение · #14 Привет всем! Завершил анализ callback 1. Там все завершается созданием переходника в памяти защиты для функции DbgUiRemoteBreakin, который перепрыгивает первые две инструкции: push 8 push 7c950030 jmp 7c94ffea В callback 2 нашел код который сравнивает результаты вызовов оригинальной GetTickCount и эмулированной защитой. Сравнение выполняется по адресу 0x625891. |
|
Создано: 09 июня 2017 11:34 · Личное сообщение · #15 Нашел одну статейку Похоже, что такой алгоритм реализован в этой защите. Интересно имеют ли последние версии сциллы, фантома и стронга лекарство от этого? ----- Everything is relative... | Сообщение посчитали полезным: sefkrd |
|
Создано: 09 июня 2017 21:45 · Личное сообщение · #16 |
|
Создано: 12 июня 2017 11:39 · Поправил: gggeorggge · Личное сообщение · #17 Vamit пишет: Нашел одну статейку --> Link <-- Похоже, что такой алгоритм реализован в этой защите. Интересно имеют ли последние версии сциллы, фантома и стронга лекарство от этого? они патчат ntdll, а в данном случае защита делает вызов напрямую ntsetinfothread (ThreadHideFromDebugger) через sysenter. Насколько я понимаю тут нужны анти дебаг плагины, которые патчат ядро. Добавлено спустя 11 часов 17 минут В 3 callback из антидебага пока нашел вызов 3-х функций через sysenter: NtSetInformationThread ThreadHideFromDebugger NtQueryInformationProcess ProcessDebugObjectHandle NtRemoveProcessDebug и проверку на соответствие функций ntdll на диске и в памяти: KiFastSystemCall KiUserExceptionDispatcher KiRaiseUserExceptionDispatcher KiUserApcDispatcher NtClose NtContinue NtSetInformationThread NtQuerySystemInformation NtGetTickCount NtRaiseException NtAllocateVirtualMemory NtProtectVirtualMemory NtQueryInformationProcess |
|
Создано: 13 июня 2017 02:27 · Поправил: difexacaw · Личное сообщение · #18 gggeorggge Зачем патчить ядро ? Возврат из сентер выполняется на фиксированный адрес - KiFastSystemCallRet, без разницы откуда вызвали. Ki функции это колбеки из ядра в юм - "Kernel Interrupt", это нотификаторы, которые вызываются при возврате из сервисов, исклчениях, APC и обратных вызовах гуя и старте потоков. Смотрите обработку сентер в манах: Protected Mode Exceptions #GP(0) If IA32_SYSENTER_CS[15:2] = 0. Это значит что обнулив селектор в мср при вызове сентер управление будет передано на обработчик исключений в юм, а там можно это обычной векторной ловушкой обработать как угодно. ----- vx | Сообщение посчитали полезным: neprovad |
|
Создано: 13 июня 2017 13:50 · Поправил: Vamit · Личное сообщение · #19 Активация защиты. Callback TLS3 (619AB0) содержит две ветки кода для DLL_PROCESS_ATTACH и DLL_THREAD_ATTACH. Код проверки при создании нового потока довольно прост: if(WinXP SP3 && !Wine) NtSetInformationThread(0x0FFFFFFFE, ThreadHideFromDebugger, 0, 0) - вызов через sysenter далее если система х64, то восстанавливается FastSysCall for x64 в fs:[C0], сама проверка на "слом" этого адреса находится в ветке DLL_PROCESS_ATTACH. Завершает эту ветку функция SetThreadHideFromDebugger, выполняющая вызов NtSetInformationThread(hThread, ThreadHideFromDebugger, 0, 0) через sysenter, где hThread - хендл создаваемого потока. Код ветки DLL_PROCESS_ATTACH содержит 34 функции проверок: 1. Инициализация новой структуры защиты vProtectCore, в неё будут записываться результаты всех проверок. (Её тело будет выложено позже, по окончании разбора этой ветки кода) 2. Вызов функции SetThreadHideFromDebugger, рассмотрена выше. 3. CheckProcessDebugObjectHandle - Получают хендл hDebugObject вызывая NtQueryInformationProcess с ProcessDebugObjectHandle, если получили, то отладчик обнаружен. - Удаляют отладчик вызывая NtRemoveProcessDebug. 4. CheckQtAutoScreenScaleFactor Ищут в PEB -> ProcessParameters -> CommandLine строку L"QT_AUTO_SCREEN_SCALE_FACTOR", если найдена, то ExitProcess. Возможно это проверка на Иду, больше ничего на ум не пришло... 5. CheckFlagsAndVirtualProtect - Проверяют флаг отладки следующим образом: Code:
- Разрешают модификацию кода VirtualProtect с PAGE_EXECUTE_READWRITE и проверяют возможность изменения кода. - Возвращают флаги модификации обратно. 6. CheckCodeSectionsPE Проверяют изменение двух байт кода в начале каждой секции загруженного образа, если изменены, то ExitProcess. 7. CheckImageDllCharacteristicsDynamicBase Проверяют PE -> DLL Flags -> IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 8. CheckVirtualProtectSomeFunction Проверяется целостность кода функций vProtectCore и Callback TLS1. 9. DetectAntiAntiDebugTool - Создают новый NtCreateDebugObject с DEBUG_ALL_ACCESS - Получают информацию NtQueryObject, если кол-во TotalNumberOfObjects != 1, то обнаружено. 10. DetectSandBoxie Если запущена L"SbieDll.dll", то обнаружено. 11. CheckParentProcess Вызывают NtQueryInformationProcess с ProcessBasicInformation и проверяют ParentProcessId. 12. ResroreNtDllFunctions - Загружают с диска библиотеку ntdll.lib и сверяют начальные 32 байта следующих функций в либе и памяти: KiFastSystemCall, KiUserExceptionDispatcher, KiRaiseUserExceptionDispatcher, KiUserApcDispatcher, NtClose, NtContinue, NtSetInformationThread, NtQuerySystemInformation, NtGetTickCount, NtRaiseException, NtAllocateVirtualMemory, NtProtectVirtualMemory и NtQueryInformationProcess. - Если в памяти есть изменения, то восстанавливают 32 байта из оригинала. 13. CheckWow64cpuDll Выполняют проверку L"wow64cpu.dll" для х64 системы и анализируют FastSysCall for x64. Подробно я её не разбирал. 14. RestoreFastSysCallx64 Описана выше в ветке для DLL_THREAD_ATTACH. Пока всё... ----- Everything is relative... | Сообщение посчитали полезным: 4kusNick, DimitarSerg, Bronco, Nightshade, v00doo, ==DJ==[ZLO] |
|
Создано: 15 июня 2017 22:14 · Поправил: Vamit · Личное сообщение · #20 Продолжение... 15. DetectDebuggers Создают список процессов CreateToolhelp32Snapshot с TH32CS_SNAPPROCESS и ищут в нем идентификатор текущего процесса (pe.th32ProcessID == nCurrentProcessId). Вызывая NtQuerySystemInformation с SystemExtendedProcessInformation получают детальную информацию обо всех процессах и потоках, работающих в системе (pSysExtProcInfo). GetCurrentProcessNameFromPEB - получают имя текущего процесса. Ищут в pSysExtProcInfo текущий процесс по имени и получают его InheritedFromUniqueProcessId. Делают второй проход по pSysExtProcInfo и ищут процесс, у которого UniqueProcessId == найденному ранее InheritedFromUniqueProcessId. Сравнивают его имя с одним из следующего списка: ollydbg.exe, x64dbg.exe, x32dbg.exe, idaq64.exe, idaq.exe. Если найдено, то ExitProcess. 16. CheckTLSCallbackTable Если PE -> TLS RVA -> CallBack Table VA == 0, то ExitProcess. 17. CheckCodeKernelFunction Проверка целостности кода 5 функций обращения к ядру системы. 18. FindTempOllyDbg - Создают путь path = GetTempPath() + \A\ollydbg.exe - if((CreateFile(path, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING) != INVALID_HANDLE_VALUE) && (CreateFile(path, GENERIC_ALL, CREATE_ALWAYS, 0, OPEN_EXISTING) == INVALID_HANDLE_VALUE)), то ExitProcess. - Повторяют проверку для буковок B - H. 19. CheckKernelDebugger Вызывают функцию DbgPrompt("test", buf, 64), если срабатывает исключение, то ок, иначе фиксируют наличие ядерного отладчика. 20. CheckRing3Debugger Вызов NtQueryInformationProcess с ProcessDebugPort, если возвращает NumberDebuggers != 0, то обнаружено. 21. CheckInt2D Выполняют int 2D, если после инструкции код продолжает выполняться, то отладчик обнаружен. Если срабатывает исключение, то не обнаружен. 22. CheckCodeProtectFucntion Проверка целостности кода 63 функций защиты. 23. ??? Не смог найти тело пакетной функции, возможно найдется позже. 24. DetectKernelDebugger - Вызывают NtQuerySystemInformation с SystemKernelDebuggerInformation и получают флаги DebuggerEnabled и DebuggerNotPresent. Если DebuggerEnabled и !DebuggerNotPresent, то ядерный отладчик обнаружен. - Смотрят USER_SHARED_DATA -> KdDebuggerEnabled, если != 0, то обнаружен. 25. CheckDbgException Вызывают исключение RtlRaiseStatus с одним из случайно выбранных статусов DBG_RIPEXCEPTION, DBG_PRINTEXCEPTION_C или DBG_PRINTEXCEPTION_WIDE_C. Если не сработало или статусы в коде модифицированы, то отладчик обнаружен. Пока всё... ----- Everything is relative... | Сообщение посчитали полезным: sendersu, 4kusNick, gggeorggge |
|
Создано: 16 июня 2017 03:23 · Поправил: difexacaw · Личное сообщение · #21 Vamit > Я уже говорил, можешь - решай, пока что кроме чеса языком ничего толкового от тебя нет, т.ч. идите мимо... То что вы описали(по пунктам) в предыдущих двух постах было очень давно зарезолвено в тулзе(рутките) сайд(были реализованы даже маршрутизации для недетекта через валидацию кода), которую все когда то обосрали из за запуска под верифером(отсутствия гуя). Велком бэк Добавлено спустя 12 минут Вот я прошёл поиском за вас: ----- vx |
|
Создано: 16 июня 2017 22:38 · Поправил: Vamit · Личное сообщение · #22 Продолжение... 26. CheckTLSCallbackTableProcessHandle Фиксируют результат сравнения PE -> TLS RVA -> CallBack Table VA с хендлом процесса (0х0040000). 27. CheckApiMonitor Проверяют, запущены ли в системе следующие модули: apimonitor-drv-x86.sys, apioverride.dll, api_log.dll, intruder.dll. 28. BlockDbgUiIssueRemoteBreakin Блокируют функцию DbgUiIssueRemoteBreakin, записывая в её начальный адрес ret. 29. CheckBlockDbgUiIssueRemoteBreakin Проверяют, что функция DbgUiIssueRemoteBreakin заблокирована. 30. CheckReturnCode Проверяют что код после выхода из этой функции не модифицирован. 31. CheckPluginApiHooks - Вызывают VirtualQuery для текущего процесса. - Ищут во всех страницах памяти строки "PluginHooks TID", "Api_log doInject" и код Code:
- Если найдено, то плагин обнаружен. 32. RestoreFuncNtQueryInformation - Выполняют VirtualProtect с PAGE_EXECUTE_READWRITE для первых 8 байт функций NtQuerySystemInformation и NtQueryInformationProcess. - Вход в EnterCriticalSection - Копируют 8 байт в функции из соответствующих функций файла ntdll.dll - Выход из LeaveCriticalSection 33. CheckVerifications Проверяют, что проверки 8, 30, 6, 12, 15, 31, 5, 10, 21, 25, 22, 3, 4 выполнены и библиотека ntdll.dll была загружена с диска для проверки функций. 34. CheckWine Если Wine и функция wine_get_unix_file_name отсутствует в библиотеке kernel32.dll, то ExitProcess. На этом Callback TLS3 заканчивается. ----- Everything is relative... |
|
Создано: 18 июня 2017 15:02 · Личное сообщение · #23 |
|
Создано: 18 июня 2017 15:26 · Личное сообщение · #24 |
|
Создано: 19 июня 2017 09:25 · Личное сообщение · #25 |
|
Создано: 19 июня 2017 10:05 · Личное сообщение · #26 AntiAttach В производную функцию от CWinApp::OnIdle и ещё в несколько периодически повторяющихся функций вставлена функция защиты, выполняющая следующие проверки: - Если TLS Callback3 не вызывался, то вызвать. - CheckDbgException - RestoreFuncNtQueryInformation - CheckApiMonitor - CheckRing3Debugger - CheckCodeKernelFunction - RestoreFastSysCallx64 - CheckWine Все они были рассмотрены ранее. - Новая проверка DetectVehdebugDll Проверяют, запущена ли библиотека "vehdebug-i386.dll", если запущена, то ExitProcess. gggeorggge пишет: 0xea4a9d Это вмпротовский адрес, вот найти бы на него переход из сегмента кода... ----- Everything is relative... |
|
Создано: 19 июня 2017 16:26 · Личное сообщение · #27 |
|
Создано: 19 июня 2017 17:49 · Поправил: Vamit · Личное сообщение · #28 difexacaw пишет: ветвление на адрес 0xEA4A9D ? Да, простой jmp на него из сегмента кода проги, а вообще есть какая-нибудь утиль для поиска по неразмеченному (недизасемблированному) коду безусловных переходов на фиксированные адреса? Тут нужно просматривать каждый байт на Е9 (jmp) и последующие 4 байта из офсета преобразовывать в адрес, самому писать не охота... У меня таких не найденных адресов аж 7 штук. А смысл такой, например, функа просто мутирована вмпротом и если из неё вызывается виртуализованная функа, то вместо call RealAddr, в ней будет call EntryPoint в виртуализованное тело. Но на эту же точку из реального кода должен быть jmp EntryPoint, вот его и надо найти. 0xEA4A9D - это как раз EntryPoint. ----- Everything is relative... |
|
Создано: 19 июня 2017 21:46 · Поправил: difexacaw · Личное сообщение · #29 От модератора: Яндекс заблочен в Украине, просьба заливать на мировой ресурс Vamit Да, я под визором запустил. Появился гуй но ветвлений на нужный адрес не обнаружено. Но следуеть понимать что у меня тулз сырой в разработке. Стоят шлюзы на старт потоков, APC и теневые колбеки. Отсюда начинается исполнение любого потока, при этом памяти не нужен EX атрибут(для всего АП, за исключением среды визора), смотрите в другой теме видос вчера снимал Я пробовал депротектить память от исполнения, приложение тихо снимается через некоторое время.. Это проблемы обработки исключений, я исправлю это. Исключения нормально не обрабатываются(не реализовано пока полноценно), а ваш семпл генерит их огромное число судя по таймингу с включённой их обработкой. Впрочем это не простой семпл, я не ответил сразу, хотя сразу потестил, потому что возникли серьёзные проблемы с инструментом, я потом есчо запущу, нужно немного покодить. Смысл понятен - обнаружить не стековое ветвление. Это нельзя сделать не раскодируя поток инструкций. ----- vx |
|
Создано: 20 июня 2017 00:08 · Личное сообщение · #30 >>А смысл такой, например, функа просто мутирована вмпротом и если из неё вызывается виртуализованная функа, то вместо call RealAddr, в ней будет call EntryPoint в виртуализованное тело. Но на эту же точку из реального кода должен быть jmp EntryPoint, вот его и надо найти. 0xEA4A9D - это как раз EntryPoint. А разве у виртуализированной функи не может быть несколько разных входов в ВМ? Скажем, первые несколько блоков пикода различаются, а дальше VM_PIC сливается с основным потоком. |
|
Создано: 20 июня 2017 00:29 · Личное сообщение · #31 srm60171 Перед передачей управления контекст может быть намеренно уничтожен, что бы нельзя было узнать откуда произошло ветвление. > От модератора: Яндекс заблочен в Украине, просьба заливать на мировой ресурс Это заливалось для пиндосов, даже если бы и для лично вас с укр, то полагаю это не может быть проблемой. Первой ссылкой на анонимайзер воспользуйтесь или у вас гугл тоже забанен ----- vx |
<< . 1 . 2 . 3 . 4 . 5 . >> |
eXeL@B —› Основной форум —› Vmprotect. Хитрая защита от отладки. |