Малварь как искусство Метапрограммирование в С++. Или пишем метаморфный движок

Кто просматривает этот контент: "Тема" (Всего пользователей: 0; Гостей: 1)

X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
5 722
Репутация
257
Jabber
Telegram
#1
Всем привет.

Многие считают что метапрограммирование в Си невозможна, отчасти они правы, но мало кто знает, что в Си есть очень мощный препроцессор, при помощи которого можно делать много вещей.)

Препроцессорные макросы используется обычно для уменьшение рутинных операций и для ускорения исполнения кода, ведь всё-что у нас в препроцессоре, компилятор вставит в код, это почти-как инлаин функция.

Отличие инлаин функций от препроцессорного макроса, в том-что макрос разворачивает Си-код в процессе компиляции, а вместо инлайн функции, компилятор пытается вставить ассемблерный код, в месте вызова такой функции.

Ладно, перейдём к делу...

Зачем это нужно ?

Ну разумеется мы будем использовать для "темных дел".)))

Как и все проекты в этом репозитории, кроме как обучающей цели, можно использовать в двух направлениях:
  • Белое направление: Для защиты кода от исследований (Запутывание реверсера).
  • Чернуха: Для обхода детекта антивирусов.
Суть идеи:

Думаю все знают, что сигнатурный детект антивируса, не важно эмулятор это, или просто сигнатурный детект на какую-то часть кода, основан на каком-то слепке кода. (Более подробно про это можно прочитать тут https://ru-sfera.org/threads/ehmuljacija-antiehmuljacija-detekt-i-kriptory.3612/)

Так-вот для обхода детекта, хакеры часто "разбовляют код мусором", мусор этот как-правило представляет собой код разных математических операций, ветвлений и т.д.

Идеально, что-бы после сборки вируса, он был разный, причем разный как на уровне кода, так и на уровне исполнения инструкций.

Для автоматизации этого всего разрабатывают так-называемые "генераторы мусора кода", или ещё можно использовать "обфускацию кода".

Причем эти генераторы могут-быть разные, рассмотрим пару типов (Это классификация моя и не начто не претендует):

1)Генератор мусора, на уровне исполнения программы:

Смысл такой, что в дата-секции мы распологаем например ассеблерные инструкции (опкоды), которые исполняются в момент исполнения программы, обычно в случайном порядке и случайном колличестве.

Также можно исполнять и API-windows в случайном порядке.

Пример такого генератора тут:https://github.com/XShar/simple_trashe_gen_module

Минусы такого решения, что реально секция кода не меняется, ну и реверсер может обнаружить, что код генерируется...

2)Генерация мусора, на уровне компиляции кода:

Смысл заключается в добовлении в исходник, в нужное место мусора, для этого можно использовать так-называемые Junk Code Generator (Пример реализации https://github.com/gehaxelt/PHP-C---JunkCodeGenerator)

Мы-же реализуем такой генератор препроцессором и вставим такой код в нужное место:

Для работы нам будет нужен Boost.Preprocessor (https://github.com/boostorg/preprocessor) - это библиотека, делающая метапрограммирование с помощью препроцессора простым, более эффективным и, при правильном пользовании и должном умении, читабельным (тут, конечно же, без ответного мало-мальского умения от читателя такого кода тоже не обойтись).

Данная библиотека хорошо документирована:https://github.com/boostorg/preprocessor/tree/develop/doc/index.html

Вкратце основная идея реализации:

Разместим движок:

1)\metamorph_gen_engine\metamorph_code\boost - Библиотека для работы с препроцессором

2)\metamorph_gen_engine\metamorph_code\morph.h - Реализация функций (мусора, я реализовал метематические операции, т.е. сложение, вычитание, XOR и т.д.), я добавил 14-ть функций для теста, можно добавить больше.

Функции реализованы на макросах, по примеру в документации.)))

3)\metamorph_gen_engine\metamorph_code\config.h - Конфигурационные переменные:

#define START_MORPH_CODE 1 #define END_MORPH_CODE 14

START_MORPH_CODE - Какой номер функции генерировать первой. END_MORPH_CODE - Какой номер функции генерировать последней.

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

Как работать с движком (С комментариями что, к чему):

Пример:\metamorph_gen_engine\metamorph_gen_engine\metamorph_gen_engine.cpp:
#define DECL(z, n, text) BOOST_PP_CAT(text, n) ();
BOOST_PP_REPEAT_FROM_TO(START_MORPH_CODE, END_MORPH_CODE, DECL, function)

Пояснения к коду:

BOOST_PP_CAT(text, n) - По сути, это то-же что и cat в Linux (Т.е. на выходе мы получим "textn").

BOOST_PP_REPEAT_FROM_TO - Разворачивает макросы в цикле.

Его прототип:

BOOST_PP_REPEAT_FROM_TO(first, last, macro, data)

first - Начальное значение (У нас START_MORPH_CODE). last - Конечное значение (У нас END_MORPH_CODE).

