Сейчас на форуме: igorcauret (+8 невидимых)

 eXeL@B —› Вопросы новичков —› Проблема с инжектом длл.
Посл.ответ Сообщение

Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 10 июля 2014 19:55 · Поправил: Tolkin
· Личное сообщение · #1

Цель.
Есть программа, с защитой в статически прилинкованной длл
(защита срабатывает до точки входа запуска основного ехе).
Для обхода защиты написана своя длл с хуками (со своим статик импортом).

Для инжекта используется лоадер типа:
1. создание процесса нужного ехе с флагом CREATE_SUSPENDED.
2. создание удаленного потока на LoadLibrary с именем нашей длл.
3. ResumeThread основного потока программы.

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

Собсно вопрос, как правильно заинжектить длл в создаваемый процесс (ринг 3) , чтобы она выполнилась первой от статически прилинкованных к цели (кернел, юзер длл и т.д не в счет, так как есть в импорте и моей длл).




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 10 июля 2014 23:17 · Поправил: ARCHANGEL
· Личное сообщение · #2

Tolkin
Есть способ. В ехе обнуляем ссылку на таблицу импорта, потом грузим свою библиотеку, а потом она (библиотека) сама проходится по таблице импорта и вручную (через LoadLibrary и GetProcAddress) заполняет её.

Под ссылкой на таблицу импорта здесь понимается значение Import directory. Причём патчить не обязательно на диске, а то проверку контрольной суммы может не пройти. Поэтому модифицировать это значение надо в памяти.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 11 июля 2014 00:32
· Личное сообщение · #3

Tolkin
Есть способ. Не грузить длл через CreateRemoteThread, а написать небольшой шел который вызовет LoadLibrary




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 11 июля 2014 07:11
· Личное сообщение · #4

Есть еще важный момент. При загрузке процесса с CREATE_SUSPENDED в памяти есть только ntdll. И, если не хочешь, чтобы подгрузились остальные либы, а в них может быть код запрета сторонних длл, грузить надо именно через ntdll.
Кстати ситуация что ты описываешь используется в протекторе Frost.



Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 11 июля 2014 13:16
· Личное сообщение · #5

спасибо всем за ответ, проверить варианты пока времени небыло.

По сути длл с защитой - это длл накрытая новым срм конвертом.
и конверт срабатывает раньше, я не успеваю поставить перехваты для обработки апи.
т.е по сути запуск длл с конвертом с dll_main и вызывает срабатывание конверта.

По поводу загрузки длл не через создание потока, тут я не совсем понял.
Если поток проги в состоянии CREATE_SUSPENDED, если выделим место и загрузим туда шеллкод, как его запустить на выполнение, все равно же придется запустить поток?

По поводу изменений в образе ехе таблицы импорта - вполне вариант. Кстати, а в каком порядке статика подгружается, так как она записана в таблице импорта? т.е если на лету подпавить таблицу дописав первой свою длл - она и подгрузится первой?



Ранг: 71.2 (постоянный), 33thx
Активность: 0.050.12
Статус: Участник

Создано: 11 июля 2014 13:38 · Поправил: kunix
· Личное сообщение · #6

Tolkin пишет:
Если поток проги в состоянии CREATE_SUSPENDED, если выделим место и загрузим туда шеллкод, как его запустить на выполнение, все равно же придется запустить поток?

GetThreadContext/SetThreadContext
Метод рабочий, заюзал его в проекте лет 5 назад.
И, кстати, kernel32.dll вроде бы в тот момент уже доступен.




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 11 июля 2014 13:59
· Личное сообщение · #7

по сути тема как --> Link <--

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




Ранг: 71.2 (постоянный), 33thx
Активность: 0.050.12
Статус: Участник

Создано: 11 июля 2014 14:17
· Личное сообщение · #8

И да, кстати, если шеллкод делать сложно, можно копировать в адресное пространство целевог процесса свой текущий PE и уже там перенастраивать reloc-и.



Ранг: 441.3 (мудрец), 297thx
Активность: 0.410.04
Статус: Участник

Создано: 11 июля 2014 15:56
· Личное сообщение · #9

Tolkin
посмотрите как Strong на EP инжектирует dll, ничего сложного там нет



Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 11 июля 2014 18:06
· Личное сообщение · #10

С написанием шеллкода никогда не сталкивался, при CREATE_SUSPENDED подгружена только ntdll.dll и работать выходит надо с ней только, + не знаю будет ли решение такое универсально для 32(64) и линейки ОС, или под каждую ось свои шеллы (на даный момент задача 64).

Поэтому сперва буду пробовать вариант с таблицей импорта (более универсальный как мне кажется и проще в реализации). Замечено, что порядок статики прямо зависит от того как он записан в импорте, т.е. если подкорректировать таблицу и первой указать свою длл, именно она первой и будет загружена.

еще раз всем спасибо за помощь.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 13 июля 2014 00:43
· Личное сообщение · #11

Tolkin пишет:
Замечено, что порядок статики прямо зависит от того как он записан в импорте, т.е. если подкорректировать таблицу и первой указать свою длл, именно она первой и будет загружена.

Этот какой-то черезжопный способ. Если RVA таблицы импорта равно 0, то статического импорта как бы нет, и ничего вообще не грузится. Ну, только то, что грузится всегда (kernel32.dll, ntdll.dll, kernelbase.dll). И это просто чудесно, т.к. раз грузиться kernel32.dll, то рабтает способ инжекта dll с помощью удалённых потоков, и адрес загрузки этой самой kernel32.dll в пределах одного сеанса одинаковый. И это значит, что инжектируемая библиотека будет грузиться раньше остальных dll, а потом сама может загружать их в любом удобной ей порядке.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 13 июля 2014 07:46 · Поправил: ajax
· Личное сообщение · #12

ARCHANGEL пишет:
Этот какой-то черезжопный способ

просто ребилд таблички. если прот не заругается на измененность - все может быть ок. а с занулением статики - kernel32 всегда нужен для win2k, про user32 не помню (пример - табличка после обсидиума). без него проги валятся при старте, где-то это (и не только) было описано еще N лет назад. не исключу подобный epic fail на типа xp64

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




Ранг: 64.0 (постоянный), 2thx
Активность: 0.040.01
Статус: Участник

Создано: 13 июля 2014 22:39
· Личное сообщение · #13

ajax пишет:
просто ребилд таблички

Все верно, тем же CFF Explorer это можно сделать, меняя расположение полей в статике. Если прот позволяет, то все работает как надо (если моя длл выше протектной хуки отрабатывают, если наоборот - не успевают). если прот не позволяет то эту операцию думаю можно сделать на лету, при CREATE_SUSPENDED, пока проверить не успел, но думаю все будет работать.


 eXeL@B —› Вопросы новичков —› Проблема с инжектом длл.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати