Lesson 1.How To Crack '03/04/29
シェアウェアへの道のりの第一回が、何故How To Crackなのかって話なんだが、かつて、プログラミングの掲示板で、「シェアウェアを作りたいんですが、シリアル等はどこに保存しておけばいいですか?」というような質問をした人がいて、物議をかもし出していたんだ。
「レジストリに書き込みすら出来ないようなプログラミング能力もない奴がシェアウェアになんてすんな!」とか書いた人がいて(気持ちはわかるんだが)、そのあと「価値というのはプログラミング能力で決まるものではなく、そのプログラムを欲している人がどれだけいるかで決まる。だから、プログラミング能力がなくてもシェアウェアを作ったっていいじゃないか。つまらないものならお金を払わなきゃいいわけだし。それを決めるのはユーザーなんだし」という意見も出て、泥仕合が延々と続いていた。
まあ、後者の人の言ってることは正論には違いないんだろうが、レジストリに書き込みすらできない人がプログラムを書いて、バグやら何やらに対して責任がとれるのかというと、ちょっと無理じゃないかなと思った。
シェアウェアと言えばシリアルチェックを行なうのが定番である。現存のシェアウェアのシリアルチェックには、いろいろ言いたいことがあるので、ここで書いてみるわけだ。それが、今回のお題のHow To Crackである。クラックとはヒビを入れる=プロテクトを破るの意味である。
かれこれ、5年ほど昔の話になるのだが、私の弟子に、ある会社でソフトウェアのプロテクトをはずすのを生業としている奴がいた。DVDのrippingとかと違って、複製のためにプロテクトを外すこと自体は違法でも何でもないだろう。まあ、違法すれすれかも知れないが。(追記:2000年に著作権法が改正され、私的複製のためであれプロテクトを外すことが禁じられるようになった⇒第5款 著作権の制限-第30条-(2))
それはともかく、当時、私も小遣い稼ぎにその手伝いをしていたので、“こつ”はわかる。逆アセやステップトレースできればよほどの馬鹿でもない限りばすすことができると思うが、そんなまどろっこしいことをしていたら時間の無駄なのである。(そもそもひとつはずして500円ほどしかもらえないのだ) たいていのものはバイナリエディタのみで3分以内に外せる。
手順は、こうだ:
まず、プロテクトに引っかかったときに何らかのメッセージを表示しているタイプ。バイナリエディタを使って、その文字列を検索する。仮に0x1e9dcfというアドレスにその文字列が見つかったとすれば、実行時のアドレスは、そこにイメージベースである0x400000と、エントリまでのオフセット(これはものによって違う。だいたい0x1600ぐらい。たいてい下位バイトは00だろう)を足したものであるから、0x1e9dcf + 0x40000 + 0x1600 = 0x5eb3cfぐらいになるわけである。まあ、0x5e??cfだとしよう。
これは文字列なので、レジスタにセットして使うはずだ。普通のコンパイラなら、ecxかedxあたりに代入するだろう。mov ecx,imm32はB9。mov edx,imm32はBAである。つまり、「CF ?? 5E」というコードをサーチして、その直前がBAとかB9なら、ほぼ間違いない。あとは、そこの直前の分岐を探して、それを逆条件にしてやればいい。
条件分岐で、C言語の!=や==は、コンペアのあとにゼロフラグチェック、すなわち、たいていはjeかjneを必要とする。16進コードで言えば74と75だ。さっきサーチで当たった場所から、その直前を見ていき、74があれば75に。75があれば74にしてみる。たいていは、これでうまくいく。あと覚えておきたいのは、jbeが76,jaが77ぐらいだろう。この場合も76なら77に。77ならば76にすれば逆条件になる。7? というコードが分岐で、いずれにしても最下位ビットを反転させれば逆条件になることを覚えておけばいい。
この方法で、たいていのチェック(プロテクトチェック,シリアルチェックetc..)は外れてしまう。..って、悪用してはいかんぞよ!絶対すんなよ!
むしろ、シェアウェアとか作ってるやつらに言いたいんだが、この方法で外されてしまうようなダサいチェックをするな!ということである。何がいけないかと言うと、(上記手順を見ればわかると思うが)分岐させた直後にメッセージを表示していることに問題があるわけだ。(雉も鳴かずば打たれまいて)
だから、エラー時の文字列は事前にセットしておくようにすれば、この方法では対応できなくなる。欲を言えば、逆アセとステップトレースされたときのために、チェック部分のコードはスクランブルしておくぐらいのことは最低限しなきゃいかんのだが、詳しくはまた次回にでも述べるとする。
かと言って、あたかも動いてるかのように見せかけて、レジストリとか破壊するような意地悪はしちゃいかんぞ。そのチェックルーチンバグってて正規ユーザーのレジストリ壊しでもしたら、損害賠償やら何やらで大変なことになるからな。
ということで、シェアウェアのシリアルチェックのルーチンひとつとっても一筋縄ではいかないのである。
ところで、↑みたいなプロテクトを外す話いっぱいあるんですけど、どっかのオタク向けパソコン雑誌で記事でも書かせてもらえんですかね..ネトランとかネトランとかネトランとか。< ネットランナーばっかりやん!