• XSS.stack #1 – первый литературный журнал от юзеров форума

[Продаётся] MorphMePlease - Morpher C\C++ кода

В этой теме можно использовать автоматический гарант!

Octavian

Emperor
Пользователь
Регистрация
19.03.2020
Сообщения
83
Решения
1
Реакции
269
Гарант сделки
2
#------------------------------------------------------#
# Code Morpher aka MorphMePlease
#------------------------------------------------------#

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

mmp.png


У вас должно быть более 20 сообщений для просмотра скрытого контента.
MorphMePlease - проект, в котором реализованы различные техники обфускации исходного кода на Си\Си++*.
Под обфускацией / морфингом подразумевается трансформация кода с сохранением изначальной логики и работоспособности и кардинально отличающимся результатом бинарного кода после компиляции.
Морфер использует библиотеку libclang для парсинга Си кода в AST репрезентакцию и работает с ней.
Морфер умеет обрабатывать: строки, мат выражения, функции, аргументы, вызовы, циклы, условия, переменные, goto, switch, if, if-else блоки.

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

Поддержка платформ:
+ x86
+ x64
+ arm

Поддержка компиляторов:
+ Vc201х, Vc202x
+ Clang 8+

Для чего это нужно:
1. Обход детектов в статике (сигнатуры, эвристика);
2. Обход детектов в динамике (детекты в памяти, детекты по карте апи вызовов);
3. Усложнение анализа алгоритмов работы как на уровне статических инструментов анализа, так и для динамических с использованием symbolic execution;
4. Усложнение реверсинга, изучения процесса работы и копирования алгоритмов в дизассемблированном виде;
5. Изменение графа потока исполнения (CFG) и глубокое запутывание логики работы программы;
6. Изменение карты вызовов WinAPI, их последователей и расширение таблицы импорта;

#------------------------------------------------------#
# Возможности морфера:
#------------------------------------------------------#

+ 1. Constant unfolding (values morphing) через MBA (Mixed Boolean-Arithmetic Expressions) - морфинг константных значений переменных.

Результат: С помощью мат. выражений (формул) с помощью MBA (Mixed Boolean-Arithmetic expressions) и непрозрачных предикат морфятся числовые значения и подставляются вместо оригинальных. Результат выполнения формул эквивалентен оригинальному значению.

+ 2. Basic block opaque predicates morphing - генерация (несворачиваемых оптимизаторами) непрозрачных предикат, направляющих логику работы и поток управления рабочего кода.

Результат: Блоки кода IF, IF-ELSE, SWITCH, FOR, WHILE накрываются дополнительными условиями с помощью мат выражений (формул) выражений кода с помощью MBA (Mixed Boolean-Arithmetic expressions), переходы по которым невозможно предстказать без просчета результата.

+ 3. Symbolic execution protection - защита когда от постмвольного исполнения с помощью несворачиваемых циклов с расчётами, от которых зависит дальнейшая логика, переплетенная с результатами выполнения предыдущих расчетов.

+ 4. String encryption - шифрование строк. Строки расшифровываются в динамике, хранятся в виде кода а не в данных, не попадают в секцию data (опционально), можно добавить любые алгоритмы шифрования и завязывать расчет ключей на пункт 3.

+ 5. Smart trash-code generation - генератор умного мусорного кода, который не оптимизируется компилятором и не снимается механизмами свертки блоков кода (во время дизасма и эмуляции). Умеет учитывать заданную конфигом глубину генерируемого кода и основательно связывать логику на уровне мат. выражений, циклов, условий и функций.

Результат: Граф потока управления, блоки if, if-else, for, while, do-while, switch обрабатываются генератором кода, который не сворачивается, делает различные логические и арифметические действия. Генерируются случайные фейковые функции, которые вызываются в процессе исполнения кода, не влияют на логику работы, но запутывают динамические и статические анализаторы.

+ 6. Executable fake functions generation - генерация используемых исполняемых функций и вызовов их в коде. Вызовы функций формируются на основе построенного графа со случайными ветввлениями с просчитыванием карты вызовов и защитой от рекурсии.

+ 7. Function calls obfuscation - обфускация вызовов оригинальных функций цепочкой подставных функций, тем самым нарушая логику динамических сигнатур (подсчет кол-ва вызовов в глубину) и перемешивание аргументов функций с сохранением рабочей логики.

Результат: Граф потока управления вызова функций изменяется, это влияет на логику статических\динамических сигнатур, запутывает анализаторы. По кол-ву вхождений в функцию\ по количеству используемых аргументов для вызова функций.

+ 8. Legitimate strings generator - генерация текстовых строк, спаршенных с белых бинариков из системной директории windows + эмитация полезной работы с ними с помощью стандартных функций для работы со строками.

+ 9. Executable fake winapi generation - генерация случайных (безопасных) исполняемых winapi функций (с псевдо-правильными аргументами) с направлением логики работы в зависимости от результата выполнения.

- 10. Spaghetti basic block morphing (control flow morphing) - перемешивание блоков кода между собой, связывая последовательности через цепочки goto прыжков. (поддержка опции зависит от компилятора)

+ 11. Operations function replacement - замена мат операторов (+,-,*) обфусцированными аналогами или врапперами в отдельных функциях.

+ 12. Expression morphing - обфускация выражений с помощью добавления новых многоуровневых выражений, не влияющих на логику и работоспособность алгоритмов.
Результат: Дизассемблированный код становится не читаемым, сложным к восприятию логики и анализу, противодействует средствам анализа.

- 13. Control flow graph flattening - трансформация кода в конечный автомат с управлением через диспетчеризацию с полноценной сверткой циклов, условий, try..catch блоков.

+ 14. Function args obfuscation - обфускация аргументов реальных функций, тем самым нарушая сигнатуры по местам вызова функций и переходов.

+15. Dynamic antidebug and antitrace
Благодаря генерации фейковых функций и фейк winapi функций (работы с указателями) при дебаге такого файла дебагеры вылетают. (ollydbg2, x64dbg).
Ида по-умолчанию не может даже загрузить весь граф.

Результат: Граф потока управления, вся логика переходов, числовые значения, блоки if, if-else, for, while, do-while, switch обрабатываются условными переходами, результат которых невозможно предсказать без просчета. Морфятся вызовы функций, выражения, числовые значения.
Поверх этой логики генерируется невырезаемый треш код (if, if-else, for, while, do-while, switch, api calls, function calls, fake functions, math expressions, local & global variables), мусорные фейк функции, которые вызываются в процессе исполнения кода, не влияют на логику работы, но запутывают динамические и статические анализаторы. Все генерируемые блоки кода полностью рандомизированны, невозможно выявить паттерны генерируемых блоков кода. Используется контроль уровеня глубилны генерации кода - можно вариативно указывать через конфиг (config.ini).

Результат: Граф потока управления, вся логика переходов, числовые значения, блоки if, if-else, for, while, do-while, switch обрабатываются условными переходами, результат которых невозможно предсказать без просчета. Морфятся вызовы функций, выражения, числовые значения. Отморфленый код, не влияет на логику работы, но запутывает динамические и статические анализаторы.

#------------------------------------------------------#
# Результат работы:
# Что изменится после обработки проходами:
#------------------------------------------------------#
  • Количество функций
  • Количество выражений и переменных
  • Количество винапи функций
  • Условия
  • Циклы
  • Увеличится количество локальных и глобальных переменных
  • Увеличится Количество кода, который без изменения логики исполнения оригинального кода, интегрируется и эмитирует реальный код программы.
  • Количество циклов
  • Количество условных перехода
  • Количество вызовов функций
  • Количество вызовов випапи функций
  • Таблица импорта
  • Изменится Количество и соотношение Опкодов
  • Изменится размер кодовой секции
  • Исчезнут текстовые сроки, на их место визуально будут видны фейковые сроки
  • Уникальный граф потока исполнения
  • Уникальный бинарный код (ассемблированный листинг), офсеты


Условия:
Стоимость 0.25 BTC
В стоимость входит годовая поддержка решения и обновления, багфиксы.

Решение накрыто протом, защита от копирования, исходный код не входит в поставку.
Решение поставляется в виде CLI инструмента.
В сделку входит передача морфера, помощь в установке, поддержка проекта в течении года.
В проект вшит индивидуальный токен, привязанный к профилю покупателя.
Покупатель приобретает продукт морфера в личных целях и обязуется не распространять в паблик и не передавать
третьим лицам морфер и другие части проекта, а так же обязуется не оказывать услуг по морфингу чужих проектов на любой основе.
Не русскоязычных просьба не беспокоить, сделки не будет.
Сделка осуществляется исключительно через гаранта, автогарант форума.

Первый контакт, верификация ч\з пм.

У вас должно быть более 25 сообщений для просмотра скрытого контента.
TOX: 658126F3529CF09FE5A7D8DA2ED15A9F83AA8482BA428E46483A80432CBFDF5BE8531EE05640
Jb: MorphMePlease[_собака_]thesecure[_точка_]biz

Подробности, примеры морфинга при личном общении.
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Конкретно этот софт не видел, но другие работы автора говорят о высокой квалификации в области обфускации и малвари в целом.
 
Во время тестов выявились некоторые нюансы в парсере, в связи с чем беру время на допиливание движка парсера.
На это время продажи приостанавливаю. По факту обновлю топик.
Всем отписавшим спасибо за совместно проведенные тесты, вы помогаете сделать продукт лучше.

Quake3,​

благодарю за отзыв)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Приобрел морфер некоторое время назад, и вот что хочу сказать. Поначалу было достаточно много проблем, из за которых ломался код (компилятор выдавал ошибки), или же сам морфер, но автор оперативно поправил всё. Продукт полностью справляется со своей задачей. Еще хочу сказать, что лучше всего морфер работает без современного синтаксиса языка Си++ (namespace, классы, и прочее), это на текущий момент. Но автор обещает полную поддержку современного языка в скором времени. К тому же понравилось то что вместе с продуктом идет очень подробный Readme файл с описанием каждой функции морфера и ее настройкой, и описание того, как должен выглядеть код, чтобы морфер его правильно прочитал. Еще стоит сразу сказать, что морфер может сломать рантайм, по этому каждый файл нужно проверять вручную.
Я считаю, что со временем данный морфер будет только развиваться.
 
Последнее редактирование:
Привет комьюнити!

Перезапускаю продажу морфера.
Тех, кто ранее проявлял интерес к продукту, прошу еще раз связаться со мной, готов провести тесты.

За 4 месяца проделана большая работа:
  • Проведено множество тестов на разных кейсах;
  • Поправлены баги, сделаны фиксы и оптимизации;
  • Добавлены новые функции, в том числе те, о которых просили покупатели;
  • В конфиг вынесено множество новых настроек и параметров;
  • Расширен файл помощи для более быстрого знакомства с функциями и начала работы с продуктом;
  • Реализован полноценный, настраиваемый полиморфный морфер текстовых строк;
  • Добавлена опция мульморфа с заданным числом уникальных копий;
  • Добавлены различные хитрые механизмы "неочевидного" запутывания кода;
  • Добавлен морф на уровне имен переменных, названий функций, аргументов етц;
  • Добавлен морфер таблицы импорта и экспорта;
  • Сбалансирован кодогенератор, благодаря чему в IDA Pro\Ghidra код не выглядит обфусцированным;
  • Расширен список генерируемых winapi;
  • Много чего еще...
 
Последнее редактирование:
Hello community!

Restarting the morpher sale.
Those who have previously expressed interest in the product, please contact me again, I am ready to conduct tests.

A lot of work has been done in 4 months :
  • Conducted many tests on different cases;
  • Fixed bugs, made fixes and optimizations;
  • Added new features, including those requested by customers;
  • Many new settings and parameters have been added to the config;
  • The help file has been expanded for a faster acquaintance with the functions and getting started with the product;
  • A full-fledged, customizable polymorphic text string morpher has been implemented;
  • Added option to mulmorph with a given number of unique copies;
  • Added various tricky mechanisms of "non-obvious" code obfuscation;
  • Added morph at the level of variable names, function names, arguments etc;
  • Added import and export table morpher;
  • The code generator has been balanced, thanks to which the code does not look obfuscated in IDA Pro\Ghidra;
  • Extended list of generated winapi;
  • Lots more...
