Lesson 2.Crack the dongle '03/06/13
外付けのコピー保護装置と言えばdongle(ドングル)が一番有名だろう。どんぐり..でなかった、ドングルとはどのような仕組みなのだろうか?
たいていは、プリンターポートに接続する。最近ではUSBに接続するものもある。ドングル自体に何らかのプロセッサが載っていて、こいつに対して文字列を送信し、その結果を比較するものが大半を占める。場合によっては実行コードの一部をドングルからダウンロードしてくることもある。まあ、詳しくは
http://www.woodmann.com/fravia/zee__4.htm
にある。
crack出来ないドングルなんて存在しない。実物があれば2、3日もあればたいていはcrackできる。ドングルから実行コードをダウンロードしてくるタイプのものはタチが悪いが、その場合でも最悪dongleのAPIをエミュレートすればいいので、1,2週間あれば十分だろう。crack出来る/出来ないが問題なのではなくて、それにどれくらいの手間や時間がかかるかなのだろう。これは、シェアウェアにかけられたプロテクトにも同じことが言える。
以前、ある日本製のdongleを解析したが、dongleに対して16バイトの特定の文字列を送信して32バイトデータをバックしてもらうんだが、最終的に暗号化のつもりか何かは知らないがビットシフトでくちゃくちゃして、1バイトのデータを得てそれをスタック(参照渡しなのだろう)に積まれているアドレスに書き込みしてリターンしているだけであった。デバッガで追えば、その1バイト値がわかったので、それを書き込んでリターンするルーチンに書き換えたら無事動いた。そのdongleを販売しているホームページによれば、独自の暗号化技術で高いプロテクト性をうんぬんかんぬんらしいが、こんなもんは暗号化技術とは言わない。児戯に等しい。あまり知られてはいないが、暗号化キーをdongleから復元するタイプのプロテクトにはお約束がある。初心者crackerは、dongleCheckのAPIからの戻り値を比較して分岐している部分を逆条件(or 強制ジャンプ or nop)にしようと試みるが、暗号化キーによってコードの復元を行なうタイプのプロテクトは、そのAPIの最後で行なわれている処理が大切なわけだ。そこを再現することが肝要である。
結局のところ本物のdongleのついているマシンでデバッガで追ってもいいのなら、dongleなんてものは誰でもcrack出来るだろう。dongleなしの場合とどこで違う分岐をしたのか調べていけばいい。dongleはそれ自体が数千円するので、100万以上の高額ソフトにつけられていることが多い。そういうdongleのcrackを行なうのを生業としている組織もあるらしい。まあ、元が高いソフトだと儲かるんだろうな..。
さて。ここでは、解析のために用いるものをいくつか書いておこう。
dependency walker(VC6/7にdepends.exeという名前で付属されている。これはフリーウェア):
これを用いて呼び出しているDLLのAPI名等をチェックできる。DLLならexportしている関数名を表示できる。関数名がわかれば、そこから意味を推察することが出来るので、解析が大幅に早くなる。
逆アセンブラ:
高機能な逆アセンブラがあると良い。WindowsのAPI名を書いてくれると助かる。日本製ではVDA(Visual
Disassembler)というシェアウェアの逆アセンブラのはき出すコードが一番読みやすかったんだが、公開停止になった。このソフト、1バイトでも本体を書き換えるとIE関連の主要なレジストリを消してしまうので、泣かされたことがある。いまなら、他の市販の逆アセンブラを使うべきだろうが、たいていはVisual
Studioのデバッガで調べれば済むので、簡単な逆アセンブラでもいいだろう。逆アセンブラを用いる主な理由はバックトレースが楽だということである。「不正なライセンスキーです」という文字列を表示している箇所をサーチして調べることが出来る。そこを逆方向に辿ることによって、そのチェックをすばやく探すことが出来る。
追記('03/06/16):
高機能なフリーの逆アセンブラを教えてもらった。
http://home.t-online.de/home/Ollydbg/
である。基本的なデバッガとしての機能も備えているし、逆アセされたソースも非常に読みやすい。フォント設定すればスタック内の日本語文字列も読めるようになる。