
Rtl* 関数を意図しない方法で使用した代替の Read / Write プリミティブを実演するスクリプト集です。
RtlFillMemory は3つの引数、すなわち書き込み先メモリへのポインタ、書き込むバイト数、および1バイトの値を取ります。指定されたメモリブロックに1バイトだけを書き込みます。
RtlInitializeBitMapEx と RtlFillMemory を組み合わせた書き込みプリミティブです。
まず、文字列を16バイトのチャンクごとにループし、各ブロックを2つの8バイト値に分割します。最初の8バイトブロックは RtlInitializeBitMapEx の最初の引数に格納され、2番目の8バイトブロックは2番目の引数に格納されます。
その後、追加の8バイトブロックが残っている場合は、2番目のパラメータを NULL にして RtlInitializeBitMapEx を使用して書き込みます。
最後に、8バイト未満が残っている場合は、RtlFillMemory を使用して1バイトずつ書き込み、文字列全体が宛先バッファにコピーされるまで続けます。
RtlQueryDepthSList を使用した読み取りプリミティブです。ROP ガジェット探索、バイト比較、フック検出などに役立ちます。ここでは、ROP ガジェットを使用した簡単なプロセスインジェクションを実演します。RtlQueryDepthSList は単一の引数、つまり読み取り元のメモリアドレスを受け入れますが、2バイトのみを読み取り、4バイトの値を返します。