check tox
 
По запросам небольшой ресёрч пост с примерами:

В качестве тестового кода возьмем расчет алгоритма Евклида:

C:
#include <stdio.h>
#include <conio.h>
#include <windows.h>

// Euclidian algorithm for calculating greatest common divisor (before obfuscation)
int gcd(int n, int m)
{
    if (n < 1 || m < 1)
    {
        return -1;
    }
    while (n != m)
    {
        if (n > m)
        {
            n -= m;
        }
        else
        {
            m -= n;
        }
    }
    return n;
}

// Tests in triplets { n, m, expected_gcd( n, m ) }
int tests[][3] = {
    { 1, 2, 1 },
    { 3, 3, 3 },
    { 42, 56, 14 },
    { 249084, 261183, 111 },
};

// Perform tests
int main(int, char* [])
{
    const char* toPrint1 = "Performing tests of gcd function:\n";
    printf(toPrint1);
    bool passed = true;
   
    for (int i = 0; i < sizeof(tests) / sizeof(tests[0]); i++)
    {
        int n = tests[i][0];
        int m = tests[i][1];
        int expected_gcd = tests[i][2];
        int calculated_gcd = gcd(n, m);
        const char* toPrint2 = "  %d. gcd( %d, %d ) = %d, ";
        printf(toPrint2, i + 1, n, m, calculated_gcd);
        if (calculated_gcd == expected_gcd)
        {
            const char* toPrint3 = "OK.\n";
            printf(toPrint3);
        }
        else
        {
            const char* toPrint4 = "error.\n";
            printf(toPrint4);
            passed = false;
        }
    }
    const char* toPrint5 = "Tests %s.\n";
    const char* toPrint6 = "passed";
    const char* toPrint7 = "failed";
    printf(toPrint5, passed ? toPrint6 : toPrint7);
   
    while (!_kbhit())
    {
        //do nothing
    }
    return passed ? 0 : 1;
}
}

    const char* toPrint5 = "Tests %s.\n";

    const char* toPrint6 = "passed";
    const char* toPrint7 = "failed";
    printf(toPrint5, passed ? toPrint6 : toPrint7);  

    while (!_kbhit())
    {
        //do nothing
    }

    return passed ? 0 : 1;

}

Выставим настройки оптимизации компилятора на макс:
max_optimizations_turned_on.png


Скомпилируем и посмотрим его CFG в IDA PRO:
before_pic.png



Морфим проект с помощью MMP:
У вас должно быть более 50 сообщений для просмотра скрытого контента.

//================================================================================
// Total morpher statistics after I level passes:
//================================================================================
// morphing with advanced trash generator -> ENABLED
// morphing with advanced trash generator -> ENABLED
// morphing expressions with MBA -> ENABLED
// morphing code with fake operations without logic changing -> ENABLED
// morphing & mixing code with GOTO jumps -> ENABLED
// morphing calls with function wrappers -> ENABLED
// morphing with opaque predicates -> ENABLED
// morphing IF blocks with additional logic -> ENABLED
// morphing int (const) values -> ENABLED
//================================================================================
// [+] generated functions: 15
// [+] generated loop blocks: 20
// [+] generated if blocks: 289
// [+] generated switch blocks: 29
// [+] generated goto fake jumps: 39
// [+] generated simple trash blocks: 791
// [+] generated while blocks: 16
// [+] generated gen_code blocks: 800
// [+] generated function calls: 66
// [+] generated winapi calls: 69
// [+] generated fake legitimate strings: 32
//================================================================================

Проверяем результат в IDA Pro:
ida_complex_message.png

IDA сообщает, что граф слишком сложный для отображения и имеет более 1к ветвлений. Впрочем если достаточно RAM, то в конфиге можно увеличить лимит отображения.


graph_flow.png

Конечный граф с трудом удаётся заскриншотить из за его размеров и большого числа ветвлений.

Проверяем работоспособность:

До морфа: 9 кб.
before_release.png


После морфа - 71 кб с учетом максимальных оптимизаций компилятора:
after_release.png



SSDEEP before: 192:NQT0GEJ7+9E46Q3JOB462V7E5PZ67VSK+LJM:N/GU7AN6IJS4N78K+LJM
SSDEEP after: 1536:JNCK/KTGZ03APO/RT9THBGRVWJPJKHJ4S:RFSAIHH7BGRUJGHR
IMPHASH before: 732E2D9932B83E1388425AFB13839280
IMPHASH after: 8361F4C3415D7C237A4007E841B0AF6D

sections_entropy_ratio_statistics.png


си псевдокод (binary ninja) функции gcd ДО и ПОСЛЕ морфа:

(в листинге ДО, компилятор оптимизировал функцию gcd, объединив код с кодом из main)
C:
00401040  int32_t main(int32_t arg1, char** arg2)

00401040  {
0040104e      printf("Performing tests of gcd function…");
00401053      int32_t edx = 0;
00401055      char var_c = 1;
0040105c      int32_t var_8 = 0;
0040105f      void* edi = nullptr;
004010f0      uint32_t ebx_3;
004010f0      do
004010f0      {
00401061          int32_t ecx_1 = *(int32_t*)((char*)edi + 0x40216c);
00401067          int32_t esi_1 = ecx_1;
00401069          int32_t eax_1 = *(int32_t*)((char*)edi + 0x402174);
0040106f          int32_t ebx_1 = *(int32_t*)((char*)edi + 0x402170);
00401078          int32_t eax_2 = ebx_1;
00401082          if ((ecx_1 < 1 || (ecx_1 >= 1 && ebx_1 < 1)))
0040107f          {
004010ab              esi_1 = 0xffffffff;
004010ab          }
00401086          if (((ecx_1 >= 1 && ebx_1 >= 1) && ecx_1 != ebx_1))
00401084          {
0040109e              int32_t edx_2;
0040109e              do
0040109e              {
0040108c                  edx_2 = (esi_1 - eax_2);
00401090                  if (esi_1 <= eax_2)
0040108e                  {
00401090                      edx_2 = esi_1;
00401090                  }
00401093                  int32_t ecx_3 = (eax_2 - esi_1);
00401095                  bool cond:4_1 = esi_1 <= eax_2;
00401097                  esi_1 = edx_2;
00401099                  if (cond:4_1)
00401099                  {
00401099                      eax_2 = ecx_3;
00401099                  }
00401099              } while (edx_2 != eax_2);
004010a0              ecx_1 = *(int32_t*)((char*)edi + 0x40216c);
004010a6              edx = var_8;
004010a6          }
004010b8          var_8 = (edx + 1);
004010bb          printf("  %d. gcd( %d, %d ) = %d, ", (edx + 1), ecx_1, ebx_1, esi_1);
004010c5          bool cond:3_1 = esi_1 == eax_1;
004010cd          ebx_3 = ((uint32_t)var_c);
004010d0          if (esi_1 != eax_1)
004010c5          {
004010d0              ebx_3 = 0;
004010d0          }
004010d3          char* eax_3 = "error.\n";
004010d8          if (cond:3_1)
004010d8          {
004010d8              eax_3 = "OK.\n";
004010d8          }
004010db          var_c = ebx_3;
004010df          printf(eax_3);
004010e4          edx = var_8;
004010e7          edi = ((char*)edi + 0xc);
004010e7      } while (edi < 0x30);
004010fd      int32_t eax_4 = 0x40215c;  // {"passed"}
00401102      if (ebx_3 == 0)
004010fb      {
00401102          eax_4 = 0x402164;  // {"failed"}
00401102      }
0040110b      printf("Tests %s.\n", eax_4);
00401124      int32_t eax_5;
00401124      do
00401124      {
00401120          eax_5 = _kbhit();
00401120      } while (eax_5 == 0);
0040112c      int32_t eax_6;
0040112c      eax_6 = ebx_3 == 0;
00401133      return eax_6;
00401133  }

