クラッカーの教科書



クラッカーの教科書


解析魔法少女美咲ちゃん マジカル・オープン!

データハウスからクラッカーの教科書が発売された。データハウスの編集長から献本していただいた。


この本はアセンブラの命令に関する解説は省略してあって、中級者向けという感じ。デバイスドライバのトレースや、カーネルモードデバッガに関する解説がある。あと、Haspのクラックについても簡単に解説がある。(HaspとはAladdin社のドングル)


アセンブラから学びたいという人には、私の解析魔法少女美咲ちゃん マジカル・オープン!のほうをまず読むことをお勧めしておく。何か最近になってまたこの本は売上を伸ばしているようで、何故かなーと思ったら、最近ネットランナーで紹介されたらしい。

ところで、Aladdin社の最新のHASPに関してなのだが、私のメモ代わりにざっと書きたいことを書いておく。(私のメモなので意味不明なところがあってもお許しを。)


HASPに限らず最近のドングルは、たいていドングル側にRSA暗号などの暗号化keyが格納されており、ドングル側に対してそのkeyを取り出せないので、結局、ドングル側にプログラムが格納されているのと同じことである。


よって、PC←→ドングル間の通信をproxy dllを作るなどしてAPI呼び出しをhook(横取り)してしまい、ドングルを外している状態でもドングルと同じ動作をするエミュレータ的なものを用意するのが普通である。


しかし、このPC←→ドングル間の通信でやりとりされる内容が毎回同じとは限らない。何故異なる内容になるかというと、PC側で乱数を発生させて、それをseedにして何やかやをするからだ。


結局、乱数の発生のためにrandomizeをどうやってやるかという話になって、常識的には、PCのタイマーの時刻を見てそれを使ってradomizeするので、このAPIもhookして一定の値が返るようにしておく。


その他のパターンとして嫌らしいのは、マルチスレッドにしてあって、片方のスレッドでドングルからのリターンを待つ間、別スレッドがカウンターをインクリメントしてその値がいくらになるかを見るようなケースだ。


このようにマルチスレッドを利用してrandomizeするパターンに対して、いかにして毎回同じ挙動になるようにするか、そして、このパターンをいかにして素早く発見するかが腕の見せ所である。(こういうことをするための専用のデバッガーを作ったほうが良いと思う。汎用デバッガーで複数スレッドから監視しているメモリを列挙したりするのは結構手間がかかる。)


マルチスレッドを利用したアプリケーションで、再現性のないバグに出くわすことがあるが、そういうバグを100%決まったタイミングで再現させたいときは、fiberのような疑似スレッドを用いて、スレッドスケジュールを自前でコントロールすることがある。上のようなタイプのプログラムのクラックにも、その手法が使える。


具体的には、スレッド生成を行なうAPIをhookして、実際にはスレッド生成はせずにfiberを生成するようにする。


こうしておいて、別スレッドの動作をループで待っているほうをループのなかで定期的にyieldを呼び出すようにする。ドングルエミュレータが決まったタイミングで結果を返すなら、このループのなかでインクリメントしている変数も決まった値になるはずで、毎回のプログラムの挙動が同じになる。


このように、毎回のプログラムの挙動を固定化するのがこの手のクラックの常道なのだが、この方法はそう簡単ではなく、他にもいろいろテクニックを駆使しないと達成できない。


あとは、ドングルによっては、デバッガで追いかけて条件分岐を書き換えたいところが見つかってもその部分の命令を書き換えられないことがある。その部分のバイナリは動的に生成された部分だからである。こういうときは、ハードウェアブレークポイントを設定して、そこで停止させるコードを別のところに挿入しておくとか。



まあ、いまどきのドングルをクラックするには、少なくとも自分でカーネルデバッガとx86エミュレータを作れるぐらいでないと辛いんじゃないかという話でした。