macro - Макрос, который нужно развернуть, его прототип должен-быть такой:

macro(z, n, data)

В итоге будет разворачиваться так:

macro(z, first, data) macro(z, first + 1, data) ... macro(z, last - 1, data)

Но у нас (наш пример):

#define DECL(z, n, text) BOOST_PP_CAT(text, n) (); BOOST_PP_REPEAT_FROM_TO(START_MORPH_CODE, END_MORPH_CODE, DECL, function)

text -> functionN() N -> номер функции

И тогда, после сборки будет так:

function1();

function2();

function3();

function4();

function5();

function6();

function7();

function8();

function9();

function10();

function11();

function12();

function13();

function14();

Генерация успешна.)))

Исходник движка можно скачать здесь:https://github.com/XShar/metamorph_gen_engine
 

HopefuLXakir

Житель форума
Форумчанин
Регистрация
14.11.2018
Сообщения
76
Репутация
9
#2
А если я допустим вызываю мусорный код в нескольких частях программы как мне сделать так чтобы при каждом вызове порядок генерирования функций был разный?
 

HopefuLXakir

Житель форума
Форумчанин
Регистрация
14.11.2018
Сообщения
76
Репутация
9
#3
Допустимм в одном месте 1-5 в другом 8-14 а в 2-3?
 

virt

Уважаемый пользователь
Форумчанин
Регистрация
24.11.2016
Сообщения
632
Репутация
210
Jabber
Telegram
#4
А если я допустим вызываю мусорный код в нескольких частях программы как мне сделать так чтобы при каждом вызове порядок генерирования функций был разный?
Нужно генерировать рандомное число на этапе компиляции, как например в этом проекте:https://github.com/XShar/Super_Hide_String/blob/master/super_hide_string/hide_str.hpp

Либо проще задать дефайн, какой-вам нужен и вручную менять.

Первый вариант лучше, второй проще...
 

HopefuLXakir

Житель форума
Форумчанин
Регистрация
14.11.2018
Сообщения
76
Репутация
9
#5
Либо проще задать дефайн, какой-вам нужен и вручную менять.
Тогда мне нужно для каждого вызова создавать свой файл конфигурации? Иначе порядок то генерации в любом случае будет одинаковый во всех вызовах?
 
Последнее редактирование:

Jefferson

Житель форума
Форумчанин
Регистрация
09.06.2019
Сообщения
27
Репутация
8
Telegram
#6
А если я допустим вызываю мусорный код в нескольких частях программы как мне сделать так чтобы при каждом вызове порядок генерирования функций был разный?
Написал в общем свой костыль, лень было с собой буст таскать постоянно:

C:
#define LOOP1(funcN1) trash##funcN1();
#define LOOP2(n, funcN1, funcN2) trash##funcN2(); LOOP1(funcN1)
#define LOOP3(n, funcN1, funcN2, funcN3) trash##funcN3(); LOOP2(n, funcN1, funcN2)
#define LOOP4(n, funcN1, funcN2, funcN3, funcN4) trash##funcN4(); LOOP3(n, funcN1, funcN2, funcN3)
#define LOOP5(n, funcN1, funcN2, funcN3, funcN4, funcN5) trash##funcN5(); LOOP4(n, funcN1, funcN2, funcN3, funcN4)
#define LOOP6(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6) trash##funcN6(); LOOP5(n, funcN1, funcN2, funcN3, funcN4, funcN5)
#define LOOP7(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7) trash##funcN7(); LOOP6(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6)
#define LOOP8(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8) trash##funcN8(); LOOP7(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7)
#define LOOP9(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9) trash##funcN9(); LOOP8(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8)
#define LOOP10(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10) trash##funcN10(); LOOP9(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9)
#define LOOP11(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11) trash##funcN11(); LOOP10(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10)
#define LOOP12(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12) trash##funcN12(); LOOP11(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11)
#define LOOP13(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13) trash##funcN13(); LOOP12(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12)
#define LOOP14(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14) trash##funcN14(); LOOP13(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13)
#define LOOP15(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15) trash##funcN15(); LOOP14(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14)
#define LOOP16(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16) trash##funcN16(); LOOP15(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15)
#define LOOP17(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17) trash##funcN17(); LOOP16(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16)
#define LOOP18(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18) trash##funcN18(); LOOP17(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17)
#define LOOP19(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19) trash##funcN19(); LOOP18(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18)
#define LOOP20(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20) trash##funcN20(); LOOP19(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19)
#define LOOP21(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21) trash##funcN21(); LOOP20(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20)
#define LOOP22(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21, funcN22) trash##funcN22(); LOOP21(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21)
#define LOOP23(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21, funcN22, funcN23) trash##funcN23(); LOOP22(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21, funcN22)
#define LOOP24(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21, funcN22, funcN23, funcN24) trash##funcN24(); LOOP23(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21, funcN22, funcN23)
#define LOOP25(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21, funcN22, funcN23, funcN24, funcN25) trash##funcN25(); LOOP24(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21, funcN22, funcN23, funcN24)