C:
004067b0  int32_t sub_4067b0()
004067b0  {
004067c1      void var_2e8;
004067c1      int32_t eax_1 = (data_412004 ^ &var_2e8);
004067d3      int32_t eax_3;
004067d3      int32_t edx;
004067d3      edx = HIGHW(((int64_t)data_412064));
004067d3      eax_3 = LOWW(((int64_t)data_412064));
004067d4      int32_t var_260 = eax_3;
004067db      int32_t eax_4 = data_41204c;
004067e0      int32_t var_25c = edx;
004067fa      int16_t var_2d0 = 0x639c;
004067ff      int32_t ecx = data_412050;
00406813      char var_2e2 = 0x79;
0040681f      int32_t var_280 = ((int32_t)data_412036);
00406823      int32_t eax_5;
00406823      eax_5 = data_41201b;
00406828      int32_t var_2cc = 0xb24d;
00406830      int32_t var_278 = eax_5;
00406834      uint32_t eax_6 = ((uint32_t)data_412060);
0040683f      uint16_t eax_7 = ((uint16_t)data_412018);
0040685b      int32_t var_290 = 0xbf92a1c5;
00406863      int32_t var_28c = 0x3039e;
0040686b      uint32_t eax_8 = ((uint32_t)data_412062);
0040687b      uint32_t var_26c = 0xb9;
00406888      int32_t var_2c8 = 0xb9d80779;
00406895      char var_2e1 = ((int8_t)data_412048);
004068a0      int32_t eax_11;
004068a0      int32_t edx_1;
004068a0      edx_1 = HIGHW(((int64_t)data_412034));
004068a0      eax_11 = LOWW(((int64_t)data_412034));
004068a1      int32_t var_2b8 = eax_11;
004068a5      int32_t var_2b4 = edx_1;
004068b0      int32_t eax_13;
004068b0      int32_t edx_2;
004068b0      edx_2 = HIGHW(((int64_t)((uint32_t)data_412026)));
004068b0      eax_13 = LOWW(((int64_t)((uint32_t)data_412026)));
004068b1      char var_268 = 0x93;
004068b9      int32_t var_2c0 = eax_13;
004068c4      int32_t edi = edx_2;
004068c6      int32_t var_284 = 0xe636c73f;
004068ce      int32_t eax_15;
004068ce      int32_t edx_3;
004068ce      edx_3 = HIGHW(((int64_t)data_412030));
004068ce      eax_15 = LOWW(((int64_t)data_412030));
004068cf      int32_t var_260_1 = eax_15;
004068db      int32_t var_25c_1 = edx_3;
004068ee      var_268 = ((int16_t)data_412080);
004068f6      var_268 = 0x8533;
00406905      int32_t eax_17;
00406905      int32_t edx_4;
00406905      edx_4 = HIGHW(((int64_t)data_412063));
00406905      eax_17 = LOWW(((int64_t)data_412063));
00406906      int32_t var_260_2 = eax_17;
00406912      int32_t var_25c_2 = edx_4;
00406919      var_268 = 0xde;
00406928      int32_t eax_19;
00406928      int32_t edx_5;
00406928      edx_5 = HIGHW(((int64_t)((uint32_t)data_412062)));
00406928      eax_19 = LOWW(((int64_t)((uint32_t)data_412062)));
00406929      int32_t var_260_3 = eax_19;
00406930      int32_t var_25c_3 = edx_5;
00406937      eax_19 = data_412033;
0040693c      eax_19 = data_412019;
00406941      int32_t ecx_1 = data_412038;
00406947      int32_t eax_20 = data_41203c;
0040694c      int32_t var_260_4 = ecx_1;
0040695f      int32_t var_254 = edi;
00406966      int32_t var_2a8 = ecx_1;
0040696a      int32_t eax_21 = atol(0x410294);
00406970      (*(int32_t*)data_4e8924) = eax_21;
00406978      int32_t var_29c = eax_21;
0040697c      eax_21 = var_2e1;
00406989      if (data_412028 < ((uint32_t)eax_21))
00406980      {
00406a0e          if (data_412018 != 0)
00406a07          {
00406a1a              int32_t eax_27;
00406a1a              eax_27 = (var_278 + var_278);
00406a1c              eax_27 = (eax_27 + data_412066);
00406a24              var_278 = eax_27;
00406a31              data_412064 = ((int16_t)(!(data_412020 + (!data_412048))));
00406a3d              int16_t eax_30;
00406a3d              eax_30 = (data_41202c + 0x63);
00406a3f              data_412026 = eax_30;
00406a3f          }
00406a07      }
00406991      else if (eax_7 == 0)
0040698b      {
004069b6          int32_t edx_6 = data_412028;
004069c3          int32_t edx_7 = (-edx_6);
004069cf          int32_t eax_23;
004069cf          eax_23 = ((int16_t)data_41202e);
004069dc          eax_23 = (!eax_23);
004069df          eax_23 = (eax_23 + (0x79 * ((int16_t)(!(((edx_7 - edx_7) + 1) - ((int32_t)data_412036))))));
004069e2          eax_23 = (!eax_23);
004069e5          int16_t var_2ac_1 = eax_23;
004069ef          int32_t eax_25;
004069ef          int32_t edx_12;
004069ef          edx_12 = HIGHW(((int64_t)((uint32_t)var_2e1)));
004069ef          eax_25 = LOWW(((int64_t)((uint32_t)var_2e1)));
004069f7          var_2c0 = (eax_25 - 0xc4);
004069fb          edi = (edx_12 - 1);
004069fe          var_254 = edi;
004069fe      }
00406998      else
00406998      {
00406998          int32_t ecx_2 = 0x197;
0040699d          data_412030 = 0x802e;
004069af          int32_t temp2_1;
004069af          do
004069af          {
004069a8              int32_t var_2c8_1 = 0x33a6;
004069ac              temp2_1 = ecx_2;
004069ac              ecx_2 = (ecx_2 - 1);
004069ac          } while (temp2_1 != 1);
004069ac      }
00406a4d      int32_t var_2a8_1 = (var_29c + 0x415);
00406a5e      if ((data_412080 | data_412084) == 0)
00406a5c      {
00406a67          int32_t eax_33;
00406a67          eax_33 = 0x639c;
00406a7c          var_2d0 = ((eax_33 - 0x639c) - eax_6);
00406a81          int32_t eax_35 = data_412050;
00406a93          var_290 = (eax_35 << 7);
00406a97          var_28c = ((data_412054 << 7) | (eax_35 >> 0xffffffe7));
00406a8c      }
00406a60      else
00406a60      {
00406a60          var_2e1 = 0x46;
00406a60      }
00406a9f      int32_t esi_1 = 0x168a;
00406aa9      int32_t var_1fc = (var_29c + 0x578);
00406abc      int32_t var_290_1 = (var_290 + var_2c0);
00406ac2      int32_t var_28c_1 = (var_28c + edi);
00406b30      int32_t edx_15;
00406b30      int32_t temp5_1;
00406b30      do
00406b30      {
00406ad0          int32_t eax_40;
00406ad0          eax_40 = ((int16_t)data_412067);
00406ae2          uint32_t var_2f4_1 = ((uint32_t)eax_40);
00406ae3          sub_402da0();
00406afd          int32_t edx_14;
00406afd          edx_14 = false;
00406b04          int32_t ecx_16;
00406b04          ecx_16 = false;
00406b09          edx_15 = var_284;
00406b14          if (eax_4 != 0)
00406b0f          {
00406b1c              var_26c = (var_26c + 1);
00406b23              edx_15 = ((edx_15 + edx_15) - var_2b8);
00406b29              var_284 = edx_15;
00406b29          }
00406b2d          temp5_1 = esi_1;
00406b2d          esi_1 = (esi_1 - 1);
00406b2d      } while (temp5_1 != 1);
00406b3b      int32_t var_238 = (var_29c + 0x5ef);
00406b56      char var_264 = (((int8_t)data_412078) * -0x38);
00406b65      int32_t edx_17 = (edx_15 - ((uint32_t)var_26c));
00406b67      int32_t eax_47 = (*(int32_t*)data_4e8924);
00406b70      int32_t esi_2 = data_412050;
00406b87      int32_t eax_49;
00406b87      int32_t edx_18;
00406b87      edx_18 = HIGHW(((int64_t)((uint32_t)data_41201a)));
00406b87      eax_49 = LOWW(((int64_t)((uint32_t)data_41201a)));
00406b88      int32_t esi_3 = (esi_2 - eax_49);
00406b8a      int32_t eax_50 = data_412050;
00406b8f      int32_t ecx_19 = data_412054;
00406b95      int32_t edi_3 = (data_412054 - edx_18);
00406b99      data_412050 = (eax_50 + esi_3);
00406ba0      data_412054 = (ecx_19 + edi_3);
00406bb3      int32_t eax_53;
00406bb3      int32_t edx_19;
00406bb3      edx_19 = HIGHW(((int64_t)var_2d0));
00406bb3      eax_53 = LOWW(((int64_t)var_2d0));
00406bb8      int32_t eax_54;
00406bb8      int32_t edx_20;
00406bb8      eax_54 = __allmul(0x1091, 0, eax_53, edx_19);
00406bc5      int32_t ecx_21 = (0x1091 - eax_54);
00406bcb      int32_t esi_4 = (0 - edx_20);
00406bd5      int32_t eax_56 = (eax_47 + 0x3c5);
00406be5      bool cond:2 = data_412018 == 0;
00406bec      data_41201c = eax_6;
00406bf1      uint32_t eax_57;
00406bf1      if (cond:2)
00406bf1      {
00406bfc          eax_57 = var_280;
00406bfc      }
00406bf3      else
00406bf3      {
00406bf3          eax_57 = var_264;
00406bf3      }
00406c07      data_412063 = eax_57;
00406c0c      int32_t var_248 = 0x1229;
00406d3a      int32_t esi_5;
00406d3a      int32_t temp9_1;
00406d3a      do
00406d3a      {
00406c17          uint32_t* eax_58;
00406c17          char edx_21;
00406c17          eax_58 = GetLargePageMinimum();
00406c1d          data_412027 = eax_58;
00406c27          eax_58 = data_412027;
00406c2c          bool c_7 = 6 < eax_58;
00406c2e          eax_58 = data_412027;
00406c41          if ((-((char*)eax_58 - eax_58)) >= (-(6 - 6)))
00406c33          {
00406c47              esi_5 = edx_17;
00406c59              var_278 = (((int32_t)var_278) * 0xffffffcd);
00406c64              data_412028 = (data_412028 | (data_412028 ^ esi_5));
00406c57          }
00406c72          else
00406c72          {
00406c72              int32_t eax_66 = (var_2c0 | var_254);
00406c74              int32_t ecx_27;
00406c74              if (eax_66 != 0)
00406c72              {
00406c7b                  ecx_27 = 0;
00406c7b              }
00406c76              else
00406c76              {
00406c76                  ecx_27 = (eax_66 + 1);
00406c76              }
00406c86              if (ecx_27 <= ((int32_t)data_41202e))
00406c7d              {
00406cc3              label_406cc3:
00406cc3                  int32_t eax_70;
00406cc3                  int32_t edx_24;
00406cc3                  eax_70 = __allmul(data_412058, data_41205c, data_412078, data_41207c);
00406cd6                  uint32_t eax_71 = ((uint32_t)(*(int16_t*)data_4e8924));
00406cdd                  int32_t esi_8 = (data_41207c | edx_24);
00406cdf                  data_412078 = (data_412078 | eax_70);
00406ce5                  var_26c = eax_71;
00406cf3                  data_41207c = esi_8;
00406d09                  int32_t eax_74;
00406d09                  int32_t edx_25;
00406d09                  edx_25 = HIGHW(((int64_t)((uint32_t)var_264)));
00406d09                  eax_74 = LOWW(((int64_t)((uint32_t)var_264)));
00406d0d                  int32_t eax_75;
00406d0d                  int32_t edx_26;
00406d0d                  eax_75 = __allmul(eax_74, edx_25, data_412080, data_412084);
00406d1e                  int32_t eax_76;
00406d1e                  int32_t edx_27;
00406d1e                  eax_76 = __allmul(eax_75, edx_26, 0x82bc2dbf, 0x4cf42);
00406d23                  data_412080 = eax_76;
00406d28                  data_412084 = edx_27;
00406d28              }
00406c88              else
00406c88              {
00406c88                  int32_t ecx_28 = data_412070;
00406c96                  bool cond:3_1 = esi_4 < 0;
00406c98                  if (esi_4 <= 0)
00406c96                  {
00406c9e                      if (cond:3_1)
00406c9e                      {
00406c9e                          goto label_406cc3;
00406c9e                      }
00406ca2                      if (ecx_21 <= ecx_28)
00406ca0                      {
00406ca2                          goto label_406cc3;
00406ca2                      }
00406ca2                  }
00406c96              }
00406d2e              esi_5 = edx_17;
00406d2e          }
00406d32          temp9_1 = var_248;
00406d32          var_248 = (var_248 - 1);
00406d32      } while (temp9_1 != 1);
00406d49      int32_t var_2a8_2 = (eax_47 + 0x52a);
00406d4d      data_412048;
00406d53      sub_401050();
00406d5a      data_412032 = 0x33;
00406d61      int32_t edx_28;
00406d61      edx_28 = true;
00406d68      int32_t ecx_34;
00406d68      ecx_34 = true;
00406dcc      data_41204c = (((uint32_t)data_412026) + 0x5a16);
00406ddb      int32_t eax_87 = (eax_47 + 0x713);
00406deb      int32_t eax_88 = (*(int32_t*)data_4e8924);
00406df9      char eax_90;
00406df9      int32_t edx_31;
00406df9      eax_90 = IsValidCodePage(ecx);
00406dfb      data_41201a = eax_90;
00406e09      var_268 = (eax_88 + 0x438);
00406e17      data_412078;
00406e1d      uint32_t var_2f4_6 = ((uint32_t)(*(int16_t*)data_41204c));
00406e1e      data_41207c;
00406e23      edx_31 = data_41208c;
00406e2a      sub_402da0();
00406e33      data_412074 = 0x5eae;
00406e38      int32_t eax_95;
00406e38      eax_95 = data_412088;
00406e49      data_41205c;
00406e4f      BOOL eax_97 = IsValidCodePage(data_412058);
00406e5c      int32_t eax_100;
00406e5c      int32_t edx_33;
00406e5c      int32_t esi_11;
00406e5c      int32_t edi_5;
00406e5c      if (data_412037 != 0)
00406e51      {
00406e69          if (0xffffff86 <= (!esi_5))
00406e63          {
00406e77              var_260_4 = 0;
00406e80              esi_11 = eax_20;
00406e87              edi_5 = var_260_4;
00406e87          }
00406e6b          else
00406e6b          {
00406e6b              edi_5 = 1;
00406e70              esi_11 = 0;
00406e70          }
00406e9a          int32_t eax_99;
00406e9a          int32_t edx_32;
00406e9a          edx_32 = HIGHW(((int64_t)data_412034));
00406e9a          eax_99 = LOWW(((int64_t)data_412034));
00406ea2          eax_100 = __allmul(eax_99, edx_32, 0x6f45903a, 0xa36b1);
00406e95      }
00406ead      if ((data_412037 == 0 || ((data_412037 != 0 && edi_5 == eax_100) && esi_11 == edx_33)))
00406eab      {
00406eeb          data_41201c = ((var_290_1 + 0x85) ^ ((!data_412070) - ((int32_t)var_278)));
00406ed0      }
00406ead      if ((data_412037 != 0 && (edi_5 != eax_100 || (edi_5 == eax_100 && esi_11 != edx_33))))
00406eab      {
00406eb9          data_412028 = sub_402be0();
00406ec3          data_412028;
00406ec3      }
00406efa      int32_t var_2a8_3 = (eax_88 + 0x3bc);
00406f04      data_412054;
00406f0a      HWND eax_109 = GetParent(data_412050);
00406f14      int32_t edx_37 = data_412078;
00406f20      HWND var_284_2 = eax_109;
00406f24      HWND var_260_5 = eax_109;
00406f2f      uint32_t var_294 = 0;
00406f33      uint32_t var_25c_5 = 0;
00406f3a      int32_t esi_13 = (data_41207c + 0);
00406f46      int32_t ecx_48;
00406f46      if (((edx_37 + ecx) != eax_4 || ((edx_37 + ecx) == eax_4 && esi_13 != 0)))
00406f44      {
00406f4c          ecx_48 = 1;
00406f4c      }
00406f46      if (((edx_37 + ecx) == eax_4 && esi_13 == 0))
00406f44      {
00406f48          ecx_48 = 0;
00406f48      }
00406f51      int32_t eax_110;
00406f51      eax_110 = data_412062;
00406f56      int32_t edx_39 = data_412058;
00406f5c      int32_t eax_111 = data_41205c;
00406f61      bool cond:5 = eax_111 > 0;
00406f6a      int32_t eax_112;
00406f6a      if ((eax_111 < 0 || ((eax_111 >= 0 && (!cond:5)) && edx_39 < 1)))
00406f67      {
00406f73          eax_112 = 0;
00406f73      }
00406f6a      if ((eax_111 >= 0 && (cond:5 || ((!cond:5) && edx_39 >= 1))))
00406f67      {
00406f6c          eax_112 = 1;
00406f6c      }
00406f77      if (ecx_48 == eax_112)
00406f75      {
00406f80          eax_112 = data_4e8924;
00406f85          var_2e2 = 0x3e;
00406f8a          data_412036 = eax_112;
00406f8a      }
00406fa6      else if (ecx != 0)
00406fa1      {
00406fbc          int32_t var_2c8_3 = (eax_97 - (eax_97 ^ ((int32_t)var_2d0)));
00406fc7          int32_t ecx_50;
00406fc7          ecx_50 = var_2d0;
00406fcf          int32_t edx_40;
00406fcf          edx_40 = data_41202c == 0;
00406fde          int32_t eax_118;
00406fde          eax_118 = ecx_50 == 0;
00406fe9          int32_t eax_121;
00406fe9          int32_t edx_41;
00406fe9          edx_41 = HIGHW(((int64_t)((eax_118 - ((int32_t)var_278)) + edx_40)));
00406fe9          eax_121 = LOWW(((int64_t)((eax_118 - ((int32_t)var_278)) + edx_40)));
00406fec          int32_t esi_15 = (eax_121 - ecx);
00406fee          int32_t ecx_54 = data_412050;
00407002          int32_t eax_123;
00407002          if (((ecx_54 + esi_15) | (data_412054 + (edx_41 - 0))) != 0)
00407000          {
00407008              eax_123 = 0;
00407008          }
00407004          else
00407004          {
00407004              eax_123 = 1;
00407004          }
0040700a          data_412066 = eax_123;
0040700f          eax_123 = data_4e8924;
00407014          data_412018 = eax_123;
00407014      }
0040701d      int32_t eax_125 = (eax_88 + 0x56f);
00407037      int32_t var_298_1 = (eax_8 + ((int32_t)data_41201b));
0040704a      data_412028 = (data_412028 + (data_412028 + ((uint32_t)data_412060)));
00407050      int32_t eax_128;
00407050      eax_128 = var_2e1;
00407054      char eax_129 = ((int8_t)(*(int32_t*)data_4e8924));
00407074      data_412034 = (data_412034 + (((int16_t)data_412063) * 0x5f51));
0040707a      int16_t eax_131;
0040707a      eax_131 = var_2e2;
00407088      uint16_t ecx_61 = (((uint16_t)eax_131) - ((uint16_t)data_412037));
00407094      char eax_134 = (eax_129 + 0x25);
004070a2      int32_t edi_6 = data_412074;
004070a8      int32_t edi_7 = (edi_6 + var_284_2);
004070ac      int32_t ecx_62 = data_412070;
004070c9      int32_t eax_138;
004070c9      int32_t edx_43;
004070c9      edx_43 = HIGHW((data_41203c * ecx_62));
004070c9      eax_138 = LOWW((data_41203c * ecx_62));
004070d2      int32_t eax_140;
004070d2      int32_t edx_44;
004070d2      edx_44 = HIGHW((data_412038 * ecx_62));
004070d2      eax_140 = LOWW((data_412038 * ecx_62));
004070e1      int32_t eax_143;
004070e1      if (((eax_140 & (edi_7 - 0xa36e)) | ((eax_138 + edx_44) & ((0 + 0) - 1))) != 0)
004070df      {
004070ea          eax_143 = 0;
004070ea      }
004070e3      else
004070e3      {
004070e3          eax_143 = 1;
004070e3      }
004070ec      int32_t var_2d4_1 = eax_143;
004070f0      int32_t edx_45 = data_412058;
004070f6      int32_t esi_19 = data_41205c;
00407106      data_412058 = (edx_45 + var_2b8);
0040710e      data_41205c = (esi_19 + var_2b4);
00407118      char eax_146 = (eax_129 + 0x29);
0040711d      uint32_t var_278_1 = 0x67ed;
00407135      char var_200 = (eax_129 + 0x53);
0040713c      data_412058 = 4;
00407146      data_41205c = 0;
00407165      data_412036 = (data_412036 * data_412037);
0040716f      int32_t ecx_65 = data_412068;
0040717a      int32_t esi_21 = data_41206c;
00407180      int32_t eax_152;
00407180      int32_t edx_47;
00407180      edx_47 = HIGHW(0x5d75d217);
00407180      eax_152 = LOWW(0x5d75d217);
00407183      data_412068 = (ecx_65 - 0x5d75d217);
0040718b      data_41206c = (esi_21 - 0);
0040719d      int32_t var_2c8_4 = (((int32_t)data_412034) ^ 0x1701f1a7);
004071a1      int32_t eax_155 = data_412058;
004071a6      int32_t ecx_67 = data_41205c;
004071bc      if ((ecx_67 >= 0 && (ecx_67 <= 0 && eax_155 >= 0)))
004071ba      {
004071c2          bool cond:9_1 = ecx_67 < 0;
004071cf          if ((ecx_67 <= 0 && (cond:9_1 || ((!cond:9_1) && eax_155 <= 4))))
004071cc          {004071d5              /* jump -> *(int32_t*)((eax_155 << 2) + &data_40e8b0) */
004071d5          }
004071d5      }
0040737c      int32_t eax_156 = (*(int32_t*)data_4e8924);
00407393      int32_t var_2a8_4 = (eax_156 + 0x68c);
0040739b      char eax_160 = (eax_156 + 0x4a);
004073b1      if (data_41204c == var_298_1)
004073ab      {
004073bb          edx_47 = 0x20;
004073c2          int32_t ecx_68;
004073c2          ecx_68 = 0;
004073cc          data_412019 = sub_402150(var_280, 0x5b, 0);
004073d8          if (data_412019 != 0)
004073d1          {
004073e5              int32_t esi_23 = data_412050;
004073eb              int32_t ecx_69 = data_412054;
004073f1              int32_t eax_165;
004073f1              int32_t edx_48;
004073f1              edx_48 = HIGHW(((int64_t)data_41202e));
004073f1              eax_165 = LOWW(((int64_t)data_41202e));
004073f2              bool cond:8_1 = ecx_69 < edx_48;
004073fa              int32_t ecx_70;
004073fa              if ((ecx_69 > edx_48 || ((ecx_69 <= edx_48 && (!cond:8_1)) && esi_23 >= eax_165)))
004073f8              {
00407403                  ecx_70 = 0;
00407403              }
004073fa              if ((ecx_69 <= edx_48 && (cond:8_1 || ((!cond:8_1) && esi_23 < eax_165))))
004073f8              {
004073fc                  ecx_70 = 1;
004073fc              }
0040741e              if (((ecx_70 != 1 || (ecx_70 == 1 && data_412067 == 0)) || ((ecx_70 == 1 && data_412067 != 0) && data_412063 == 0)))
00407417              {
00407477                  int32_t eax_175;
00407477                  int32_t edx_49;
00407477                  edx_49 = HIGHW(((int64_t)((uint32_t)var_26c)));
00407477                  eax_175 = LOWW(((int64_t)((uint32_t)var_26c)));
00407478                  data_412068 = eax_175;
0040747d                  data_41206c = edx_49;
0040748e                  var_280 = data_412068;
00407497                  data_41202e = 0xa6;
00407497              }
0040742f              if ((((ecx_70 == 1 && data_412067 != 0) && data_412063 != 0) && ((int32_t)data_412064) > data_412020))
00407420              {
00407441                  int32_t var_2bc_1 = (((uint32_t)data_41202f) - 0x9b80);
0040744f                  data_412028 = (((uint32_t)ecx_61) + 0xf0437c1);
00407467                  data_41204c = (((int32_t)data_41202c) + (!((uint32_t)var_26c)));
00407454              }
0040742d          }
004073d1      }
004074a9      else if (0xb24d == ((uint32_t)data_412018))
0040749e      {
004074ab          uint32_t eax_176;
004074ab          eax_176 = data_412027;
004074c0          int32_t eax_178;
004074c0          eax_178 = data_412036;
004074c9          data_412032 = (!(0x67ed - eax_4)) == (-(0x33a6 ^ ((uint32_t)eax_176)));
004074b5      }
004074d9      char var_218 = (eax_156 + 0x53d);
004074e7      data_41204c = 0xdfd5;
004074f1      int16_t var_2d8 = (0x33a6 + 1);
004074f6      int32_t eax_181 = (*(int32_t*)data_4e8924);
00407511      int32_t eax_182;
00407511      if ((ecx_21 == 0xffff6758 && esi_4 == 0xffffffff))
0040750e      {
00407513          eax_182 = data_412024;
00407513      }
00407519      eax_182 = var_2d8;
00407522      data_412074;
00407527      data_412027;
0040752c      int32_t ecx_78;
0040752c      ecx_78 = data_412027;
00407537      ecx_78 = (ecx_78 - data_412036);
00407539      data_412027 = ecx_78;
00407553      data_412066 = (ecx_21 ^ 0x59);
00407559      int32_t var_2a8_5 = (eax_181 + 0x6e1);
00407566      int32_t var_2a8_6 = (eax_181 + 0x609);
00407575      data_412048 = (data_412028 + data_412048);
00407583      data_41202e = (((int8_t)data_41202c) + 0x6b);
0040758c      char eax_192 = (eax_181 - 0x3f);
0040759e      HANDLE var_2e0_1 = GetCurrentProcess();
004075a2      int32_t eax_194 = (*(int32_t*)data_4e8924);
004075a7      int32_t var_2dc_1 = 0;
004075bd      data_412048 = (((int32_t)data_412067) * 0x54);
004075c7      int32_t eax_197;
004075c7      eax_197 = (data_412074 + (*(int8_t*)data_412020));
004075d1      eax_197 = (eax_197 + 2);
004075d3      eax_197 = (eax_197 + var_26c);
004075da      int32_t var_274 = eax_197;
004075ee      uint32_t var_2c4_1 = (eax_4 & (eax_4 * ((uint32_t)data_41201a)));
004075fb      int32_t var_240 = (eax_194 + 0x5d6);
00407602      int32_t eax_202;
00407602      eax_202 = var_2e1;
00407619      uint16_t eax_203;
00407619      eax_203 = (*(int8_t*)data_412038);
0040761e      data_412067 = (data_412067 - eax_203);
00407624      data_412060 = (var_290_1 * ((uint16_t)eax_202));
00407634      int32_t var_2a8_7 = (eax_194 + 0x6e6);
00407638      int32_t eax_206 = data_412020;
00407641      uint32_t var_2d4_2 = 0x67e;
00407653      data_41204c = (data_412074 + 0x4c48ca57);
00407661      int32_t var_220 = (eax_194 + 0x6c8);
0040766f      if (data_412074 != 0)
00407668      {
0040767d          data_412030 = IsValidCodePage(data_412020);
00407671      }
0040768c      else
0040768c      {
0040768c          int32_t eax_210;
0040768c          eax_210 = data_412024;
00407696          int32_t eax_213;
00407696          eax_213 = 0x51;
00407698          data_41201a = 0x51;
00407698      }
    ...

У вас должно быть более 50 сообщений для просмотра скрытого контента.

Полный листинг функции int gcd(int n, int m) после морфа, пароль тот же, что и на архив: cryptobin.co/26q205j3

Для тех, кто хочет лично посмотреть результат, выкладываю файлы БД от IDA Pro 7.2 в формате idb, можно загнать в диафору или биндиф.
пасс закриптованная фраза с помощью Kamasutra (Substitution cipher described in the Kama Sutra (400 BC)): "xss.pro MorphMePlease"
 
Часть 2. Продолжаем ресёрч и демонстрацию возможностей MMP.

Общий вид.
После морфинга у скомпилированного бинарика естественным образом меняются хэши как четкие так и нечеткие.
Меняется размер секций и итоговый размер в целом. Меняется энтропия.

whle_inf.png


Импорт.
Морфер умеет "морфить" таблицу импорта несколькими способами:
1. При генерации фейковых Winapi вызовов в коде, они естественным образом попадают в таблицу импорта бинарика.
2. При выборе опции MorphImportTable, мы на уровне процесса морфинга задаём компилятору какие апишки и из каких модулей мы хотим добавить. (И они появятся в таблице импорта в бинарике. Но есть нюансы - без вызовов в коде могут быть тригеры, нужно совмещать с п.1)

IMPHASH - это плавающий хэш, по которому АВ могут отслеживать наследовательность. Чем силнее отличаются хэши у двух файлов, тем с точки зрения эвристика они сильнее они отличаются друг от друга. Подробнее можно почитать тут https://www.mandiant.com/resources/blog/tracking-malware-import-hashing.
Морфинг таблицы импорта решает эту задачу очень хорошо.
Аналогично морфер имеет возможность "морфить таблицу экспорта".

Так выглядит таблица импорта до и после:
imp_tbl.png

И соотвественно импортируемые модули:

imp_modules.png



Код.

В ходе процесса морфинга генерируется и "мусорный код". Но по факту это код нельзя назвать мусорным, потому как он:
1. Исполняется, т.е. "влияет на ход исполнения с точки зрения анализатора АВ", при этом не влияет на логику изначального алгоритма.
2. Органично "наполняет" псевдо-полезной логикой, разбавляю оригинальный код, при этом используя общие переменные без их изменения.

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

Функция main.

ДО
C-подобный:
.text:00401040 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:00401040 _main           proc near               ; CODE XREF: __scrt_common_main_seh(void)+F5↓p
.text:00401040
.text:00401040 var_C           = dword ptr -0Ch
.text:00401040 var_8           = dword ptr -8
.text:00401040 var_4           = dword ptr -4
.text:00401040 argc            = dword ptr  8
.text:00401040 argv            = dword ptr  0Ch
.text:00401040 envp            = dword ptr  10h
.text:00401040
.text:00401040                 push    ebp
.text:00401041                 mov     ebp, esp
.text:00401043                 sub     esp, 0Ch
.text:00401046                 push    ebx
.text:00401047                 push    esi
.text:00401048                 push    edi
.text:00401049                 push    offset aPerformingTest ; "Performing tests of gcd function:\n"
.text:0040104E                 call    sub_401010
.text:00401053                 xor     edx, edx
.text:00401055                 mov     byte ptr [ebp+var_8], 1
.text:00401059                 add     esp, 4
.text:0040105C                 mov     [ebp+var_4], edx
.text:0040105F                 xor     edi, edi
.text:00401061
.text:00401061 loc_401061:                             ; CODE XREF: _main+B0↓j
.text:00401061                 mov     ecx, ds:dword_40216C[edi]
.text:00401067                 mov     esi, ecx
.text:00401069                 mov     eax, ds:dword_402174[edi]
.text:0040106F                 mov     ebx, ds:dword_402170[edi]
.text:00401075                 mov     [ebp+var_C], eax
.text:00401078                 mov     eax, ebx
.text:0040107A                 cmp     ecx, 1
.text:0040107D                 jl      short loc_4010AB
.text:0040107F                 cmp     ebx, 1
.text:00401082                 jl      short loc_4010AB
.text:00401084                 cmp     ecx, ebx
.text:00401086                 jz      short loc_4010AE
.text:00401088
.text:00401088 loc_401088:                             ; CODE XREF: _main+5E↓j
.text:00401088                 mov     edx, esi
.text:0040108A                 mov     ecx, eax
.text:0040108C                 sub     edx, eax
.text:0040108E                 cmp     esi, eax
.text:00401090                 cmovle  edx, esi
.text:00401093                 sub     ecx, esi
.text:00401095                 cmp     esi, eax
.text:00401097                 mov     esi, edx
.text:00401099                 cmovle  eax, ecx
.text:0040109C                 cmp     edx, eax
.text:0040109E                 jnz     short loc_401088
.text:004010A0                 mov     ecx, ds:dword_40216C[edi]
.text:004010A6                 mov     edx, [ebp+var_4]
.text:004010A9                 jmp     short loc_4010AE
.text:004010AB ; ---------------------------------------------------------------------------
.text:004010AB
.text:004010AB loc_4010AB:                             ; CODE XREF: _main+3D↑j
.text:004010AB                                         ; _main+42↑j
.text:004010AB                 or      esi, 0FFFFFFFFh
.text:004010AE
.text:004010AE loc_4010AE:                             ; CODE XREF: _main+46↑j
.text:004010AE                                         ; _main+69↑j
.text:004010AE                 push    esi
.text:004010AF                 push    ebx
.text:004010B0                 inc     edx
.text:004010B1                 push    ecx
.text:004010B2                 push    edx
.text:004010B3                 push    offset aDGcdDDD ; "  %d. gcd( %d, %d ) = %d, "
.text:004010B8                 mov     [ebp+var_4], edx
.text:004010BB                 call    sub_401010
.text:004010C0                 mov     ebx, [ebp+var_8]
.text:004010C3                 xor     eax, eax
.text:004010C5                 cmp     esi, [ebp+var_C]
.text:004010C8                 mov     ecx, offset aOk ; "OK.\n"
.text:004010CD                 movzx   ebx, bl
.text:004010D0                 cmovnz  ebx, eax
.text:004010D3                 mov     eax, offset aError ; "error.\n"
.text:004010D8                 cmovz   eax, ecx
.text:004010DB                 mov     [ebp+var_8], ebx
.text:004010DE                 push    eax
.text:004010DF                 call    sub_401010
.text:004010E4                 mov     edx, [ebp+var_4]
.text:004010E7                 add     edi, 0Ch
.text:004010EA                 add     esp, 18h
.text:004010ED                 cmp     edi, 30h ; '0'
.text:004010F0                 jb      loc_401061
.text:004010F6                 mov     ecx, offset aFailed ; "failed"
.text:004010FB                 test    bl, bl
.text:004010FD                 mov     eax, offset aPassed ; "passed"
.text:00401102                 cmovz   eax, ecx
.text:00401105                 push    eax
.text:00401106                 push    offset aTestsS  ; "Tests %s.\n"
.text:0040110B                 call    sub_401010
.text:00401110                 mov     esi, ds:_kbhit
.text:00401116                 add     esp, 8
.text:00401119                 nop     dword ptr [eax+00000000h]
.text:00401120
.text:00401120 loc_401120:                             ; CODE XREF: _main+E4↓j
.text:00401120                 call    esi ; _kbhit
.text:00401122                 test    eax, eax
.text:00401124                 jz      short loc_401120
.text:00401126                 xor     eax, eax
.text:00401128                 test    bl, bl
.text:0040112A                 pop     edi
.text:0040112B                 pop     esi
.text:0040112C                 setz    al
.text:0040112F                 pop     ebx
.text:00401130                 mov     esp, ebp
.text:00401132                 pop     ebp
.text:00401133                 retn
.text:00401133 _main           endp
.text:00401133
.text:00401134 ; [00000011 BYTES: COLLAPSED FUNCTION __security_check_cookie(x). PRESS CTRL-NUMPAD+ TO EXPAND]
.text:00401145
.text:00401145 ; =============== S U B R O U T I N E =======================================


ПОСЛЕ
Код:
.text:004067B0 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:004067B0 _main           proc near               ; CODE XREF: __scrt_common_main_seh(void)+F5↓p
.text:004067B0
.text:004067B0 var_2D2         = byte ptr -2D2h
.text:004067B0 var_2D1         = byte ptr -2D1h
.text:004067B0 dwErrCode       = dword ptr -2D0h
....
.text:004067B0 var_60          = xmmword ptr -60h
.text:004067B0 var_50          = dword ptr -50h
.text:004067B0 var_4C          = word ptr -4Ch
.text:004067B0 var_40          = word ptr -40h
.text:004067B0 var_30          = xmmword ptr -30h
.text:004067B0 var_20          = dword ptr -20h
.text:004067B0 var_1C          = word ptr -1Ch
.text:004067B0
.text:004067B0                 push    ebp
.text:004067B1                 mov     ebp, esp
.text:004067B3                 and     esp, 0FFFFFFF0h
.text:004067B6                 sub     esp, 2D8h
.text:004067BC                 mov     eax, ___security_cookie
.text:004067C1                 xor     eax, esp
.text:004067C3                 mov     [esp+2D8h+var_4], eax
.text:004067CA                 push    esi
.text:004067CB                 push    edi
.text:004067CC                 movsx   eax, word_412064
.text:004067D3                 cdq
.text:004067D4                 mov     dword ptr [esp+2E0h+var_250], eax
.text:004067DB                 mov     eax, dword_41204C
.text:004067E0                 mov     dword ptr [esp+2E0h+var_250+4], edx
.text:004067E7                 mov     [esp+2E0h+var_2B4], eax
.text:004067EB                 mov     eax, 33A6h
.text:004067F0                 mov     word ptr [esp+2E0h+var_2C8], ax
.text:004067F5                 mov     eax, 639Ch
.text:004067FA                 mov     word ptr [esp+2E0h+var_2C0], ax
.text:004067FF                 mov     ecx, dword_412050
.text:00406805                 mov     eax, dword_412054
.text:0040680A                 mov     [esp+2E0h+CodePage], ecx
.text:0040680E                 mov     ecx, 0B9h ; '¹'
.text:00406813                 mov     [esp+2E0h+var_2D2], 79h ; 'y'
.text:00406818                 movsx   eax, byte_412036
.text:0040681F                 mov     [esp+2E0h+var_270], eax
.text:00406823                 mov     al, byte_41201B
.text:00406828                 mov     [esp+2E0h+var_2BC], 0B24Dh
.text:00406830                 mov     [esp+2E0h+hWnd], eax
.text:00406834                 movzx   eax, word_412060
.text:0040683B                 mov     [esp+2E0h+var_2AC], eax
.text:0040683F                 movzx   eax, byte_412018
.text:00406846                 mov     word ptr [esp+2E0h+var_29C], ax
.text:0040684B                 mov     [esp+2E0h+dwErrCode], 1091h
.text:00406853                 mov     [esp+2E0h+var_2CC], 0
.text:0040685B                 mov     [esp+2E0h+var_280], 0BF92A1C5h
.text:00406863                 mov     [esp+2E0h+var_27C], 3039Eh
.text:0040686B                 movzx   eax, byte_412062
.text:00406872                 mov     [esp+2E0h+var_288], eax
.text:00406876                 mov     eax, dword ptr dwErrCode
.text:0040687B                 mov     [esp+2E0h+var_25C], ecx
.text:00406882                 mov     ecx, dword ptr dwErrCode+4
.text:00406888                 mov     [esp+2E0h+var_2B8], 0B9D80779h
.text:00406890                 mov     eax, dword_412048
.text:00406895                 mov     [esp+2E0h+var_2D1], al
.text:00406899                 movsx   eax, word_412034
.text:004068A0                 cdq
.text:004068A1                 mov     [esp+2E0h+var_2A8], eax
.text:004068A5                 mov     [esp+2E0h+var_2A4], edx
.text:004068A9                 movzx   eax, byte_412026
.text:004068B0                 cdq
.text:004068B1                 mov     byte ptr [esp+2E0h+var_258], 93h ; '“'
.text:004068B9                 mov     [esp+2E0h+var_2B0], eax
.text:004068BD                 movsx   eax, word_412030
.text:004068C4                 mov     edi, edx
.text:004068C6                 mov     [esp+2E0h+var_274], 0E636C73Fh
.text:004068CE                 cdq
.text:004068CF                 mov     dword ptr [esp+2E0h+var_250], eax
.text:004068D6                 mov     eax, 0FFFF8533h
.text:004068DB                 mov     dword ptr [esp+2E0h+var_250+4], edx
.text:004068E2                 mov     esi, dword ptr qword_412080
.text:004068E8                 mov     ecx, dword ptr qword_412080+4
.text:004068EE                 mov     word ptr [esp+2E0h+var_258], si
.text:004068F6                 mov     word ptr [esp+2E0h+var_258], ax
.text:004068FE                 movsx   eax, byte_412063
.text:00406905                 cdq
.text:00406906                 mov     dword ptr [esp+2E0h+var_250], eax
.text:0040690D                 mov     eax, 0DEh ; 'Þ'
.text:00406912                 mov     dword ptr [esp+2E0h+var_250+4], edx
.text:00406919                 mov     word ptr [esp+2E0h+var_258], ax
.text:00406921                 movzx   eax, byte_412062
.text:00406928                 cdq
.text:00406929                 mov     dword ptr [esp+2E0h+var_250], eax
.text:00406930                 mov     dword ptr [esp+2E0h+var_250+4], edx
.text:00406937                 mov     al, byte_412033
.text:0040693C                 mov     al, byte_412019
.text:00406941                 mov     ecx, dword_412038
.text:00406947                 mov     eax, dword_41203C
.text:0040694C                 mov     dword ptr [esp+2E0h+var_250], ecx
.text:00406953                 mov     dword ptr [esp+2E0h+var_250+4], eax
.text:0040695A                 push    offset Str      ; "935"
.text:0040695F                 mov     [esp+2E4h+var_244], edi
.text:00406966                 mov     dword ptr [esp+2E4h+var_298], ecx
.text:0040696A                 call    ds:atol
.text:00406970                 mov     ds:4E8924h, eax
.text:00406975                 add     esp, 4
.text:00406978                 mov     [esp+2E0h+var_28C], eax
.text:0040697C                 mov     al, [esp+2E0h+var_2D1]
.text:00406980                 movzx   eax, al
.text:00406983                 cmp     dword_412028, eax
.text:00406989                 jb      short loc_406A07
.text:0040698B                 cmp     word ptr [esp+2E0h+var_29C], 0
.text:00406991                 jz      short loc_4069B6
.text:00406993                 mov     eax, 0FFFF802Eh
.text:00406998                 mov     ecx, 197h
.text:0040699D                 mov     word_412030, ax
.text:004069A3
.text:004069A3 loc_4069A3:                             ; CODE XREF: _main+1FF↓j
.text:004069A3                 movsx   eax, word ptr [esp+2E0h+var_2C8]
.text:004069A8                 mov     [esp+2E0h+var_2B8], eax
.text:004069AC                 sub     ecx, 1
.text:004069AF                 jnz     short loc_4069A3
.text:004069B1                 jmp     loc_406A44
.text:004069B6 ; ---------------------------------------------------------------------------
.text:004069B6
.text:004069B6 loc_4069B6:                             ; CODE XREF: _main+1E1↑j
.text:004069B6                 mov     edx, dword_412028
.text:004069BC                 movsx   eax, byte_412036
.text:004069C3                 neg     edx
.text:004069C5                 movzx   ecx, [esp+2E0h+var_2D2]
.text:004069CA                 sbb     edx, edx
.text:004069CC                 inc     edx
.text:004069CD                 sub     edx, eax
.text:004069CF                 movsx   ax, byte_41202E
.text:004069D7                 not     edx
.text:004069D9                 imul    ecx, edx
.text:004069DC                 not     ax
.text:004069DF                 add     ax, cx
.text:004069E2                 not     ax
.text:004069E5                 mov     word ptr [esp+2E0h+var_29C], ax
.text:004069EA                 movzx   eax, [esp+2E0h+var_2D1]
.text:004069EF                 cdq
.text:004069F0                 add     eax, 0FFFFFF3Ch
.text:004069F5                 mov     edi, edx
.text:004069F7                 mov     [esp+2E0h+var_2B0], eax
.text:004069FB                 adc     edi, 0FFFFFFFFh
.text:004069FE                 mov     [esp+2E0h+var_244], edi
.text:00406A05                 jmp     short loc_406A44
.text:00406A07 ; ---------------------------------------------------------------------------
.text:00406A07
.text:00406A07 loc_406A07:                             ; CODE XREF: _main+1D9↑j
.text:00406A07                 cmp     byte_412018, 0
.text:00406A0E                 jz      short loc_406A44
.text:00406A10                 mov     eax, [esp+2E0h+hWnd]
.text:00406A14                 mov     ecx, dword_412048
.text:00406A1A                 add     al, al
.text:00406A1C                 add     al, byte_412066
.text:00406A22                 not     ecx
.text:00406A24                 mov     [esp+2E0h+hWnd], eax
.text:00406A28                 mov     eax, dword_412020
.text:00406A2D                 add     eax, ecx
.text:00406A2F                 not     eax
.text:00406A31                 mov     word_412064, ax
.text:00406A37                 mov     ax, word_41202C
.text:00406A3D                 add     al, 63h ; 'c'
.text:00406A3F                 mov     byte_412026, al
.text:00406A44
.text:00406A44 loc_406A44:                             ; CODE XREF: _main+201↑j
.text:00406A44                                         ; _main+255↑j ...
.text:00406A44                 mov     eax, [esp+2E0h+var_28C]
.text:00406A48                 add     eax, 415h
.text:00406A4D                 mov     dword ptr [esp+2E0h+var_298], eax
.text:00406A51                 mov     ecx, dword ptr qword_412080
.text:00406A57                 mov     eax, dword ptr qword_412080+4
.text:00406A5C                 or      ecx, eax
.text:00406A5E                 jz      short loc_406A67
.text:00406A60                 mov     [esp+2E0h+var_2D1], 46h ; 'F'
.text:00406A65                 jmp     short loc_406A9B
.text:00406A67 ; ---------------------------------------------------------------------------
.text:00406A67
.text:00406A67 loc_406A67:                             ; CODE XREF: _main+2AE↑j
.text:00406A67                 mov     ax, word ptr [esp+2E0h+var_2C0]
.text:00406A6C                 movsx   ecx, ax
.text:00406A6F                 movsx   eax, word ptr [esp+2E0h+var_2C0]
.text:00406A74                 sub     ecx, eax
.text:00406A76                 mov     eax, [esp+2E0h+var_2AC]
.text:00406A7A                 sub     ecx, eax
.text:00406A7C                 mov     word ptr [esp+2E0h+var_2C0], cx
.text:00406A81                 mov     eax, dword_412050
.text:00406A86                 mov     ecx, dword_412054
.text:00406A8C                 shld    ecx, eax, 7
.text:00406A90                 shl     eax, 7
.text:00406A93                 mov     [esp+2E0h+var_280], eax
.text:00406A97                 mov     [esp+2E0h+var_27C], ecx
.text:00406A9B
.text:00406A9B loc_406A9B:                             ; CODE XREF: _main+2B5↑j
.text:00406A9B                 mov     eax, [esp+2E0h+var_28C]
.text:00406A9F                 mov     esi, 168Ah
.text:00406AA4                 add     eax, 578h
.text:00406AA9                 mov     [esp+2E0h+var_1EC], eax
.text:00406AB0                 mov     eax, [esp+2E0h+var_280]
.text:00406AB4                 mov     ecx, [esp+2E0h+var_27C]
.text:00406AB8                 add     eax, [esp+2E0h+var_2B0]
.text:00406ABC                 mov     [esp+2E0h+var_280], eax
.text:00406AC0                 adc     ecx, edi
.text:00406AC2                 mov     [esp+2E0h+var_27C], ecx
.text:00406AC6                 db      66h, 66h
.text:00406AC6                 nop     word ptr [eax+eax+00000000h]
.text:00406AD0
.text:00406AD0 loc_406AD0:                             ; CODE XREF: _main+380↓j
.text:00406AD0                 movsx   ax, byte_412067
.text:00406AD8                 mov     edx, 82h ; '‚'
.text:00406ADD                 xor     ecx, ecx
.text:00406ADF                 movzx   eax, ax
.text:00406AE2                 push    eax
.text:00406AE3                 call    sub_402DA0
.text:00406AE8                 cwde
.text:00406AE9                 xor     edx, edx
.text:00406AEB                 mov     [esp+2E4h+var_2B8], eax
.text:00406AEF                 add     esp, 4
.text:00406AF2                 mov     eax, [esp+2E0h+var_2B8]
.text:00406AF6                 cmp     eax, 19h
.text:00406AF9                 mov     eax, [esp+2E0h+var_2B8]
.text:00406AFD                 setle   dl
.text:00406B00                 xor     ecx, ecx
.text:00406B02                 test    eax, eax
.text:00406B04                 setle   cl
.text:00406B07                 cmp     ecx, edx
.text:00406B09                 mov     edx, [esp+2E0h+var_274]
.text:00406B0D                 jb      short loc_406B2D
.text:00406B0F                 cmp     [esp+2E0h+var_2B4], 0
.text:00406B14                 jz      short loc_406B2D
.text:00406B16                 mov     ecx, [esp+2E0h+var_2A8]
.text:00406B1A                 add     edx, edx
.text:00406B1C                 inc     [esp+2E0h+var_25C]
.text:00406B23                 sub     edx, ecx
.text:00406B25                 mov     eax, [esp+2E0h+var_2A4]
.text:00406B29                 mov     [esp+2E0h+var_274], edx
.text:00406B2D
.text:00406B2D loc_406B2D:                             ; CODE XREF: _main+35D↑j
.text:00406B2D                                         ; _main+364↑j
.text:00406B2D                 sub     esi, 1
.text:00406B30                 jnz     short loc_406AD0
.text:00406B32                 mov     eax, [esp+2E0h+var_28C]
.text:00406B36                 add     eax, 5EFh
.text:00406B3B                 mov     dword ptr [esp+2E0h+var_228], eax
.text:00406B42                 mov     ecx, dword ptr dwErrCode
.text:00406B48                 mov     eax, dword ptr dwErrCode+4
.text:00406B4D                 movzx   eax, cl
.text:00406B50                 imul    eax, 0C8h ; 'È'
.text:00406B56                 mov     [esp+2E0h+var_254], eax
.text:00406B5D                 movzx   eax, word ptr [esp+2E0h+var_25C]
.text:00406B65                 sub     edx, eax
.text:00406B67                 mov     eax, ds:4E8924h
.text:00406B6C                 mov     [esp+2E0h+var_28C], eax
.text:00406B70                 mov     esi, dword_412050
.text:00406B76                 movzx   eax, byte_41201A
.text:00406B7D                 mov     edi, dword_412054
.text:00406B83                 mov     [esp+2E0h+var_274], edx
.text:00406B87                 cdq
.text:00406B88                 sub     esi, eax
.text:00406B8A                 mov     eax, dword_412050
.text:00406B8F                 mov     ecx, dword_412054
.text:00406B95                 sbb     edi, edx
.text:00406B97                 add     eax, esi
.text:00406B99                 mov     dword_412050, eax
.text:00406B9E                 adc     ecx, edi
.text:00406BA0                 mov     dword_412054, ecx
.text:00406BA6                 movsx   eax, word ptr [esp+2E0h+var_2C0]
.text:00406BAB                 mov     esi, [esp+2E0h+dwErrCode]
.text:00406BAF                 mov     ecx, [esp+2E0h+var_2CC]
.text:00406BB3                 cdq
.text:00406BB4                 push    edx
.text:00406BB5                 push    eax
.text:00406BB6                 push    ecx
.text:00406BB7                 push    esi
.text:00406BB8                 call    __allmul
.text:00406BBD                 mov     ecx, [esp+2E0h+dwErrCode]
.text:00406BC1                 mov     esi, [esp+2E0h+var_2CC]
.text:00406BC5                 sub     ecx, eax
.text:00406BC7                 mov     [esp+2E0h+dwErrCode], ecx
.text:00406BCB                 sbb     esi, edx
.text:00406BCD                 mov     [esp+2E0h+var_2CC], esi
.text:00406BD1                 mov     eax, [esp+2E0h+var_28C]
.text:00406BD5                 add     eax, 3C5h
.text:00406BDA                 mov     [esp+2E0h+var_1F8], eax
.text:00406BE1                 mov     eax, [esp+2E0h+var_2AC]
.text:00406BE5                 cmp     byte_412018, 0
.text:00406BEC                 mov     dword_41201C, eax
.text:00406BF1                 jz      short loc_406BFC
.text:00406BF3                 mov     al, byte ptr [esp+2E0h+var_254]
.text:00406BFA                 jmp     short loc_406C00
.text:00406BFC ; ---------------------------------------------------------------------------
.text:00406BFC
.text:00406BFC loc_406BFC:                             ; CODE XREF: _main+441↑j
.text:00406BFC                 mov     eax, [esp+2E0h+var_270]
.text:00406C00
.text:00406C00 loc_406C00:                             ; CODE XREF: _main+44A↑j
.text:00406C00                 mov     edi, [esp+2E0h+var_244]
.text:00406C07                 mov     byte_412063, al
.text:00406C0C                 mov     [esp+2E0h+var_238], 1229h
.text:00406C17
.text:00406C17 loc_406C17:                             ; CODE XREF: _main+58A↓j
.text:00406C17                 call    ds:GetLargePageMinimum
.text:00406C1D                 mov     byte_412027, al
.text:00406C22                 mov     ecx, 6
.text:00406C27                 mov     al, byte_412027
.text:00406C2C                 cmp     cl, al
.text:00406C2E                 mov     al, byte_412027
.text:00406C33                 sbb     ecx, ecx
.text:00406C35                 xor     dl, dl
.text:00406C37                 neg     ecx
.text:00406C39                 cmp     dl, al
.text:00406C3B                 sbb     eax, eax
.text:00406C3D                 neg     eax
.text:00406C3F                 cmp     eax, ecx
.text:00406C41                 jb      short loc_406C6E
.text:00406C43                 mov     ecx, [esp+2E0h+hWnd]
.text:00406C47                 mov     esi, [esp+2E0h+var_274]
.text:00406C4B                 movsx   eax, cl
.text:00406C4E                 mov     ecx, dword_412028
.text:00406C54                 imul    eax, -33h ; 'Í'
.text:00406C57                 xor     ecx, esi
.text:00406C59                 mov     [esp+2E0h+hWnd], eax
.text:00406C5D                 mov     eax, dword_412028
.text:00406C62                 or      eax, ecx
.text:00406C64                 mov     dword_412028, eax
.text:00406C69                 jmp     loc_406D32
.text:00406C6E ; ---------------------------------------------------------------------------
.text:00406C6E
.text:00406C6E loc_406C6E:                             ; CODE XREF: _main+491↑j
.text:00406C6E                 mov     eax, [esp+2E0h+var_2B0]
.text:00406C72                 or      eax, edi
.text:00406C74                 jnz     short loc_406C7B
.text:00406C76                 lea     ecx, [eax+1]
.text:00406C79                 jmp     short loc_406C7D
.text:00406C7B ; ---------------------------------------------------------------------------
.text:00406C7B
.text:00406C7B loc_406C7B:                             ; CODE XREF: _main+4C4↑j
.text:00406C7B                 xor     ecx, ecx
.text:00406C7D
.text:00406C7D loc_406C7D:                             ; CODE XREF: _main+4C9↑j
.text:00406C7D                 movsx   eax, byte_41202E
.text:00406C84                 cmp     ecx, eax
.text:00406C86                 jle     short loc_406CA8
.text:00406C88                 mov     ecx, dword_412070
.text:00406C8E                 mov     edx, [esp+2E0h+dwErrCode]
.text:00406C92                 mov     eax, [esp+2E0h+var_2CC]
.text:00406C96                 test    eax, eax
.text:00406C98                 jg      loc_406D2E
.text:00406C9E                 jl      short loc_406CA8
.text:00406CA0                 cmp     edx, ecx
.text:00406CA2                 ja      loc_406D2E
.text:00406CA8
.text:00406CA8 loc_406CA8:                             ; CODE XREF: _main+4D6↑j
.text:00406CA8                                         ; _main+4EE↑j
.text:00406CA8                 mov     esi, dword ptr CodePage
.text:00406CAE                 mov     edx, dword ptr CodePage+4
.text:00406CB4                 mov     ecx, dword ptr dwErrCode
.text:00406CBA                 mov     eax, dword ptr dwErrCode+4
.text:00406CBF                 push    eax
.text:00406CC0                 push    ecx
.text:00406CC1                 push    edx
.text:00406CC2                 push    esi
.text:00406CC3                 call    __allmul
.text:00406CC8                 mov     ecx, dword ptr dwErrCode
.text:00406CCE                 mov     esi, dword ptr dwErrCode+4
.text:00406CD4                 or      ecx, eax
.text:00406CD6                 movzx   eax, word ptr ds:4E8924h
.text:00406CDD                 or      esi, edx
.text:00406CDF                 mov     dword ptr dwErrCode, ecx
.text:00406CE5                 mov     [esp+2E0h+var_25C], eax
.text:00406CEC                 mov     eax, [esp+2E0h+var_254]
.text:00406CF3                 mov     dword ptr dwErrCode+4, esi
.text:00406CF9                 mov     esi, dword ptr qword_412080
.text:00406CFF                 mov     ecx, dword ptr qword_412080+4
.text:00406D05                 push    ecx
.text:00406D06                 movzx   eax, al
.text:00406D09                 cdq
.text:00406D0A                 push    esi
.text:00406D0B                 push    edx
.text:00406D0C                 push    eax
.text:00406D0D                 call    __allmul
.text:00406D12                 push    4CF42h
.text:00406D17                 push    82BC2DBFh
.text:00406D1C                 push    edx
.text:00406D1D                 push    eax
.text:00406D1E                 call    __allmul
.text:00406D23                 mov     dword ptr qword_412080, eax
.text:00406D28                 mov     dword ptr qword_412080+4, edx
.text:00406D2E
.text:00406D2E loc_406D2E:                             ; CODE XREF: _main+4E8↑j
.text:00406D2E                                         ; _main+4F2↑j
.text:00406D2E                 mov     esi, [esp+2E0h+var_274]
.text:00406D32
.text:00406D32 loc_406D32:                             ; CODE XREF: _main+4B9↑j
.text:00406D32                 sub     [esp+2E0h+var_238], 1
.text:00406D3A                 jnz     loc_406C17
.text:00406D40                 mov     eax, [esp+2E0h+var_28C]
.text:00406D44                 add     eax, 52Ah
.text:00406D49                 mov     dword ptr [esp+2E0h+var_298], eax
.text:00406D4D                 mov     ecx, dword_412048
.text:00406D53                 call    sub_401050
.text:00406D58                 xor     edx, edx
.text:00406D5A                 mov     byte_412032, al
.text:00406D5F                 cmp     al, 27h ; '''
.text:00406D61                 setnle  dl
.text:00406D64                 xor     ecx, ecx
.text:00406D66                 test    al, al
.text:00406D68                 setnle  cl
.text:00406D6B                 cmp     ecx, edx
.text:00406D6D                 jnb     short loc_406DC0
.text:00406D6F                 mov     ecx, [esp+2E0h+var_2A8]
.text:00406D73                 mov     eax, [esp+2E0h+var_2A4]
.text:00406D77                 movzx   edx, word_412024
.text:00406D7E                 movzx   eax, word_412024
.text:00406D85                 movzx   ecx, cx
.text:00406D88                 imul    edx, ecx
.text:00406D8B                 add     ax, dx
.text:00406D8E                 mov     word_412024, ax
.text:00406D94                 mov     ecx, dword ptr qword_412080
.text:00406D9A                 mov     eax, dword ptr qword_412080+4
.text:00406D9F                 mov     eax, [esp+2E0h+CodePage]
.text:00406DA3                 add     eax, ecx
.text:00406DA5                 movsx   ecx, byte_412019
.text:00406DAC                 imul    ecx, eax
.text:00406DAF                 movsx   eax, byte_412067
.text:00406DB6                 imul    eax, ecx
.text:00406DB9                 mov     dword_412020, eax
.text:00406DBE                 jmp     short loc_406DD1
.text:00406DC0 ; ---------------------------------------------------------------------------
.text:00406DC0
.text:00406DC0 loc_406DC0:                             ; CODE XREF: _main+5BD↑j
.text:00406DC0                 movzx   eax, byte_412026
.text:00406DC7                 add     eax, 5A16h
.text:00406DCC                 mov     dword_41204C, eax
.text:00406DD1
.text:00406DD1 loc_406DD1:                             ; CODE XREF: _main+60E↑j
.text:00406DD1                 mov     eax, [esp+2E0h+var_28C]
.text:00406DD5                 mov     edi, ds:IsValidCodePage
.text:00406DDB                 add     eax, 713h
.text:00406DE0                 mov     [esp+2E0h+var_1F4], eax
.text:00406DE7                 mov     eax, [esp+2E0h+var_2AC]
.text:00406DEB                 mov     eax, ds:4E8924h
.text:00406DF0                 mov     [esp+2E0h+var_28C], eax
.text:00406DF4                 mov     eax, [esp+2E0h+CodePage]
.text:00406DF8                 push    eax             ; CodePage
.text:00406DF9                 call    edi ; IsValidCodePage
.text:00406DFB                 mov     byte_41201A, al
.text:00406E00                 mov     eax, [esp+2E0h+var_28C]
.text:00406E04                 add     eax, 438h
.text:00406E09                 mov     [esp+2E0h+var_258], eax
.text:00406E10                 movzx   eax, word ptr dword_41204C
.text:00406E17                 mov     ecx, dword ptr dwErrCode
.text:00406E1D                 push    eax
.text:00406E1E                 mov     eax, dword ptr dwErrCode+4
.text:00406E23                 mov     dx, word_41208C
.text:00406E2A                 call    sub_402DA0
.text:00406E2F                 cwde
.text:00406E30                 add     esp, 4
.text:00406E33                 mov     hWnd, eax
.text:00406E38                 mov     ax, word_412088
.text:00406E3E                 mov     eax, dword_412028
.text:00406E43                 mov     ecx, dword ptr CodePage
.text:00406E49                 mov     eax, dword ptr CodePage+4
.text:00406E4E                 push    ecx             ; CodePage
.text:00406E4F                 call    edi ; IsValidCodePage
.text:00406E51                 cmp     byte_412037, 0
.text:00406E58                 mov     [esp+2E0h+var_2B8], eax
.text:00406E5C                 jz      short loc_406ECA
.text:00406E5E                 movzx   eax, [esp+2E0h+var_2D2]
.text:00406E63                 not     esi
.text:00406E65                 not     eax
.text:00406E67                 cmp     eax, esi
.text:00406E69                 jbe     short loc_406E74
.text:00406E6B                 mov     edi, 1
.text:00406E70                 xor     esi, esi
.text:00406E72                 jmp     short loc_406E8E
.text:00406E74 ; ---------------------------------------------------------------------------
 
Последнее редактирование:
Бинарные морферы, и морферы на уровне IR (OLLVM и иже) не смогут дать такой результат, а тем временем это один из основных триггеров для эвристиков.
Друг, не сомневаюсь в твоей компетентности в области морфинга, я посмотрел на проделанную работу - это чего-то да стоит, но тем не менее ты очень сильно ошибаешься в высказывании, которое я переслал выше.
Бинарный морфинг более сложен, но это совсем не значит, что нельзя сгенерировать такой код, который не будет похож на генерируемый компилятором. Компиляторы пишутся людьми, а не роботами или инопланетянами, в них заложена определенная логика генерации кода, что мешает заложить схожую логику в бинарный морфер? Это лишь вопрос времени, опыта и желания.

Касательно ollvm - вообще смех. Первое - проект старый как доисторическое ископаемое, и в наше время вообще не несет никакой ценности, с ним даже нет смысла сравнивать, он просто умер, и больше не развивается с открытыми исходниками, так как его разработчики забили на него и ушли в проприетарный коммерс. Последние открытые версии пытались модифицировать и допиливать разные люди, но все это на уровне поделок студентов. Это несерьезно. А если сранивать с их новой проприетарной версией - тут ты заведомо в проигрыше, там работает целый штат квалифицированных специалистов. К тому же проект с закрытым исходным кодом, даже если начинать спорить, без кода доказать вряд ли что-то получится, сравнивать смысла нет. Второе - этот проект обфусцирует, но не морфит код, это немного разные понятия. Обфускация направлена на усложнение анализа и реверса кода, чаще всего - от ручек злостных крекеров и любителей рипнуть код, морфинг - на обход обнаружения ав движками, как правило обход именно автоматических анализаторов в т.ч сигнатурных, а не ручной анализ кода специалистами. Третье - паблик ollvm, если представить, что он воскрес из мертвых - генерирует идеальный код с точки зрения схожести со стандартным кодом генерируемым компилятором, потому что все операции обфускации происходят на уровне IR кода, это middle end, а дальше идет еще несколько этапов back end пайплайна, который работает независимо от того, был ли как-то изменен код на уровне IR или нет, кодогенерация стандартная для clang, на выходе бинарь по всем признаками неотличим от обычного кода скомпилированного clang (если не включать всякие проходы типа Control Flow Flattening, которые явно делают код странным и необычным, и тут нет разницы хоть ты на IR код применишь CFF хоть на сорцы, выхлоп в обоих случаях будет ебанутым, это особенность самого способа обфускации, а не этапа где его применяют)

1679714102910.png


Тут я хочу сделать акцент на нормализованность опкод, которые генерируются компилятором, их статистика и распределение абсолютно естественны для обычных приложений
Поэтому твое утверждение в корне неверно, адекватно и аккуратно обфусцированный IR код скомпилированный clang никак не может быть более подозрителен, чем любой код накрытый твоим морфером уровня сорцев и собранный любым компилятором будь то gcc, vcc или clang, кодогенерация специфичная для конкретной архитектуры происходит этапом ниже в обоих случаях.

Я понимаю, что для рекламы проекта выгодно сказать, что он единственный и неповторимый, лучший в своем роде, но зачем приводить заведомо ложные аргументы и выезжать на фоне старых мертвых проектов. Это как понтоваться запорожцем, проезжая мимо деревянной упряжки с лошадью. Ну на фоне нее да, он конечно получше будет.

Ни в коей мере не хотел оскорбить тебя или твой проект, ты проделал большую работу, проект хороший, я думаю он неплохо показывает себя в бою, но вот эти твои аргументы просто перевернули меня, не удержался. А как итог - удачи тебе в развитии проекта, и сравнивай суперкар с другим суперкаром, а не развалюхой😁
 
Последнее редактирование:
Друг, не сомневаюсь в твоей компетентности в области морфинга, я посмотрел на проделанную работу - это чего-то да стоит, но тем не менее ты очень сильно ошибаешься в высказывании, которое я переслал выше.
Бинарный морфинг более сложен, но это совсем не значит, что нельзя сгенерировать такой код, который не будет похож на генерируемый компилятором. Компиляторы пишутся людьми, а не роботами или инопланетянами, в них заложена определенная логика генерации кода, что мешает заложить схожую логику в бинарный морфер? Это лишь вопрос времени, опыта и желания.

Касательно ollvm - вообще смех. Первое - проект старый как доисторическое ископаемое, и в наше время вообще не несет никакой ценности, с ним даже нет смысла сравнивать, он просто умер, и больше не развивается с открытыми исходниками, так как его разработчики забили на него и ушли в проприетарный коммерс. Последние открытые версии пытались модифицировать и допиливать разные люди, но все это на уровне поделок студентов. Это несерьезно. А если сранивать с их новой проприетарной версией - тут ты заведомо в проигрыше, там работает целый штат квалифицированных специалистов. К тому же проект с закрытым исходным кодом, даже если начинать спорить, без кода доказать вряд ли что-то получится, сравнивать смысла нет. Второе - этот проект обфусцирует, но не морфит код, это немного разные понятия. Обфускация направлена на усложнение анализа и реверса кода, чаще всего - от ручек злостных крекеров и любителей рипнуть код, морфинг - на обход обнаружения ав движками, как правило обход именно автоматических анализаторов в т.ч сигнатурных, а не ручной анализ кода специалистами. Третье - паблик ollvm, если представить, что он воскрес из мертвых - генерирует идеальный код с точки зрения схожести со стандартным кодом генерируемым компилятором, потому что все операции обфускации происходят на уровне IR кода, это middle end, а дальше идет еще несколько этапов back end пайплайна, который работает независимо от того, был ли как-то изменен код на уровне IR или нет, кодогенерация стандартная для clang, на выходе бинарь по всем признаками неотличим от обычного кода скомпилированного clang (если не включать всякие проходы типа Control Flow Flattening, которые явно делают код странным и необычным, и тут нет разницы хоть ты на IR код применишь CFF хоть на сорцы, выхлоп в обоих случаях будет ебанутым, это особенность самого способа обфускации, а не этапа где его применяют)

Посмотреть вложение 53518


Поэтому твое утверждение в корне неверно, адекватно и аккуратно обфусцированный IR код скомпилированный clang никак не может быть более подозрителен, чем любой код накрытый твоим морфером уровня сорцев и собранный любым компилятором будь то gcc, vcc или clang, кодогенерация специфичная для конкретной архитектуры происходит этапом ниже в обоих случаях.

Я понимаю, что для рекламы проекта выгодно сказать, что он единственный и неповторимый, лучший в своем роде, но зачем приводить заведомо ложные аргументы и выезжать на фоне старых мертвых проектов. Это как понтоваться запорожцем, проезжая мимо деревянной упряжки с лошадью. Ну на фоне нее да, он конечно получше будет.

Ни в коей мере не хотел оскорбить тебя или твой проект, ты проделал большую работу, проект хороший, я думаю он неплохо показывает себя в бою, но вот эти твои аргументы просто перевернули меня, не удержался. А как итог - удачи тебе в развитии проекта, и сравнивай суперкар с другим суперкаром, а не развалюхой😁
Этот морфер работает на уровне исходного кода а не бинарника, т.е изменяет структуру проекта, что б оптимизатор компилятора не вырезали (оптимизировал) новый код, при этом логика конечной программы остается прежней. Ну а дальнейшее твое сравнение не имеет смысла.
Я сравнивал код ДО морфа и ПОСЛЕ. В итоге это два АБСОЛЮТНО разных кода, но логика остается прежней.
1679718399344.png

Вот тебе сравнение в диафоре (поморфлена только main функция, зеленое это стандартный crt`ешный мусор), как видим нет ничего общего, кроме имени функции main)

P.S Разреверсить это МОЖНО но СЛОЖНО, цель морфа не в защите кода а максимально "уникализировать" бинарник, с чем этот продукт справляется на все 100%. Лучшая защита это полиморфная вирта и полиформ виртуализация кода (просто вставил свои 5 копеек). В конечном итоге Статику он обойдет на все 100 а рантайм уже зависит уже от вас а не от морфа)
 
Последнее редактирование:
В первую очередь спасибо за проявленный интерес к теме, приятно, что есть люди, которые вчитываются, думают логически и анализируют.

Ресерчу нехватает бенчмарков.
Например?

Бинарный морфинг более сложен, но это совсем не значит, что нельзя сгенерировать такой код, который не будет похож на генерируемый компилятором. Компиляторы пишутся людьми, а не роботами или инопланетянами, в них заложена определенная логика генерации кода, что мешает заложить схожую логику в бинарный морфер? Это лишь вопрос времени, опыта и желания.
Я не пытаюсь показать что MMP топчик топчиков и лучше ничего нет, суть моих тезисов в том, что я сравниваю подходы, до которых может дотянуться заинтересованный человек без экстра ординарных шагов. OLLVM в паблике, да, он стар, но я встречаю продукты, которые до сих пор встраивают его в свой билд чейн.
лучший в своем роде, но зачем приводить заведомо ложные аргументы и выезжать на фоне старых мертвых проектов.
В чем выражается по вашему мнению заведомая ложность моих тезисов?
Аргумент про то что IR, binary level труднодостижимый, если не нереалистичный сценарий. Нельзя, но если очень захочется, то наверно можно?)
Аргумент, что выхлоп из MMP является легитимным кодом - очевиден. Аргумент, что конретно сравнение с оллвм выделяет приимущества ММП, тоже аргумент очевидный.
Цель моего проекта - сделать обфускацию\морфинг "нативным" или минимально заметным для внешних анализаторов. Чтобы цена отделения логики морфера от логики приложения была максимально сложной в вычислительном плане.

Поэтому твое утверждение в корне неверно, адекватно и аккуратно обфусцированный IR код скомпилированный clang никак не может быть более подозрителен, чем любой код накрытый твоим морфером уровня сорцев и собранный любым компилятором будь то gcc, vcc или clang, кодогенерация специфичная для конкретной архитектуры происходит этапом ниже в обоих случаях.
Моё утверждение верно именно в факте того, с чем именно я сравнил. Я не отрицаю факта, приведенного вами в качестве аргумента. При этом и я показываю фактический код результата. Коммерческие разработки уровня, где целые лабы готовят продукт, едва ли можно купить без корп мыла и банковского перевода. В целом любой способ морфинга (IR, source level, binary level) можно приготовить правильно и красиво. Вопрос затраченных ресурсов. И у каждого подхода есть свои плюсы и минусы, об этом можно написать прямо отдельный пост, и вероятно я так и сделаю чуть позже.

P.S Разреверсить это МОЖНО но СЛОЖНО, цель морфа не в защите кода а максимально "уникализировать" бинарник, с чем этот продукт справляется на все 100%. Лучшая защита это полиморфная вирта и полиформ виртуализация кода (просто вставил свои 5 копеек). В конечном итоге Статику он обойдет на все 100 а рантайм уже зависит уже от вас а не от морфа)
Абсолютно согласен с данным утверждением. Да, уровень виртуализации, это имхо высший пилотаж с точки зрения защиты от реверса\ресерча. С точки зрения анедетектов создать полиморфную вирутальную машину с видоизменяемым загрузчиком от билда к билду, чтобы невозможно было прицепить сигну, имхо очень тяжело.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
едва ли можно купить без корп мыла и банковского перевода.
Да хрен с ним мыло и перевод, если бы оно работало как заявлено и без закладок решало бы свою задачу - то проблем нет. И мыло бы сделали и перевод был бы хоть по свифту.
Юзая проприетарные протекторы - выхватишь дженерик - packed\obfuscated с выскокой вероятностью.
То что ваш айпи улетает на материнский карабль в процессе работы проприетарного обфускатора легко фиксится а вот то что патернов
скрытых насует туда - наглухо лишает смысла его использование

Да, уровень виртуализации, это имхо высший пилотаж с точки зрения защиты от реверса\ресерча. С точки зрения анедетектов создать полиморфную вирутальную машину с видоизменяемым загрузчиком от билда к билду, чтобы невозможно было прицепить сигну, имхо очень тяжело
Создать виртуальную машину в соло невозможно - этим команды годами занимаются.
Хз кем надо быть чтоб создать такое.
 
Последнее редактирование:


Напишите ответ...
Верх