
これまでに学んだすべてのAMSIパッチを文書化しました。
これまでに学んだすべてのAMSIパッチを文書化しました。


a. jne の呼び出し前にすべての命令が成功する場合、jne を介して amsi!AmsiOpenSession+0x4c への進入をスキップする。
=> 最終的に amsi!AmsiCloseSession に直接到達します。
amsi!AmsiOpenSession から jne を使用するテクニック Github を紹介してくれた @D1rkMtr に感謝します。彼のAMSIパッチコードのテンプレートを使用し、これまでに私が取り組んだ他の手法を追加しました。b. amsi!AmsiOpenSession の先頭に c3 を直接貼り付けることで、ret を介して amsi!AmsiOpenSession+0x4c (複数のスキャン要求を関連付けることができるセッションを開く) への進入をスキップする。
=> 最終的に amsi!AmsiCloseSession に直接到達します。
a. amsi!AmsiScanBuffer の先頭に c3 を直接貼り付けて、ret を介して amsi!AmsiScanBuffer の主要命令の実行をスキップする。
b. amsi!AmsiScanBuffer の先頭に \\xB8\\x57\\x00\\x07\\x80\\xC3 ('mov eax, 0x80070057; ret') を直接貼り付けて、amsi!AmsiScanBuffer 内で実際のスキャンを実行して戻る分岐をスキップする。
ここで、HRESULTの値 (むしろエラー値) は 'E_INVALIDARG' です (出典: https://pre.empt.dev/posts/maelstrom-etw-amsi/#Historic_AMSI_Bypasses)
c. amsi!AmsiScanBuffer の先頭に \\xB8\\x05\\x00\\x07\\x80\\xC3 ('mov eax, 0x80070005; ret') を直接貼り付けて、amsi!AmsiScanBuffer 内で実際のスキャンを実行して戻る分岐をスキップする。
ここで、HRESULTの値 (むしろエラー値) は 'E_ACCESSDENIED' です (出典: https://pre.empt.dev/posts/maelstrom-etw-amsi/#Historic_AMSI_Bypasses)
d. amsi!AmsiScanBuffer の先頭に \\xB8\\x06\\x00\\x07\\x80\\xC3 ('mov eax, 0x80070006; ret') を直接貼り付けて、amsi!AmsiScanBuffer 内で実際のスキャンを実行して戻る分岐をスキップする。
ここで、HRESULTの値 (むしろエラー値) は 'E_HANDLE' です (出典: https://pre.empt.dev/posts/maelstrom-etw-amsi/#Historic_AMSI_Bypasses)
e. amsi!AmsiScanBuffer の先頭に \\xB8\\x0E\\x00\\x07\\x80\\xC3 ('mov eax, 0x8007000E; ret') を直接貼り付けて、amsi!AmsiScanBuffer 内で実際のスキャンを実行して戻る分岐をスキップする。
ここで、HRESULTの値 (むしろエラー値) は 'E_OUTOFMEMORY' です (出典: https://pre.empt.dev/posts/maelstrom-etw-amsi/#Historic_AMSI_Bypasses)
JE から JMP に変更して直接戻るようにする... : https://github.com/ZeroMemoryEx/Amsi-Killer