#define RAND_TRASH(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21, funcN22, funcN23, funcN24, funcN25) LOOP##n(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21, funcN22, funcN23, funcN24, funcN25)
Вызывать так:
RAND_TRASH(5, 1,2,3,4,5)

На выходе получаем:

C:
trash5();
trash4();
trash3();
trash2();
trash1();
 

HopefuLXakir

Житель форума
Форумчанин
Регистрация
14.11.2018
Сообщения
76
Репутация
9
#7
Написал в общем свой костыль, лень было с собой буст таскать постоянно:

C:
#define LOOP1(funcN1) trash##funcN1();
#define LOOP2(n, funcN1, funcN2) trash##funcN2(); LOOP1(funcN1)
#define LOOP3(n, funcN1, funcN2, funcN3) trash##funcN3(); LOOP2(n, funcN1, funcN2)
#define LOOP4(n, funcN1, funcN2, funcN3, funcN4) trash##funcN4(); LOOP3(n, funcN1, funcN2, funcN3)
#define LOOP5(n, funcN1, funcN2, funcN3, funcN4, funcN5) trash##funcN5(); LOOP4(n, funcN1, funcN2, funcN3, funcN4)
#define LOOP6(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6) trash##funcN6(); LOOP5(n, funcN1, funcN2, funcN3, funcN4, funcN5)
#define LOOP7(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7) trash##funcN7(); LOOP6(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6)
#define LOOP8(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8) trash##funcN8(); LOOP7(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7)
#define LOOP9(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9) trash##funcN9(); LOOP8(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8)
#define LOOP10(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10) trash##funcN10(); LOOP9(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9)
#define LOOP11(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11) trash##funcN11(); LOOP10(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10)
#define LOOP12(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12) trash##funcN12(); LOOP11(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11)
#define LOOP13(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13) trash##funcN13(); LOOP12(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12)
#define LOOP14(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14) trash##funcN14(); LOOP13(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13)
#define LOOP15(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15) trash##funcN15(); LOOP14(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14)
#define LOOP16(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16) trash##funcN16(); LOOP15(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15)
#define LOOP17(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17) trash##funcN17(); LOOP16(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16)
#define LOOP18(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18) trash##funcN18(); LOOP17(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17)
#define LOOP19(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19) trash##funcN19(); LOOP18(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18)
#define LOOP20(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20) trash##funcN20(); LOOP19(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19)
#define LOOP21(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21) trash##funcN21(); LOOP20(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20)
#define LOOP22(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21, funcN22) trash##funcN22(); LOOP21(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21)
#define LOOP23(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21, funcN22, funcN23) trash##funcN23(); LOOP22(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21, funcN22)
#define LOOP24(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21, funcN22, funcN23, funcN24) trash##funcN24(); LOOP23(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21, funcN22, funcN23)
#define LOOP25(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21, funcN22, funcN23, funcN24, funcN25) trash##funcN25(); LOOP24(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21, funcN22, funcN23, funcN24)

#define RAND_TRASH(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21, funcN22, funcN23, funcN24, funcN25) LOOP##n(n, funcN1, funcN2, funcN3, funcN4, funcN5, funcN6, funcN7, funcN8, funcN9, funcN10, funcN11, funcN12, funcN13, funcN14, funcN15, funcN16, funcN17, funcN18, funcN19, funcN20, funcN21, funcN22, funcN23, funcN24, funcN25)
Вызывать так:
RAND_TRASH(5, 1,2,3,4,5)

На выходе получаем:

C:
trash5();
trash4();
trash3();
trash2();
trash1();
Решил заюзать ваше решение у себя в проекте при сборке пишет что trash не определен.
 

virt

Уважаемый пользователь
Форумчанин
Регистрация
24.11.2016
Сообщения
632
Репутация
210
Jabber
Telegram
#8
Код:
trash5();
trash4();
trash3();
trash2();
trash1();
Нужно реализовать где-то, эти макросы их вставляют.
 

Jefferson

Житель форума
Форумчанин
Регистрация
09.06.2019
Сообщения
27
Репутация
8
Telegram
#9
Решил заюзать ваше решение у себя в проекте при сборке пишет что trash не определен.
__forceinline void trash1()
{
MessageBoxA(0, "hello from trash1", 0, 0) ;
)

...

...

__forceinline void trash5()
{
MessageBoxA(0, "hello from trash5", 0, 0) ;
)
(Советую юзать __forceinline)
 

HopefuLXakir

Житель форума
Форумчанин
Регистрация
14.11.2018
Сообщения
76
Репутация
9
#10
__forceinline void trash1()
{
MessageBoxA(0, "hello from trash1", 0, 0) ;
)

...

...

__forceinline void trash5()
{
MessageBoxA(0, "hello from trash5", 0, 0) ;
)
(Советую юзать __forceinline)
Cпасибо да я позже сам понял что trash определить надо. Я просто в файле morph.h заменил function на trash и все заработало.
 
Вверх