Анализ полиморфного/ВМ кода

Тема в разделе "WASM.RESEARCH", создана пользователем techgl, 1 сен 2005.

  1. techgl

    techgl New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2004
    Сообщения:
    42
    Как это делается? Посидел и просто восстанавливал код, убирая полиморф (различные вариации на тему безусловного перехода, изменение значений регистров с последущей восстановкой, etc. Все стандартно, простой полиморф), но кода там много. Уже нашел пару повторяющихся фрагментов (это опкоды ВМ), но анализировать так весь код - этож какое терпение и внимательность нужна.

    Неужели не продвинулся анализ в сторону более автоматического? Какие нибудь программы, помогающие анализирующему?

    И что хорошего можно почитать на тему "Проектирование ВМ", "Написание ВМ"?
     
  2. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Общая схема такая:



    disassembler -> AI -> assembler



    Под AI может скрываться как банальный фильтр(ы) мусорных команд, так и ох.енный анализатор. Более-менее приличный полиморф не позволит дизассемблировать весь код целиком, в общем случае, анализатор должен применяться даже на стадии дизассемблирования, т.к. команды ветвлений/переходов/вызовов также могут быть поморфены. Ассемблер может быть и не для всех команд, но для rel-команд -- must have, т.к. большинство полиморфиков rel'ы перестраивают.

    Многие полиморфики любят разбивать поток, начиная от тупого перемешивания JMP'ами (например, guardant api), до схем посложнее, например split'ы в execryptor'е.



    Почитать на эту тему можно (скорее всего) во всяких вирмэйкерских журналах, но там на тему создания, а не декодирования. Вряд ли можно найти 'на почитать' что-нибудь стоящее, равно как и готовые проги для декодрования, которые б пригодились. Борьба с полиморфом -- это как и спасение утопающих, личное дело самих борцов.
     
  3. techgl

    techgl New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2004
    Сообщения:
    42
    Про выкрутасы полиморфных движков мне известно. Меня больше волнует ВМ (виртуальная машина). С чего начинать, неужели проходить весь код пока не получишь все команды машины? Как распознать тип машины, какие вообще есть типы машин (читал что стековые и регистровые). Слабо верится что разработчики каждый раз с нуля пишут свои ВМ, скорее всего на что-то опираются. Вот хотелось бы тоже этих знаний.
     
  4. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Ну, есть несколько к подходов к вм:

    1) Эмулятор процессора. (для каждой команды существует процедура ее эмуляции). Снимается легко.

    2) Микрокодовая вм. (каждая команда разбивается на последовательность микроопераций, сама вм имеет только несколько элементарных команд) Если нет обфускатора, то тоже относительно нетрудно снимается, но с обфускатором все гораздо хуже потому, что невозможно однозначно восстановить код.

    3) Макрокодовая ВМ. (каждая команда ВМ выполняет одновременно много сложных действий и может быть представлена большим куском кода). Такие ВМ содержат очень много команд и разбираются весьма тяжело.

    4) HLL ВМ. (код для ВМ генерируется не из машинного кода, а пишется вручную на каком-нибудь скриптовом языке программирования). Это получается что-то типа p-code в VB.



    Но в любом случае тебе придется разобрать исполнитель ВМ полностью и вникнуть в алгоритмы ее работы.
     
  5. Nimnul

    Nimnul New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2005
    Сообщения:
    136
    Адрес:
    не Китай




    Может быть у этой вм есть название?



    А вобще ты попал :), подумай стоит ли трать на это свое время? а времени ты потратиш многа :)



    Все зависит от задач которые ты перед собой ставиш, если тебе надо распаковать, защищаемый этой вм код, тогда можна реализовать это только с помощью отладчика, (при условии что нет серьезной анти отладки). Если же часть функций защищаемого кода перенесены на вм, тут дело обстоит по сложнее, но одно могу сказать что именно эти функции будут не полиморфными на 90%, так как реализовать это охрененно сложно, т.е. эти функции в п-коде но не мутируют, их тоже можна найти и расклеить в натив. Если же основная часть кода лежит на мутирующей вм, даже если ты найдеш проверяющие фукции, пофиксить их будет крайне сложно ввиду мутации. Декомпилить п-код как сказал BC дело гиблое т.к. 99% сам п-код тоже меняется. Скорее всего тебе нужно будет изучить порядок мутаций программы и порядок мутаций п-кода, и опираясь на это сделать декомпил, после этого будеш долго и муторно резать и собирать прогу по кускам, и после этого ты поймеш что проще такую прогу написать с нуля :) но а вобще удачи :)



    еще почитай Криса, по мойму назыается Техника и Философия хакерских атак, он там немного об этом расказывает. не хочу обидеть автора если неправильно сказал название книги, у меня крайне плохая память на название книг и на ФИО авторов этих книг :)

     
     
  6. Nimnul

    Nimnul New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2005
    Сообщения:
    136
    Адрес:
    не Китай
    Ms Rem



    Ты что на спишь в столь позний час? пол пятого почти :)
     
  7. drmad

    drmad New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    332
    Адрес:
    Russia
    Ну а всеж таки, загляни на http://www.nf-team.org/drmad/zf/zf5/index.html. Вдруг найдешь пищу для мозгов по сабжу топика? :)
     
  8. techgl

    techgl New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2004
    Сообщения:
    42
    Меня просто интересует, как обычно выглядит структура. Например, берем простую ВМ - старый VM Protect. Там сам цикл машины такой:
    Код (Text):
    1.  
    2. seg000:0026F000 VMProc:
    3. seg000:0026F000                 pushf
    4. seg000:0026F001                 pusha
    5. seg000:0026F002                 push    0
    6. seg000:0026F007                 mov     esi, [esp+28h]
    7. seg000:0026F00B                 mov     edx, offset VM_mem
    8. seg000:0026F010                 cld
    9. seg000:0026F011                 call    GetCurrentThreadId
    10. seg000:0026F017                 mov     ebx, eax
    11. seg000:0026F019                 mov     ecx, 100h
    12. seg000:0026F01E                 mov     edi, edx
    13. seg000:0026F020                 repne scasd
    14. seg000:0026F022                 jz      short loc_26F031
    15. seg000:0026F024                 mov     eax, 100h
    16. seg000:0026F029                 xchg    eax, ecx
    17. seg000:0026F02A                 mov     edi, edx
    18. seg000:0026F02C                 repne scasd
    19. seg000:0026F02E                 mov     [edi-4], ebx
    20. seg000:0026F031
    21. seg000:0026F031 loc_26F031:
    22. seg000:0026F031                 mov     ebp, edi
    23. seg000:0026F033                 sub     edi, edx
    24. seg000:0026F035                 shl     edi, 4
    25. seg000:0026F038                 lea     edi, [edx+edi+3C0h]
    26. seg000:0026F03F                 mov     ebx, esi
    27. seg000:0026F041                 sub     ebx, [esp]
    28. seg000:0026F044
    29. seg000:0026F044 machine_loop:
    30. seg000:0026F044                 lodsb
    31. seg000:0026F045                 add     al, bl
    32. seg000:0026F047                 rol     al, 7
    33. seg000:0026F04A                 sub     al, 72h
    34. seg000:0026F04C                 xor     al, 27h
    35. seg000:0026F04E                 rol     al, 1
    36. seg000:0026F050                 sub     al, 55h
    37. seg000:0026F052                 rol     al, 2
    38. seg000:0026F055                 add     al, 3Fh
    39. seg000:0026F057                 rol     al, 5
    40. seg000:0026F05A                 add     al, 5Eh
    41. seg000:0026F05C                 xor     al, 4
    42. seg000:0026F05E                 add     al, 90h
    43. seg000:0026F060                 xor     al, 9Ah
    44. seg000:0026F062                 add     bl, al
    45. seg000:0026F064                 movzx   eax, al
    46. seg000:0026F067                 jmp     VM_table[eax*4]
    47.  


    На вход процедуры поступает адрес блока, содержащего команды машины (процедура, переведеная в ВМ).

    Где VM_table содержит код для каждой команды ВМ. Причем это (я так понял) стековая ВМ: тоесть каждая команда берет данные из стека, преобразовывает их, и ложит обратно в стек.

    Вот и хотелось бы описания реализаций разных ВМ: теории хоть немного.

    drmad



    Я чего-то не нашел там ничего про ВМ. Может в старых номерах?
     
  9. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759




    Вот пример ещё одной ВМ:

    [​IMG] 436704478__vm_1.rar
     
  10. techgl

    techgl New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2004
    Сообщения:
    42
    _BC_



    У меня код вообще другой: там нельзя понять (во всяком случае я пока не вник), где какая инструкция эмулируется.
    Код (Text):
    1.  
    2.     push    eax ; opcode 000
    3.     push    edi
    4.     lea edi, dword ptr [101D1030h]
    5.     movzx   eax, byte ptr [edi+1Ah]
    6.     lea edi, dword ptr [ebx+eax*4]
    7.     mov dword ptr [edi], edx
    8.     pop edi
    9.     pop eax
    10.  


    Вот этот участок отвечает за запись по адресу, взятому из таблицы по индексу, взятому из другой таблицы значения в EDX. Он там повторяется довольно часто, я пока для себя его назвал опкод 0. Вообще атомы (тоесть участки, выполняющие логически завершенную последовательность действий) видно стразу:
    Код (Text):
    1.  
    2.     push    edi
    3.     lea edi, dword ptr [101D1030h]
    4.     movzx   edx, byte ptr [edi+17h]
    5.     lea edi, dword ptr [ebx+edx*4]
    6.     mov edx, dword ptr [edi]
    7.     pop edi
    8.  


    и еще:
    Код (Text):
    1.  
    2.         push    ecx
    3.     push    edx
    4.  
    5.     push    edi
    6.     lea edi, dword ptr [101D1030h]
    7.     movzx   ecx, byte ptr [edi+1]
    8.     lea edi, dword ptr [ebx+ecx*4]
    9.     mov ecx, dword ptr [edi]
    10.     pop edi
    11.  
    12.     mov dl, cl
    13.     shr ecx, 8
    14.     xor dl, cl
    15.     rol dl, 1
    16.     shr ecx, 8
    17.     xor dl, cl
    18.     rol dl, 1
    19.     shr ecx, 8
    20.     xor dl, cl
    21.     rol dl, 1
    22.     and edx, 0FFh
    23.     add eax, edx
    24.     pop edx
    25.     pop ecx
    26.  


    И так далее. Проблема в том, что пока только значения берутся из одной области и ложатся в другую + некоторые преобразования.

    У меня сейчас идея такая: ловить вызов CreateFile (получает дескриптор драйвера, рабочие участки которого, кстати, тоже подвергнуты ВМ), далее ловить WriteFile, ReadFile и смотреть какие преобразования происходят с данными получеными из драйвера, если известно что на входе. А сам драйвер пока считать черным ящиком. Это позволит стразу перейти к сути, а то подготовительный код я еще дого буду трассировать такими темпами.
     
  11. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    techgl

    Ты случайно не старфорс ломаешь? Или может последнюю фемиду?
     
  12. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759




    В том примере кстати не используется таблица адресов обработчиков опкодов, скрипт сам формирует смещения для выборки команды, плюс никаких imm-операндов в пкоде, они собираются по битам также самим скриптом.
     
  13. techgl

    techgl New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2004
    Сообщения:
    42
    Ms Rem

    NeoGuard. А там похожий принцип, или что? Почему сразу ссылка к StarForce? И где можно скачать что либо, защищенное этой "Фемидой"?
     
  14. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Потому что симптомы и код ВМ напоминают Star Force 1 Basic Edition.



    http://www.soft32best.com/soft/development/delphi/themida.shtml

    Фемида защищена сама собой, если охото, то распаковывай.



    И чем ты этот NeoGuard отлаживаешь то? Неужели имея драйвер он не портит отладочные прерывания.
     
  15. techgl

    techgl New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2004
    Сообщения:
    42
    Ms Rem



    Хм, возможно разработчики NeoGuard решили так "учесть" предыдущий опыт и использовали наработки StarForce. А возможно это общий подход при проектировании ВМ такого типа, кто знает. Только учти, что здесь я показываю код, "избавленый" от мусора, оставленного полиморфом. Возможно они взяли ВМ от StarForce и просто пропустили ее через свой полиморф. Опять же, кто знает.



    Либо у меня "простая" версия, либо разработчики посчитали что с исследователя и ВМ будет достаточно выше крыши. Поэтому SoftIce идет на ура. Впрочем "порча отладочных прерываний" меня остановила бы ненадолго.
     
  16. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    Да уж, это точно не старфорс, раз полиморф только мусор оставляет. Хотя в Basic Edition так и было, вот StarForce Pro сильнее в разы..







    Ну, просто портить прерывания это сакс, так как их легко востановить. На нах обычно вешают что-либо жизненно важное для защиты, например в третьем старфорсе ring0 ВМ вызывается через int 3. А если при этом еще и проверяются дескрипторы в IDT и код отвечающий за обработку этих прерываний, то запустить отладчик становиться не так уж просто.
     
  17. techgl

    techgl New Member

    Публикаций:
    0
    Регистрация:
    5 авг 2004
    Сообщения:
    42
    Ms Rem



    Ну там не мусор, а путаный код + обманные изменения. Все это направлено на исключение автоматического анализатора.

    Пример:
    Код (Text):
    1.  
    2. .text:10006D5A                 pushf
    3. .text:10006D5B                 call    loc_1001D0A8
    4.  
    5. .text:1001D0A8 loc_1001D0A8:
    6. .text:1001D0A8                 lea     esp, [esp+4]
    7. .text:1001D0AC                 popf
    8. .text:1001D0AD                 push    ebp
    9. .text:1001D0AE                 mov     ebp, esp
    10. .text:1001D0B0                 push    ebx
    11. .text:1001D0B1                 push    ecx
    12. .text:1001D0B2                 pushf
    13. .text:1001D0B3                 call    loc_100622E9
    14.  
    15. .text:100622E9 loc_100622E9:
    16. .text:100622E9                 lea     esp, [esp+4]
    17. .text:100622ED                 popf
    18. .text:100622EE                 push    edx
    19. .text:100622EF                 push    esi
    20. .text:100622F0                 pushf
    21. .text:100622F1                 call    loc_1007842F
    22.  


    Обманки с регистрами:

    1
    Код (Text):
    1.  
    2. .text:10078434                 xchg    ebx, edx
    3. .text:10078436                 xchg    edx, ebx
    4.  


    2
    Код (Text):
    1.  
    2. .text:100AB118                 pushf
    3. .text:100AB119                 or      ebp, ebp
    4. .text:100AB11B                 and     edx, edx
    5. .text:100AB11D                 popf
    6.  


    3
    Код (Text):
    1.  
    2. .text:1008107F                 push    ebx
    3. .text:10081080                 mov     ebx, ecx
    4. .text:10081082                 mov     ecx, eax
    5. .text:10081084                 push    ebx
    6. .text:10081085                 pop     ecx
    7. .text:10081086                 pop     ebx
    8.  


    4
    Код (Text):
    1.  
    2. .text:10081091                 pushf
    3. .text:10081092                 xor     eax, ecx
    4. .text:10081094                 xor     ecx, eax
    5. .text:10081096                 xor     eax, ecx
    6. .text:10081098                 xchg    eax, ecx
    7. .text:10081099                 popf
    8.  


    etc...

    "Замороченый" безусловный переход:
    Код (Text):
    1.  
    2. .text:100815B6                 push    27005DC9h
    3. .text:100815BB                 jmp     short loc_100815C0
    4. .text:100815BB ; ---------------------------------------------------------------------- -----
    5. .text:100815BD                 db 0E8h, 0E9h, 0FFh
    6. .text:100815C0 ; ---------------------------------------------------------------------- -----
    7. .text:100815C0
    8. .text:100815C0                 push    esi
    9. .text:100815C1                 push    edi
    10. .text:100815C2                 mov     esi, 85A3B1Fh
    11. .text:100815C7                 sub     [esp+8], esi
    12. .text:100815CB                 jmp     short loc_100815CE
    13. .text:100815CB
    14. .text:100815CD                 align 2
    15. .text:100815CE
    16. .text:100815CE loc_100815CE:
    17. .text:100815CE                 mov     edi, 0F161F155h
    18. .text:100815D3                 add     [esp+8], edi
    19. .text:100815D7                 mov     edi, [esp]
    20. .text:100815DA                 mov     esi, [esp+4]
    21. .text:100815DE                 add     esp, 8
    22. .text:100815E4                 jmp     short loc_100815EA
    23. далее через пару JMP'ов следует RETN
    24.  


    Вот вариаций на вышеперечисленное там тьма. Я это обозвал полиморф ибо подозреваю что от DLL к DLL даный код меняется.
     
  18. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Да, правильно ты назвал это полиморфом, потому что на метаморф это явно не тянет. Морф на уровне вирусных движков, простое шаблонное кодирование.

    А автоматический анализатор к такому морфу даже без эмуляции легко сделать.
     
  19. drmad

    drmad New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    332
    Адрес:
    Russia
    techgl



    Я чего-то не нашел там ничего про ВМ. Может в старых номерах?



    Теперь понятно - об чем топик. Нет, этого там нет. :dntknw: Есть немножко про то, что _BC_ назвал AI. Извиняюсь.



    З.Ы. А какой-то теории или общей структуры, имхо, просто нет. И практически невозможен автоматический анализ ВМ-движка.
     
  20. ssx

    ssx Member

    Публикаций:
    0
    Регистрация:
    19 авг 2003
    Сообщения:
    336
    знакомый очень код..... они в своем крякми такой же обфускатор применяли.

    большая часть мусора чистится автоматом, наверное можно и полностью на автомате, но при небольшом объеме кода можно и руками.