Авторские статьи Низкоуровневое шифрование самописных вирей

Discussion in 'Статьи' started by hidden, 18 Aug 2006.

  1. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Низкоуровневое шифрование самописных вирей.

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

    Теория:
    Антивирусы, проверяя большие объемы файлов, ищут в файлах заранее подготовленные программистами последовательности байт. Значит для обхода этой процедуры, нужно сделать тело вируса уникальным, а всё остальное наиболее похожим на остальные программы, именно этим я и предлагаю заняться в этой теме.

    Чтоб не начинать с пустого места, я приготовил несколько “программок”, скомпилированных с одного и того же исходника (без внесения в него каких либо изменений), с интервалом времени примерно в 10 сек. И выполняющего следственно одну и туже функцию, вывод “MessageBox”.

    Файлы были автоматически сгенерированы, и зашифрованы ассемблером(с использованием макросом), причём тело программы было зашифровано методом xor(“исключающее или”), а потом тело расшифровывателя, было превращено в код, который при запуске восстановит его на своё же место и передаст ему управление, что без проблем просматривается в любом отладчике.

    При всём этом, пароль к xor шифровальщику и последовательность команд востанавливателя кода, зависят от текущего времени компиляции.

    В восстановителе кода участвуют несколько команд:
    Code:
    xor byte[pos], sume byte
    ,
    add byte[pos], sume byte
    или
    sub byte[pos], sume byte
    ,
    mov byte[pos], sume byte
    ,
    xor byte[pos], not sume byte
    not byte[pos]
    ,
    add byte[pos], not sume byte
    not byte[pos]
    или
    sub byte[pos], not sume byte
    not byte[pos]
    ,
    mov byte[pos], not sume byte
    not byte[pos]
     
    Результат обсуждения и коррекции, планируется разместить в закрытом разделе, а также отправить в пм всем активно принимавшим участие в нахождении недостатков этого программного кода, и методов их устранения.

    Чего я жру:
    Предложения способов автоматического выделения данной программы среди остальных программ, не требующих много ресурсов, и отладки программы, а также способов обхода этих способов. И ещё, недолжно использоваться прямых адресов, для возможности применения его в DLL модулях без таблицы исправления адресов.
    ИМХО будущее за DLL вирусами.

    Все файлы сжаты раром, сумма размеров 6 файлов 9,2 Кб, в архиве 4 Кб <скачать>

    P.S. Думаю тема будет долгая.
    [offtop]
    В результате мы разработаем основу для самых опастных не находимых автоматическисаморегенерируемых вирусов, которые в будущем захватят мир, ктулху и феникгс отдыхают. Хотя помоему я немножко приувеличил :-)
    [/offtop]
     
    3 people like this.
  2. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    542
    Reputations:
    445
    ну дык это ведь неново - банальный СамоМодифицирующийсяКод, при4ем практи4ески все авери давно палят декриптор, расшифровующий код вируса таким методом
     
    #2 ProTeuS, 18 Aug 2006
    Last edited: 18 Aug 2006
    2 people like this.
  3. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Ну так я для этого и создал тему, чтоб обсудить и сделать его не таким банальным, одна голова хороше, а форум голов очень хорошо :D .
    Лично я не пойму как они его палят(ведь там только пара байт остаёться одинакова), может посветишь?
     
  4. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    542
    Reputations:
    445
    ну раз так - давай обсуждать =)

    нас4ет как палят:

    1. поскольку в слу4ае СМК код сохраняется в бинарнике пошифрованым (неважно каким алгоритмом), то сигнатурный анализатор (базы) аверя сразу не дадут никакого результата

    2. стало быть, палит вирус эвристи4еский анализатор с заданым уровнем достоверности.

    например: если есть пошифрованое тело, то эвристик заметит неладное если на старте проги идут не стандартные GetModuleHandle и т.д. апи, а сам декриптор, который в цикле долго и нудно 4то-то будет расшифровывать - это первое. второе: 4аще всего тот же декриптор выносят в другую секцию файла, либо осуществляю EPO-инфекцию (вызов вредоносного кода подменой, например, вызова какой-либо апи функции, подменив ее в импорте).

    вообще вариантов ку4а и по4итать о подобных вещах монжо в любой книге по вирусописанию, форумам по vx\rat, васме (рукомендую), архивах зомбы (суперрекомендую;)
     
  5. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Ну, если зайти в папку system32 и посмотреть, в начале модулей DLL ;), очень редко встречается вызов API
    А вообще его можно обнаружить, таким регулярным выражением
    Code:
    /\xE8.\0{3}.{16,32}\x5D(\x80[\x75\x4D\x45\x65\x4D\x6D]..|\xC6\x45..|\xF6\x55.){8,}/
    , поэтому я и ищу что-нибудь, чем можно лучше защитить этот код.
    Шифрование используют не только в вирусах, но и при защите прог, требующих регистрацию, от крякеров :D .
    Вот это кокраз и легче всего обнаружить, нарушение таблицы импорта.
    А где эти архивы найти можно?
     
  6. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    542
    Reputations:
    445
    >>Ну, если зайти в папку system32 и посмотреть, в >>начале модулей DLL ;), очень редко встречается >>вызов API
    дык на дллмейн смотрят, либо трейсером на у4астки выполняемые в самой либе

    >>А вообще его можно обнаружить, таким >>регулярным выражением

    какие РВ? 4ет первый раз слышу. и за4ем они, если всеравно будет код их обрабатывающий?
     
  7. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Перл, хотя похожее можно легко перенести и на с++
    Code:
    sub findvir(){
      local($fn)=@_;
      open(IN,$fn)||next;binmode(IN);read(IN,$buf,-s$fn);close(IN);
      return ($buf=~/\xE8.\0{3}.{16,32}\x5D(\x80[\x75\x4D\x45\x65\x4D\x6D]..|\xC6\x45..|\xF6\x55.){8,}/);
    }
    
    while(<*.exe>){ print "Found in $_\n\n" if(&findvir($_)); }
    
    while(<C:\\windows\\system32\\*.*>){ print "Found in $_\n" if(&findvir($_)); }
    
    Ну например: Если в шифровщик будет включено половина ассемблерских комманд, то этот код, будет не отличить от осталькых программ.
    Но это конечно слишком, поетому стоит подумать, что именно надо, и какким способом это реализовать, придумать своё!

    Кстати, ссылочку не подкинешь?
     
  8. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    542
    Reputations:
    445
    >>поэтому я и ищу что-нибудь, чем можно лучше защитить этот код.
    имено защитить? и какой именно код?

    >>Шифрование используют не только в вирусах, но и при защите прог, требующих регистрацию, от крякеров .
    эт понятно, на то она и криптограйия 4тобы защищать все на основе теории сложности


    >>А где эти архивы найти можно?
    где-то на форуме кряклаба линк на этой недели на некоторые статьи пробегал, а вообще по4итай A29, фряк
     
    #8 ProTeuS, 18 Aug 2006
    Last edited: 19 Aug 2006
  9. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    542
    Reputations:
    445
    а за4ем это все, если трейсер в складе аверя будет палить ЛЮБОЙ код динами4ески в время выполнения?
     
    2 people like this.
  10. DisturbeR

    DisturbeR Elder - Старейшина

    Joined:
    11 Mar 2006
    Messages:
    95
    Likes Received:
    40
    Reputations:
    25
    Это как раз и есть основной недостаток всех крипторов, как не защищай, не прячь, код будет выполнятся и анализироваться, думать надо не о том как спрятать, а как скрыть вредоносное действие.
    Как то нужно было срочно криптануть файл, ничего подходящего под рукой не было, в итоге поступил так: запаковал файл каким-то стандартным упаковщиком с защитой паролем + написал простой скриптик который водил пароль в форму и жал ОК. Заняло это 3 минуты, а защита практически неуязвимая. Естественно, только в том случае, если антивирус не запущен на постоянную проверку.
     
  11. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    542
    Reputations:
    445
    2Disturber, ты прав, но вот описаный тобой метод работает только для статика, а мониторы сей4ас практи4ески у всех.

    и кстать, а смысл был писать скрипт, если в том же винрара можно сделать самораспаковывающийся с паролем sfx безо всяких палевных эмуляций нажатий
     
  12. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Авирь не может динамически палить все загруженные модули, темболее если расшифрованый код будет выполнятся в течении долий секунды(создаст свой тред в памяти доверенного процесса, и сообщит о отсутствии надобности этой библиотеки), просто нужно обеспечить невыделяемость самого файла, из общего числа файлов. Я понимаю что в идеале это невозможно, но если добится чтоб время проверки каждого файла, занимало больше 500мс, то его не будут включать в базу антивируса, по явным причинам.

    Скрытие действий и криптовка готовых вирей это уже совсем другая тема. Кстате кто криптует вири в sfx? Вопервых антивири проверяют внутри архивов, а во вторых, после того как sfx распакует его в temp антивирь сразу захочит его проверить.
     
  13. BUG(O)R

    BUG(O)R Elder - Старейшина

    Joined:
    15 Aug 2006
    Messages:
    63
    Likes Received:
    15
    Reputations:
    16
    Протеус имел ввиду статическую проверку, внутрь архива с паролем АВ не залезет.

    Авири перехватывают ZwCreateThread.

    Если хочешь скрыть программу от мониторов, то юзай метаморфизм + ВМ и ниодин эмуль никогда не сможет проэмулировать твой код.
     
  14. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Только какие нибудь продвинутые авири перехватывают создание тредов, но смысла я в этом не вижу, некоторые программы создают треды десятками, может только если они будут проверять какой тред пытается создать новый тред, но ведь это легко обойти, напримерперехватя какую небудь системную функциию и создать тред от имени треда, её вызвавшего, и вообще, неизвестно кто первее перехватит функцию ZwCreateThread. ;)
     
  15. BUG(O)R

    BUG(O)R Elder - Старейшина

    Joined:
    15 Aug 2006
    Messages:
    63
    Likes Received:
    15
    Reputations:
    16
    Интересно ты разделил АВ на продвинутые и нет... Когда у АВ работает монитор, то он впервую очередь должен перехватывать ZwCreateThread, ибо как бы ни был создан процесс загрузчик обязательно вызывает ZwCreateThread(минимум для создания основной нити(потока) процесса).

    Не совсем понял. Что это даёт?

    АВ само собой всё перехватывают на уровне ядра, поэтому если решил пойти этому пути, то в 3 кольце считай ты бессилен.
     
  16. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    Антивири не особо обращают внимание на самомодификацию. Это привелегия эвристики. Она пасёт помимо самомодификации к каким апи обращается код. А ав по большей части ждут, когда вирь засветит свои сигнатуры. Потоки пох, если ав не найдёт сигнатур. Максимум будет сообщение эвристики, что вроде как вирус нашёлся. Не забываем про такую вещь, как метаморфизм. Кто сумеет сбацать надёжный качественный метаморф-движок репу можно прокачать значительно :)
     
  17. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    542
    Reputations:
    445
    >>и хочешь скрыть программу от мониторов, то юзай >>метаморфизм + ВМ и ниодин эмуль
    >>никогда не сможет проэмулировать твой код.
    у наших "продвинутых" росийских аверях на это один только метод - вбивать соответствующую ВМ в блэк и все функции, выполняемый на ней туда же =(

    >>Кто сумеет сбацать надёжный качественный метаморф-движок репу можно >>прокачать значительн
    о4 сомневаюсь, эт привилегия едениц - у мну, например, дальше метаморфа декриптора дело не дошло =(
     
    #17 ProTeuS, 21 Aug 2006
    Last edited: 21 Aug 2006
  18. BUG(O)R

    BUG(O)R Elder - Старейшина

    Joined:
    15 Aug 2006
    Messages:
    63
    Likes Received:
    15
    Reputations:
    16
    Так что они туда пихать будут если она заморфлена будет?

    А чем отличается код декриптора от любого другого кода программы? Ты наверное про полиморф говоришь. А застрял скорее всего на пересчёте переходов и call'ов?)
     
  19. ProTeuS

    ProTeuS --

    Joined:
    26 Nov 2004
    Messages:
    1,239
    Likes Received:
    542
    Reputations:
    445
    >>Так что они туда пихать будут если она заморфлена будет?
    сигатуру ВМ, как было с VmProtect и каспером (на 4то я намикал)

    >>А чем отличается код декриптора от любого другого кода программы?
    нет, метаморф. а на примере декриптора я говорил о коде, слабо "общающимя" с другими 4астями софта, вообщем 4асти4ный слу4ай, так сказать...
     
  20. BUG(O)R

    BUG(O)R Elder - Старейшина

    Joined:
    15 Aug 2006
    Messages:
    63
    Likes Received:
    15
    Reputations:
    16
    Так у VMProtect'ора ВМ не заморфлена вроде.

    Метаморфу пофиг какой код, метфморф отличается от полиморфа как раз тем, что обрабатывает всё тело программы(в твоём случае считай декриптора).