Как внедрить защиту в исполняемый файл?

Тема в разделе "WASM.BEGINNERS", создана пользователем ArtyomW, 10 май 2010.

  1. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Clerk Интересно интересно
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Aspire
    А если вы встретите Int 0x2B, куда будите ставить брейк чтобы получить управление далее(на крабе обсуждали, они не знают) ?
    Стек теневых калбэков не доступен из юзермода, это самый эффективный в юзермоде легальный способ скрыть код. Контекст инициализирует какой либо теневой сервис, вызывающий любой калбэк, коих сотни. Найти это место очень сложно, по сути иголка в стогу сена ;)
     
  3. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Заменить весь ImageBase (ну или стек или аллоцированные блоки) на int 3h?
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    PSR1257
    хм. Так вы не будите знать ведь где обработчик, мб я его глубоко в хип запрячу или в левый модуль какой. А стек переключить можно.
    Этот посредством сторожевых страниц делается(PAGE_GUARD) обычно, просто так к сведению.
     
  5. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Clerk

    Так мне нужно узнать где он только средствами user-code, верно? Если он сидит в пределах тестируемого приложения - то это поможет (перезалить все назад думаю несложно будет). Про другие модули в условиях задачи не было :)

    Нащот выгрузки всех страниц это было первое что пришло в голову но не уверен что можно получить управление (SEH?) когда винда соберется вызвать обработчег из выгруженного контекста.
     
  6. ArtyomW

    ArtyomW New Member

    Публикаций:
    0
    Регистрация:
    10 май 2010
    Сообщения:
    12
    скажу честно, в ассемблере пока плохо ориентируюсь. Clerk, что делает этот код? и главный вопрос, КАК внедрить такую защиту в произвольный исполняемый файл. Причём внедрить НЕ ВРУЧНУЮ, а автоматически. ответьте, пожалуйста, кто знает, простым языком
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    PSR1257
    Ага, может быть где угодно в ап. У вас есть необходимый инструмент ?
    Стоит напомнить что стек не генерит #GV. Это можно использовать если вы будите юзать сторожевые страницы.
    (TF будет сброшен. Думал над селекторами, но это тоже не поможет. Изменить Cs - будет генерится #AV без перехода, изменить Ss - процесс будет завершён ядром.)
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    ArtyomW
    Возьмите вы уже созданные, протов куча платных и бесплатных.
     
  9. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Clerk

    Ладно, я попробую придумать красивее/это первое что пришло в голову.

    ArtyomW

    Попробуйте начать с простейшего декриптора всего приложения с открытой криптографией, модуль суньте куда-нить в аппендет. Это можно напейсать даже на делфи.
     
  10. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Clerk

    Немного поразмышляв, я пришел к выводу что стоит рассмотреть два способа (оба основаны на том что callback использует стек):

    1.1 Перед вызовом int запомнить стек и после возврата* смотреть какие там адреса;
    1.2 Можно также попробовать BPM на область ниже текущего *(ESP).

    Не совсем понятен момент - выделяет ли ядро новый стек для колбэка или же использует прежний. Нет ли маленького демо-примера с этим int?

    * Контроль будет утерян но можно перезагрузить до той же точки.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    PSR1257
    http://www.wasm.ru/forum/viewtopic.php?id=37300
     
  12. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Я верно понимаю что создается временный стек специально для этого callback'а и вся связь с основным модулем - это один переданный указатель?

    ps Thanks for demo (sample).
     
  13. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    ++ Сейчас у меня основная идея - этот новый временный стек создается в какой-то зависимости от основного. Например, ESP-0x1000 или типа того. Буду проверять.
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    PSR1257
    Временный стек не создаётся, а используется текущий. Это не поможет вам отследить обращение к нему. Можите указать ссылку с иной стек.
    Нет никаких связей к модулями вобще. Если имеите ввиду передачу параметров, то можно это сделать через стек или регистры, например fpu.
     
  15. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Clerk

    То есть примерно так:

    Host: ... ; ESP сейчас == ESP0
    int 2Bh
    ...
    ; Вызов этого callback: - somewhere in memory
    CallBack: ; ESP сейчас == function(ESP0), например ESP0-0x1000

    В таком случае я надеюсь поставить BPM на начало стека в коллбэке - и когда колбэк начнет юзать стек я получу управление - ? Или нет?
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    PSR1257
    Стек на момент вызова Int 0x2B никак не связан со стеком, который будет восстановлен из регистра Edi, сохранённого в контексте ранее при формировании его. После извлечения контекста обращения к текущему стеку уже не будет, при инициализации вы можите указать любой участок памяти R/W и далее он будет использоваться как стек. При этом есть недостаток - обращение к памяти, которая не принадлежит стеку легко отслеживается.
    Калбэк вызывается только при инициализации.
     
  17. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    PSR1257
    Вот маленькое макро, запрещающее #GV(останов по доступу к сторожевой странице не сработает, это например в оле set-break-on-access) для произвольного региона:
    Код (Text):
    1. DISABLE_GV macro RegionBase, RegionLimit
    2.     mov eax,fs:[TEB.Tib.StackLimit] ; mov eax,esp
    3.     mov ecx,16
    4.     and eax,NOT(X86_PAGE_SIZE)
    5.     mov esi,RegionBase
    6.     mov edi,RegionLimit
    7. @@:
    8.     cmp dword ptr [eax],eax
    9.     sub eax,X86_PAGE_SIZE
    10.     loop @b
    11. ; > TEB.DeallocationStack
    12.     xchg fs:[TEB.Tib.StackLimit],esi
    13.     xchg fs:[TEB.Tib.StackBase],edi
    14. endm
    Также и #AV не будет доставлено/обработано. У оли кстате с этим проблемы - если установить оба типа останова на стек она зависнет.
     
  18. Acrobat

    Acrobat New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2010
    Сообщения:
    23
    ArtyomW сам недавно занимался такими вопросами (тоже новичек), могу от себя посоветовать разобрать структуру PE файла, разобрать исходник Yoda's Cryptor (больше всего понравился), прочитать обязательно статейку (http://www.wasm.ru/article.php?article=green2red01). masm, ollydbg и вперед с песней.
     
  19. ArtyomW

    ArtyomW New Member

    Публикаций:
    0
    Регистрация:
    10 май 2010
    Сообщения:
    12
    Acrobat, спасибо!
     
  20. ArtyomW

    ArtyomW New Member

    Публикаций:
    0
    Регистрация:
    10 май 2010
    Сообщения:
    12
    вот что нашёл:
    исходники Yoda's Cryptor и Yoda's protector:http://yodap.sourceforge.net/
    статьи разработчика по внедрению кода в PE: http://www.codeproject.com/kb/system/inject2exe.aspx
    в таблицу импорта: http://www.codeproject.com/KB/system/inject2it.aspx
    три способа внедрения в процесс: http://www.codeproject.com/kb/threads/winspy.aspx