2012/10/25にくいなちゃんさん主催で開催された6さいカンファレンスのまとめ。 第7回は「Windowsのアプリをクラックしよう!(再)」です。
第4回「Windowsのアプリをクラックしよう!」はどこへいってしまったのでしょう? 頑張って探したけどこれしか情報が無い・・・?
昨日の 6さいカンファレンスは盛り上がりましたね (第4回 「Windowsのアプリをクラックしよう!」) 来週は、作曲講座をしようと思っています。 お楽しみに☆ #6saiconf
— くいなちゃんさん (@kuina_tesso) 9月 28, 2012
厳しい緘口令が敷かれているのか,参加者がくいなちゃんさんしか居なかったのか,そもそもそんなのなかったのか・・・.
勝手にまとめてしまったので、何か問題があれば@shogo82148まで。 (カンファレンスの内容にはくいなちゃんライセンスが適用されるらしいです.怖!)
—–キリトリセン—–
くいなちゃん: 10/25(木) 21:00 から、第7回 6さいカンファレンスを開催します。 テーマは、「Windowsのアプリをクラックしよう!(再)」 です。 ** (再) と付いていますが、前回やった記憶はございません。 ** 参加されない方は、今のうちにご退場お願いします。 ROMでの参加も歓迎ですん☆ それでは、もうしばらくお待ちください。
くいなちゃん: それでは、第7回 6さいカンファレンスを開催します。 テーマは、「Windowsのアプリをクラックしよう!(再)」 ですん☆ しかし、これを開始する前に、いくつかの免責事項をお伝えしなければなりません。 (6さい的な事情)
くいなちゃん: まず、実際に既存の Windowsアプリをクラックする、という流れで 話を進めていきますが、実際にクラックを行っているわけではなく、 また画像も合成です。 実際に既存のアプリに対してクラックする行為は、 場合によっては犯罪となりますので、** 決してマネしないでください **。 本講座は、犯罪を助長する意図があるわけではなく、 むしろ攻撃側を知ることで、防衛スキルを身に着けようというものです!
マインスイーパ!
くいなちゃん: はい、よろしいでしょうか。 では、本日クラックするアプリはこちらです! http://kuina.tes.so/6saiconf_7/img0.png
くいなちゃん: みなさん大好きな、マインスイーパですん☆ くいなちゃんは、マインスイーパが得意ではないので、上級をクリアする頃には、 時間が999になってしまいます。 そこで、この時間が経過しないよう、改造することを今日の目標としましょう。
くいなちゃん: まず、ollydbg というフリーソフトを起動します。 これは、主に アプリをクラックするのに使われるソフトです[要出典] http://kuina.tes.so/6saiconf_7/img1.png 画像は、ollydbg 上でマインスイーパを起動したところです。
くいなちゃん: ollydbg には、ウインドウがいくつか分かれていますが、 簡単に説明すると、左上が exeファイルを逆アセンブルしたコード、 左下が 実行時のメモリの内容、右上が CPUのレジスタの内容、 右下は… コールスタックみたいに見えるけど、よくわからないからキニシナイ!
くいなちゃん: ではここで、もう一つ フリーソフトを起動しましょう。 スペシャルねこまんま57号 という、アレなアイコンとタイトルのソフトです。 主に、実行しているアプリのメモリを監視したり書き換えたりするのに使います。 http://kuina.tes.so/6saiconf_7/img2.png
経過時間を格納している変数を捜索
くいなちゃん: このソフトは、ゲームのスコアをいじったり、RPGのパラメータを999にしたりするのに重宝します。 画像は、マインスイーパの時間が 010 になった瞬間に、マインスイーパのメモリ上から 10 である部分を全部探索して、右下にリストアップしているところです (8026件)
くいなちゃん: 更に、時間が020になった瞬間に、20 のメモリを探索し… とだんだん目的のメモリアドレスを絞り込んでいきます。 そしてついに、経過時間を格納している変数が割り当てられているメモリのアドレスを突き止めました! http://kuina.tes.so/6saiconf_7/img3.png 1件に絞られていますね。 中央のウインドウは、該当メモリの前後の様子です。
くいなちゃん: この中央のウインドウの値を直接いじっても、値が反映されますので、RPGのパラメータを999にしたいときは、ここをいじれば ok です。 しかし今回は、時間経過で1ずつ増加されていくプログラムそのものを書き換えたいので、この値は放置します。 重要なのは、このメモリのアドレスが、0x0100579c であることです☆
ブレークポイントを設定
くいなちゃん: というわけで、ollydbg に戻って、左下ウインドウにあるメモリ上から、例の 0x0100579c を見つけます http://kuina.tes.so/6saiconf_7/img4.png
くいなちゃん: ありましたか。 6A 01 という値になっている箇所がありますね。 ここを選択し、この値が書き換えられたらプログラムが一時停止するように、ブレークポイントを仕掛けます。 つまり、マインスイーパで時間が経過するときに 1 ずつ加算されているプログラムの箇所を突き止めようというものです。
くいなちゃん: はい、この画像は既にブレークポイントが設定され、マインスイーパが罠にかかった瞬間のスナップです。
左上のウインドウを見ると、一番上に INC DWORD PTR DS:[100579C]
とありますね。
これは、メモリ 100579C 番地を INC (1ずつ加算する命令) することから、目的のプログラムであることが解ると思います
くいなちゃん: まあ、C言語っぽく言いますと、
int time; // 100579C番地に割り当てられる
time++; // 例の箇所
という感じでしょうか。
exeファイルを改造
くいなちゃん: では、いよいよプログラムの問題の箇所が特定できたので、マインスイーパのexeファイルを改造するですよー☆ Visual Studio 付属の、exeダンプを使って、マインスイーパの構造をテキストファイルに吐き出します。 http://kuina.tes.so/6saiconf_7/img5.png このexeダンプは、逆アセンブルしたり、いろいろ使い道があります。
くいなちゃん: 吐き出したテキストファイルがこちらです http://kuina.tes.so/6saiconf_7/img6.png 左のウインドウは、exeファイルのヘッダ情報になります。 まあ、今回はあまり気にしなくてokです。 右上は、exeファイルの、実際のプログラムが格納されている部分の情報になります。 file pointer to raw data を見ると、00000400 to 00003fff となっています。 また、virtual address は 01001000 to 01004a55 となっています。 これは、実行ファイル(バイナリ) の 400byte~ が、実行時の 01001000番地~ に割り付けられるということを意味しています。
くいなちゃん: 先ほどの INC DWORD…
という命令は、メモリ上の 01002FF5 に存在していました
(確認していなかったので、気になる人はimg4.png に戻ってください)
右下のウインドウは、exeファイルの機械語バイナリとなっていますが、01002FF5 の例の命令を選択しています。
img4.png の命令(機械語) と一致していることが解ると思います。
確認してみてください。
くいなちゃん: はい、実行メモリ上の 01001000番地が、プログラムの 400byte部分に相当するとさっき解りました。 ということなので、01002FF5 という、例の命令の番地は、01002FF5 - 01001000 + 400 = 23F5 byte に存在することになりますね。 バイナリエディタで マインスイーパのexeファイルを開き、23F5 byte 目を確認してみましょう。 http://kuina.tes.so/6saiconf_7/img7.png ありましたね!
くいなちゃん: つまり、これが、くいなちゃんを苦しめていた 時間経過命令なのです!
この忌まわしい命令は、さっさと無効化しちゃいましょう。
http://kuina.tes.so/6saiconf_7/img8.png
90 で埋めました。 90 というのは、機械語で NOP
を意味し、何もしない命令になります。
とりあえず、迷ったら 90 で埋めることを覚えましょう。
クラック成功!
くいなちゃん: これにより見事、時間経過命令は、NOPで埋められ、無効化されたので、このように時間経過しなくなりました。 http://kuina.tes.so/6saiconf_7/img9.png ずっと時間は 1 のままですん☆ ハイスコアが狙えますね!!
くいなちゃん: というわけで、このような感じで Windowsアプリをクラックすることができます。 今回は、マインスイーパの時間経過を止めるだけでしたが、この応用で、有料アプリのパスワードをクラックしたり、技術的には色々できます。 ただ、最初でも言いましたが、クラックできることと、実際にすることは違います。 素晴らしいアプリであれば 作者に対価を支払うべきでしょうし、素晴らしくないなら そもそも使うべきではありません。 本講義では、このような攻撃手段を知ることで、自分がアプリを作るときに どうすればクラックされるのを防ぐことができるのかを考えるきっかけとなればと思い行いました。 くれぐれも悪用はしないでくださいね☆