CRCBypass

CRCとはCyclic Redundancy Checkの略で、日本語では巡回冗長検査となります。
巡回冗長検査(じゅんかいじょうちょうけんさ、英: Cyclic Redundancy Check, CRC)は、任意長のデータストリームを入力とし、例えば32ビット整数などの固定サイズの値を出力する関数の一種であり、連続する誤りを検出するための誤り検出符号の一種。CRC という用語は、その関数自体を指す場合とその出力値を指す場合がある。CRCは、データの転送や格納時にその一部が偶然変化したことを検出するチェックサムとして使うことができる。


多くのオンラインゲームにおいて、メモリの内容が改竄されたかどうかを検出する手法の1つにこのCRCが用いられています。
メモリが改竄されたかどうかを調べるため、CRCルーチンは当然メモリにアクセスすることになります。

チェックルーチンからのアクセスを調べる

あるオンラインゲームにおいて適当なアドレスにブレークポイントを仕掛けると、CRCチェックルーチンによるリードアクセスが検知されます。

今回利用したオンラインゲームではCRCのチェックルーチンを改竄したかどうかをチェックするルーチンも設けられています。
先ほど実行領域へアクセスしたアドレスにBPをしかけると新たなアクセスが追加されました。
このように、チェックルーチンは必ずしも1つではないため注意が必要です。
imageプラグインエラー : ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (CRC_3.PNG)
これらの命令に対して、改竄前の正規のメモリをコピーしたフェイクダンプを用意してそちらを読みこませるようにすることで、CRCによるメモリ改竄検知を迂回することが可能です。

フェイクダンプの生成

フェイクダンプを生成する方法は2種類あります。

Save memoriregionを利用したフェイクダンプ生成

メモリビューワでFileタブからSave memoryregionを選択(またはCtrl+S)してください。
先の画像で1つめにヒットしたxor演算をしている命令のアドレスが収まるようにフェイクダンプを生成します。
ここでは00401000から00DF0000としました。
imageプラグインエラー : ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (CRC_2.PNG)

保存したバイナリは、オートアセンブラのLOADBINARYコマンドでメモリ上に展開することが可能です。
alloc(fakedump,20000000)
loadbinary(fakedump,jms300.CEM)

rep movsb命令を利用したフェイクダンプ生成

詳細についてはアセンブラ入門:7章 ストリング命令を参照して下さい。
ESIレジスタにコピー元の先頭アドレス、EDIレジスタにコピー先の先頭アドレス、ECXレジスタに転送サイズを指定してからこれを実行します。
なお、ダンプを生成する際にはCREATETHREADコマンドを利用してコードを実行します。
createthread(dump)
dump:
 mov esi,00401000
 mov edi,fakedump
 mov ecx,009E0000 // 00DF0000 - 00401000
 rep movsb
 ret

フェイクダンプをチェックルーチンにかませる

チェックルーチンにフェイクダンプを読みこませるようなスクリプトを生成します。
(esi+ecx*4)が読み込もうとするアドレスであり、この値からフェイクダンプへアクセスする際のオフセットを調整します。
フェイクダンプ領域外にアクセスする場合は、通常と同様の処理を行うように条件ジャンプを設けます。
以下がその例となります。

 mov eax,[eax]
 push ebx
 lea ebx,[esi+ecx*4]
 cmp ebx,00401000
 jb LABAL1
 cmp ebx,00DF0000
 jae LABAL1
 sub ebx,00401000
 xor eax,[ebx+fakedump]
 pop ebx
 jmp RETURN
LABAL1:
 xor eax,[ebx]
 pop ebx
 jmp RETURN

また、CRCルーチンの改竄をチェックするルーチンについては書き換えた箇所だけオリジナルのダンプをかませればよいので、
書き換え箇所へのチェックルーチンのアクセスを調べてオリジナルダンプをかませます。
この例ではアクセスにEDXレジスタを用いていることから、4バイトずつアクセスしていることが分かります。
ここで、正しくフェイクダンプをかませないと不正が検知されクライアントが異常終了します。
追加情報ウインドウで、アクセスしたアドレスを確認して正しくフェイクダンプをかませましょう。
imageプラグインエラー : ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (CRC_4.PNG)

jmp命令には5バイトを要するので、8バイト分のフェイクダンプを用意すれば収まります。
imageプラグインエラー : ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (CRC_5.PNG)

チェックルーチンにもフェイクダンプをかませればCRCBypassの完成となります。

備考

CEのオートアセンブラスクリプトには実行順序があります。
特にCreateThreadは、メモリの割当や書き換えが行われた後に実行されます。
従って、フェイクダンプを生成する際にrep movsb命令を使用する場合改竄後のメモリをダンプしてしまう恐れがあることに注意して下さい。
これを回避するには、コードケーブへjmpする書き換えもアセンブリ命令で実装してしまうことです。
最終更新:2014年07月14日 02:20