ApcRoutine と SystemArgument[0-3] パラメータを悪用し、ランダムな pop r32; ret ガジェットを渡すことで NtQueueApcThreadEx を使用するこの新しい方法は、ステルスなコードインジェクションに使用できます。この PoC では、特定のパターンに一致する ntdll.dll のメモリ領域からガジェットがランダムに選択されます。つまり、ガジェットはシェルコードに リターン します。
ntdll.dll 内で、IMAGE_SCN_CNT_CODE と IMAGE_SCN_MEM_EXECUTE に一致する PE セクション内のランダムなガジェットを見つけます。NtQueueApcThreadExApcRoutineSystemArgumentNtQueueApcThreadEx は IP をガジェット ntdll.dll!<random pop r32; ret> に強制し、SystemArgument1 にリターンしますntdll.dll 内で使用できるガジェットは何百もあります(少なくとも私のビルドでは)。そのため、これを検出するのは困難です。
呼び出しを検査すると、従来の APC インジェクションとは異なり、ApcRoutine は単に ntdll.dll 内の正当なアドレスを指すだけになります。

これはおそらく検出が少し難しいでしょう。NtQueueApcThreadEx への呼び出しを検査する際、いずれかの引数が実行可能メモリを指しているかどうかを確認します。もう1つの検出手段として、ApcRoutine が ntdll 内のアドレスを指しているかどうかを確認する方法があります。ただし、これは多くの誤検知を引き起こす可能性が高いです。
この手法は、もともと Avast の Raspberry Robin に関する記事 こちら で詳しく説明されています。