Деобфускатор (Адрес)
{
#==============================
БуферПечати – здесь будем собирать «чистый» код
#==============================

if Адрес входит в СписокПосещенныхАдресов:
      return;
else:
      Инструкция = ПолучитьТекущуюИнструкцию(Адрес)
      while (1):
            #==============================
            Избавляемся от лишних JMP.  Мы их просто пропускаем и не выводим на печать.
            #==============================
            If  Инструкция == JMP:
                 Адрес добавить в СписокПосещенныхАдресов
                 JMPАдрес = ПолучитьJMPАдрес (Адрес)
                 Инструкция = ПолучитьТекущуюИнструкцию(JMPАдрес)
                 Продолжить
            #==============================
            Здесь же добавим отлов «мусора». Таких инструкций, как:
            and  al, 0FF
            .....
            inc  eax
            dec  eax
            .....
            sub  bl, 0
            .....
            add  cl, 0
            .....
            push eax
            add  al, 55
            pop  eax
            .....
            or   esi, 0
            .....
            not  eax
            not  eax
            .....
            xor  al, 54
            xor  al, 54
            и т.п.
            #==============================
            If  Адрес содержит «мусор»:
                  Адрес добавить в СписокПосещенныхАдресов
                  Адрес =Адрес + размер_мусорного_кода
                  Инструкция = ПолучитьТекущуюИнструкцию(Адрес)
                  Продолжить

            #==============================
            Условия остановки нашего вечного цикла: инструкция RET и адрес входит в
            СписокПосещенныхАдресов
            #==============================
            If  (Инструкция == RET) ИЛИ (Адрес входит в СписокПосещенныхАдресов):
                  Возврат

            Инструкция добавить в БуферПечати
            Адрес добавить в СписокПосещенныхАдресов
            Адрес = Адрес + Инструкция.Длина

      Выводим на экран листинг кода - БуферПечати
}