![]() |
eXeL@B —› Вопросы новичков —› Обнаружение образа dll |
Посл.ответ | Сообщение |
|
Создано: 26 июля 2011 05:25 · Личное сообщение · #1 В прошлом году попался триальный клиент под Темидой, который для своей работы подгружал из сети динамическую библиотеку и внедрял ее образ в целевой процесс. Тогда заморачиваться распаковкой большого смысла не имело, проблему триала решил подменой пакетов. Сейчас понадобилось посмотреть пару моментов по принципу работы библиотеки, но как оказалось, принимаемый файл искажен и является "не валидным PE", видимо клиент его модифицирует перед инжектом. В общем встал вопрос - можно ли найти и сдампить "готовый" образ dll, если эта DLL не видна в списке загруженных процессом модулей (в клиенте видимо собственный загрузчик)? Под Вин7(32) ни скриптов под Темиду, ни плагов для скрытия отладчика от нее не нашел =\ ![]() |
|
Создано: 26 июля 2011 07:52 · Личное сообщение · #2 |
|
Создано: 26 июля 2011 08:34 · Личное сообщение · #3 |
|
Создано: 26 июля 2011 10:29 · Поправил: ARCHANGEL · Личное сообщение · #4 VOLKOFF А в чём проблема, если система 32-х разрядная? Ведь и фантик, и стронг должны работать. Скрипты от LCF работают прекрасно. Там ещё желательно мувики от него глянуть, чтоб понять, что нужно делать, но можно и так разобраться. можно ли найти и сдампить "готовый" образ dll, если эта DLL не видна в списке загруженных процессом модулей Если юзается самопальный загрузчик, то тут возникает вопрос, как далеко этот загрузчик продвинулся, чтоб максимально поддерживать возможности загрузчика Windows (того, который в ntdll.dll). Дело в том, что если нужно поддерживать API по работе с ресурсами, то нужно в память вставлять заголовок этой либы, если в ней есть экспортируемые функции, то GetProcAddress их уже не найдёт, и её работу нужно будет эмулировать. Про CALLBACKи - вообще отдельная тема, они не будут работать в таком модуле вовсе, потому что это и не модуль совсем для лоадера. А вот если этого ничего не нужно, то вполне вероятно, что таблицу импорта и релоки нужно будет настраивать из загрузчика, который может быть (и, скорее всего, там и есть) в файле, запротекченом фемидой, а заголовка там нет вообще. Но, опять таки, некоторые ограничения всё же есть - т.е. образ всё равно должен быть непрерывным, а значит найти и сдампить секции всё же можно, а потом можно вручную допилить заголовок. Для дизасма вполне сгодится, и, возможно, вы найдёте способ патчить эту либу, не воссоздавая её из пепла. А згачит всё снова вернётся к перехвату пакетов. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 26 июля 2011 13:08 · Личное сообщение · #5 |
|
Создано: 26 июля 2011 13:54 · Поправил: ARCHANGEL · Личное сообщение · #6 VOLKOFF Другое дело - если вы интересуетесь этой задачей с целью написания эффективного алгоритма поиска таких библиотек, и ломаемый софт тут ни при чём, а именно ваш софт ломают с помощью подгрузки такой вот либы, которую вы не можете спалить. В таком случае никто вам тут помогать не станет, поэтому я бы вам советовал всё ж назвать программу и выложить её на всеобщее обозрение. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 26 июля 2011 15:55 · Поправил: VOLKOFF · Личное сообщение · #7 ARCHANGEL, спасибо. А в чём проблема, если система 32-х разрядная? Ведь и фантик, Почему тогда Скрипты от LCF работают прекрасно Опять же внутри в ридми в них написано: The script is XP only, VISTA has a different stack antidump ![]() ![]() |
|
Создано: 27 июля 2011 11:04 · Поправил: ARCHANGEL · Личное сообщение · #8 VOLKOFF Возможно, проблема не в том, что они "не идут". Они идут, если их пересобрать с WDK под семёрку, правда, я так понял, что к стронгу это не относится, а фантик там нужен только для сокрытия железных бряков. Скрипты те, не обратил внимания про этот коммент. Может, и не работают на висте и семёрке, но на ХР - как часы. Так подождите, а вторая олька от Veliant'a пропатченная должна грузить Фиму на любой оси. Вот только скриптов, ясное дело, не найдёте под неё. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 27 июля 2011 18:00 · Поправил: bowrouco · Личное сообщение · #9 |
|
Создано: 28 июля 2011 10:14 · Поправил: ARCHANGEL · Личное сообщение · #10 bowrouco пишет: MemoryMappedFilenameInformation(psapi!GetMappedFileName()) для файловой проекции. Олень детектид! Почитали бы матчасть, что ли. Или этот "большой быссмысленный текст". Вам же описали проблему, что код эмулирует загрузчик. Нихрена там psapi не найдут. Тут вот что применяется: ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 28 июля 2011 12:21 · Личное сообщение · #11 ARCHANGEL Это ты олень ёба. ТС не сказал что образ не проекция и не файловая. И посты твои глупые и высокомерные. Да и про матчасть малчал бы лучше, у тебя разрыв шаблона, изза излишка терминов(KiTrap etc), которые между собой не стыкуются, в силу не знания этой самой матчасти. Когда придёт полное логичное осознание, тогда будешь отсылать других её учить. Оминь. ![]() |
|
Создано: 28 июля 2011 12:50 · Личное сообщение · #12 |
|
Создано: 28 июля 2011 14:43 · Поправил: Модератор · Личное сообщение · #13 bowrouco пишет: ТС не сказал что образ не проекция и не файловая Как это? А это что? можно ли найти и сдампить "готовый" образ dll, если эта DLL не видна в списке загруженных процессом модулей (в клиенте видимо собственный загрузчик) у тебя разрыв шаблона, изза излишка терминов(KiTrap etc), которые между собой не стыкуются, в силу не знания этой самой матчасти Какой, нах, KiTrap? Где он, по-твоему, тут упоминается? ... Archer Ну не сдержался. Ну уже никакого терпения на таких не хватает. Пишут чёрте что. Да, бывает, что людям не понятно какое-то суждение, они пытаются разобраться, задают уточняющие вопросы. А тут без разбора мелет какую-то хрень, да ещё и вместо чего-то дельного предлагает какую-то ерунду. У всех бывают косяки. Вот я, например, провтыкал вначале, что ТС интересуется, есть ли скрипты для распаковки Фимы под семёрку. Ну так нет же ничего стыдного признаться в каком-то промахе. А это bowrouco написало не глядя какую-то критику, и троллит себе дальше. Теперь по теме: Чтоб сдетектить наличие в памяти такого образа попробуй искать по паттернам FF 15 и FF 25 вызовы API функций. Как найдёшь такое место, и притом оно не будет принадлежать ни одному образу, которые были раньше перечислены через psapi, значит этот кусок принадлежит именно такой скрытой библиотеке. Хотя это не прокатит, если библиотека упакована. Но тогда можно искать в памяти сигнатуру упаковщика. Или для неупакованной искать сигнатуру компилятора. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 28 июля 2011 15:51 · Личное сообщение · #14 |
|
Создано: 28 июля 2011 15:55 · Личное сообщение · #15 |
|
Создано: 28 июля 2011 17:33 · Поправил: Error_Log · Личное сообщение · #16 Все зависит от того, как грузит либу "собственный загрузчик". Можно пройтись по всей виртуальной памяти процесса (NtQueryVirtualMemory с классом MemoryBasicInformation) с инкрементом va += basicInfo.RegionSize начиная с 0. Если загрузчик использует mapping - соответствующий регион будет помечен флагом MEM_MAPPED/MEM_IMAGE. NtQueryVirtualMemory с классом MemoryMappedFilenameInformation для такого региона вернет путь к файлу, с которого был произведен mapping (Резолвится из дерева (struct _EPROCESS*)->VadRoot сначала _MMVAD* региона, а из него Vad->ControlArea->FilePointer, после чего получается имя в ObQueryNameString). Собственно, GetMappedFileName это же и делает, через NtQueryVirtualMemory. Если загрузчик просто выделяет память - то ИМХО он должен для региона памяти с исполняемым кодом ставить флаг PAGE_EXECUTE, что тоже решается проходом по дереву VadRoot (NtQueryVirtualMemory). Соответственно, если в списке DLL модуля не видать - проверять адрес на соответствие со списком (struct _PEB*)->Ldr ----- Research is my purpose ![]() |
|
Создано: 29 июля 2011 10:11 · Личное сообщение · #17 Error_Log с инкрементом va += basicInfo.RegionSize начиная с 0 Ну зачем же прям с нуля? Достаточно будет, чтоб первое значение было равно этому самому RegionSize. Если загрузчик просто выделяет память - то ИМХО он должен для региона памяти с исполняемым кодом ставить флаг PAGE_EXECUTE Обычно рекомендуют сохранять такой доступ к памяти, который соответствовал был значению из IMAGE_SECTION_HEADER.Characteristics. Но установка этого флага и не обязательна, елси только не применяется DEP. Цитата: Никакого x-атрибута в PTE нет и он присутствует только в таблице селекторов, а это значит, что мы не можем выборочно разрешать/запрещать исполнение кода для отдельных страниц, а только для всего сегмента целиком. Вот потому Windows с ее плоской моделью памяти, вынуждена трактовать атрибут -r- как -x-, а -x- как -r-. То есть, право на чтение страницы дает неявное право на ее исполнение и наоборот. Отсюда: ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 29 июля 2011 10:32 · Личное сообщение · #18 VOLKOFF пишет: Сейчас понадобилось посмотреть пару моментов по принципу работы библиотеки, но как оказалось, принимаемый файл искажен и является "не валидным PE", видимо клиент его модифицирует перед инжектом. Если программа использует свой загрузчик dll то соблюдение РЕ фомата можно пренебречь,он нужен если для загрузки используется система,дампить надо до инициализации дата секции - которая находится в куче(желательно до инициализации самой IAT и релоков),РЕ структуру можно восстановить в ручную(это непроблема зная РЕ формат файлов) ----- Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли. ![]() |
|
Создано: 29 июля 2011 12:36 · Личное сообщение · #19 |
|
Создано: 30 июля 2011 00:16 · Поправил: VOLKOFF · Личное сообщение · #20 Благодарю всех за дельные советы. В дампе с диспетчера действительно присутствует полностью распакованная готовая dll. И судя по всему, это самый простой способ ее "изъять". Осталось собрать по кускам секции разбросанные в дампе, если есть какие приемы по упрощению задачи, не поленитесь - напишите. Кстати дамп получился громадный и работать с ним в хекс редакторе быстрее и удобнее чем в Иде, которая (простите за "нубство") ничем не помогла. ![]() |
|
Создано: 01 августа 2011 10:23 · Личное сообщение · #21 VOLKOFF Есть очень ламерский, но очень простой приём по изьятию таких либ из памяти. У вас есть хекс-дамп, вы нашли (я так полагаю - по заголовку) начало библиотеки. Сохраняйте в новый файл с расширением .dll содержимое от заголовка до конца хекс-дампа. А потом полученной библиотеке делайте Rebuild Pe с опциями по уменьшению размера. Если в либе нет оверлея - то должно сработать. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 01 августа 2011 18:28 · Личное сообщение · #22 я так полагаю - по заголовку Нашел по тексту меню. Судя по наблюдению за другими загруженными dll, заголовок где-то в начале дампа вместе с множеством других, либо его вообще нет (что тоже нельзя исключать). Некоторые либы достаточно обширно разбросаны по дампу. Сабж вроде как весь находится на одном промежутке с ощутимой разбивкой нулями, но ближайший заголовок далеко (~35Мб дампа вверх) и вроде как он не отсюда. В общем шляпа... ![]() |
|
Создано: 02 августа 2011 10:24 · Личное сообщение · #23 VOLKOFF пишет: Сабж вроде как весь находится на одном промежутке с ощутимой разбивкой нулями Ну так - прекрасно! По этой разбивке можно определить количество секций в сабже, дальше лепим заголовок, к нему таблицу секций, потом эти самые секции. После добиваемся того, чтоб сабж подгрузился по другой базе, повторяем операции, натравливаем Relox, дальше импреком прикручиваем импорт, и это даже будет работать, а не только дизасмиться. По ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Обнаружение образа dll |