╔═══════════════════════════════════════════╗
                 ║ ■                                       ■ ║
                 ║      █▀ █▀▄ █▀ █▀█ ▀█▀ █ █ █▀▄ █▀ █▀▀     ║
                 ║  THE █  █▄▀ █▄ █▄█  █  █ █ █▄▀ █▄ █▄▄     ║
                 ║      █▄ █ █ █▄ █ █  █  █▄█ █ █ █▄ ▄▄█     ║
                 ║ ■                                       ■ ║
                 ╚═══════════════════════════════════════════╝

                                 Маскировка.

-------------------------------------------------------------------------------


        День добрый (излишне). Если вы уже можете написать стандартный RCE,
 но у вас все еще недостаточно знаний, чтобы скрыть его от антивирусного
"ебомулятора" (не помню, кто его так назвал, но название подходящее), и, тем
 более, избежать обнаружения в памяти, то неплохо было бы почитать эту статью.
 
        Для начала - небольшой совет: приступайте к маскировке после того,
 как вы ПОЛНОСТЬЮ протестируете вирус на работоспособность, чтобы избежать
 после проблем с отладкой или поимкой его, если вдруг он выйдет из-под
 контроля :)

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

        Прошли уже те времена, когда простая конструкция

                     mov byte ptr files, '*'
                     ...
                     ...
                     ; заражение
                     ...
              files: db '1.com',0

 позволяла избавиться от определения "возможно инфицирован"... Теперь
 анализаторы практически универсальны, поэтому ВСЕГДА тело вируса шифруется
(если предполагается его жизнеспособность).
        Можно, конечно, как-нибудь извратиться, но скоро не останется иного
 пути избавления от детектирования, кроме как текст на HLL :)

        Методов шифровки существует много, но лучше все-ж придумать свой,
 чтобы не повторяться, в этом случае работенки для avirs прибавится.


        Тут то и вступает в дело эротический анализатор, разъебывающий код
 байт за байтом путем символического исполнения команд РАСШИФРОВЩИКА.
  Который, по идее, всегда должен присутствовать и приводить к желаемому
 результату. По идее антивирусников. Но здесь уместно чукотское выражение
"однако..."

        Существует куча особенностей машины, которые анализатор не в состоянии
 проэмулировать. Это могут быть операции с портами, пересылка данных в
 различные жопные участки памяти, типа таблицы векторов (хотя в win95 такого
 лучше не делать), трюки с аппаратными прерываниями, стеком, девайсами,
 контроллерами, недокументированными функциями системы, exeption'ами...
  Вариантов много. Чем и привлекательна такая деятельность. Тут я призываю
 вас к творчеству и исследовательским работам.

         Но с чего мы начали? "В памяти компьютера возможно нахождение..."
 Да-да. И тут антиэвристика не слишком эффективна, поскольку int 21 не
 исполняется символически, а ТРАССИРУЕТСЯ. Для тех, кто не знает, в чем
 смысл сего страшного слова, скажу, что придумано это было для отладки,
 а работает так - если установлен (set) флаг трассировки (TF), то после
 исполнения каждой команды вызывается обработчик int 1.

                     D     B     G     E
                        E     U     G     R  ??!!! 8-()
                        
         Ага! :) Ну а антивирусы используют это для нахождения вирусного кода
 в памяти. И вовсе не обязательно шифроваться. Как вы понимаете, достаточно
 анализировать TF, чтобы понять, трассируют нас али нет, и принять меры.
         В качестве мер применялся, скажем, jump куда-то в жопень, от чего
 DrWEB, например, просто вис. Но мера эта плохая - юзер должен испытывать
 ложное чувство безопасности. Поэтому простой iret тоже подойдет.

!                                                                             !
         И помните - тот же DrWEB ругается В ЛЮБОМ СЛУЧАЕ, если int 21h
 указывает на конец памяти!

!                                                                             !

        Описываемый прием называется антитрассировочный код. Существует
 еще "анти-антитрассировка", когда при исполнении команд pushf, int и
 других, получающих флаги, флаги ставились левые. Казалось бы, выхода нет.
 Однако посмотрите сюда:
                         push cs
                         pop cs
                         pushf      ;)
 Скорее всего, вам знакома эта конструкция. Если же нет, попробуйте ee
 оттрассировать (какое неприличное слово). Игра продолжается!