解析の第一歩


さて、それでは環境を整え、解析を実践してみましょう。

まずは解析するためのツール群を揃えていただきます。
”困ったときのgoogle先生”に慣れてもらうため、こちらでのファイルの提供は解析するファイルの方のみとしますので、筆者と近い環境を感覚で揃えてください。
ということでツールの名前だけ記していきます。

OllyDbg v1.10(日本語化&基本プラグイン導入済み)
(最新バージョンは不安定との情報があるので…)

まずはこれだけあれば十分です。
ただしプラグインは存在するだけ入れておいて頂かないと、説明どおりに動作できない可能性が高いです。
この時点で検索できない、日本語化できない、うまく動かないなどの症状が起こっている方には解析という作業は少々荷が重いかもしれませんので、ご辞退願います。
…と社交辞令を書きましたが、本当の理由は以下に示します。
不快感を感じる方もいらっしゃると思いますので、読みたい方のみドラッグして読んでください。

OllyDbgが英語のツールだから読めない?
日本語化すりゃあいいじゃねぇか。
日本語化パッチの場所教えろ?
ググレカス。
この時点でダウンしてる奴ぁ大概厨房もしくは本当の根性無しだ。
そんな奴にこんな技術根こそぎ持ってかれてみろ、ご自慢の中二病が発症してどんなことになるか予想もついたもんじゃねぇ。
折角日本語化とか自分でしなくても良い時代に生まれて来れたんだからよ、探すくらいしろよ。


えっと、気を取り直しまして、用意できたかと思いますので、次へ進みます。
あ、書き忘れましたが今後OllyDbgのことをollyと呼びますので、覚えて置いてください。
そうだ、後一つ、base64というツールを用意してください。
こちらは最初から日本語で作成されたツールがおそらくvectorさん辺りでダウンロードできますので、ご用意ください。
解析用のプログラムはこの形式で提供しようと思います。
それでは早速使い慣れていただくために、解析する1つ目のプログラムをば…。

base64->rar
UmFyIRoHAM+QcwAADQAAAAAAAABlxnQggi8A7wIAAAAMAAACxuVDQAAAcjgdNQ8AIAAAAGNya21l
MDEuZXhlAAHACQwhURDMn82A4znHBOORycBFFKARwiQX5ARroRFZEoA4SREijUIU/qn056m3HzfN
d3NJxIQQgUwlMpJSISEBQFAigiUidUUFEoJAXFBQWOQlEoKCgSYu3u6EHAzX8D4RAUFrxrezN9mZ
7s3ufZu/5rM97fZmavatxe/s9ntWJdtG0dRqW4X/5oVgbQ7HE+eVaINXeAXg1Wix4U2xDPrvTw9E
7B+ZixYy6EpZWIslIQTSkyVWEMYiC0uShG2qBh9FCQrDI/fPnttTI7Dq01vCnMmua4vTjzfAK8Xn
Y83xMqk6hXiRk4pn/8aHBvXFgnfYXA32RfOa9oWR1edW2AOmjeFh7cQp6kZsX7sHMOODSydXOovq
U8P/Nf3VRS2Et5dTx4cDf8Cd239Hz9gkxgp66lMOqVd7ohCfrQ0mEip6dSA/Twn8e83j+lFBcOUj
Ti3hfuluHrrJhT1O8bj1vYFXyF7zHCdqNHf/5G8FuLxz6Kpw2ET+UYOdlm+Bzu22dLM2My9sLvej
75lwtsn3etWFCRcloi8gYcXXNNS3k5IwIMmGnbiDSr9KXaCePDCWZQ0Ub+PvdZiK+LXBLOMWrLr/
A+W9x22+KXWl59M8PRPtz0BhW/Ao9bVmzZeMu2QKVfIXl2RsD9g49SDV9gV57Z3mc6mHKbjdabYe
0Qms/FCnZT/oe9kIEZJRWJzVZkFIdj7zA8YXsmHSED3hfEYgKRMBgkjFG3e+m9w7CIuulEIMxt2W
uRa65L+Goo4smheZGYgrKpjEBXHDPcJWHLUJfpSWkSgwNB0ouwsnIlC3HoYkkUqS6s0TWjo3MggZ
vly9kO0vRUbplamVoU89Fqr5C+GcFa0WpvkzdDm2GUWttc7Kr9whDdx3f3HJuSpu4DzVzXQPR/LB
v2mmLMcJAEE3cjZBjBkA/DEBIJQRghguGRU4P/JuJ91PoBz0dBHzI+RHddlBwR5YuID4DbSdzH6z
YYdAuHRq8oDrCnPZ1yvrBV8hT5LEPXsAQAcA
base64->rarという行は除いてください
つまりUmから最後のcAまでです。
base64->rarというのはbase64の形式からrarファイル(圧縮ファイル)にデコードしてください、という意味です。
最適化しきっていないのでまだまだ大きいサイズになってしまいましたが、お許しください。
rarファイルを解凍したらcrkme01.exeというファイルが出てきたと思います。
それでは早速ollyでcrkme01.exeを読み込んでください。

ツールバーの下に幾つか文字が書かれていますね。
それのディスアセンブルと書かれた縦列。
そこに書かれた大量のアルファベットがアセンブリ言語と呼ばれる書式です。
その中のさらに先頭に書かれた文字…。
PUSHとかCALLとかMOVっていうやつですね。
これをニーモニックと呼びます。
ニーモニックは〜命令というように命令名として設定された文字列です。
その辺りは面倒ごとになってしまうので気にしないで置いてください。

さて、それでは解析を始めていくわけですが、一体どこを見れば良いの?って感じですよね。
とりあえず普通に実行してみましょう。
ツールバーの右向きの三角印(左から4つ目のボタン)もしくはF9でプログラムを起動してください。
すごく小さいウィンドウが表示されましたね。
説明なしでもわかると思いますが、そこの白い四角のところ。
これをインプットボックスやエディットボックスと呼びますが、ここに正解となる文字列を入力してOKを押せば正解メッセージが表示されるわけです。
それでは、その判定をしている位置を把握する前に、このプログラムが一体どういった動作をしているのか、そこを解説しましょう。
勘の良い方はもうほとんどわかっているでしょうし、プログラミング経験のある方に至ってはもう答えを導き出しているでしょう。

まず、エディットボックスに入力した文字列を、OKボタンを押された時に取得します。
その後正解かどうかを判断して、それに応じたメッセージボックスを出すわけです。
そのプロセスを知っていればあとは方法が二つあります。
間違ったメッセージが表示される処理と正解メッセージが表示される処理の分岐点をどちらかのメッセージから遡って見つけ出すか、入力した文字列を取得したところから進めていくか…です。
遡って見つけ出すためにはニーモニックの知識もしくは勘が必要になりますので、今回は進めていくほうにしましょう。

こちらの手法で必要な知識はWin32API関数と呼ばれるものです。
先ほどのディスアセンブルの列ではなくコメントの列を見てください。
この列には赤文字で表示されている文字がWin32API関数です。
今後はAPIもしくは関数と呼ぶと思うので、覚えて置いてください。
関数名をみれば大体察してもらえると思いますが、入力した文字列を取得しているのはGetDlgItemTextAという関数です。
プログラムによって取得する関数はマチマチですが、GetDlgItemTextAもしくはGetDlgItemTextW、それとGetWindowTextA、GetWindowTextW…この4つのどれかだと思ってくれれば大体はいけます。
それでは早速これがどのタイミングで使われるか、どのタイミングで動作を停止させて確認しましょう。
今回のような単純なプログラムでは必要はないかもしれませんが、今後のために一応汎用性のある遣り方でやっていきます。

右クリック→検索→ラベル名で使われている関数を一覧にできますので、実行してみてください。
すると、しっかりとGetWindowTextAがありますね。
それではGetWindowTextAを左クリックで選択して、右クリック→全ての参照にブレークポイントをセットをしてください。
ブレークポイントというのは、それを設置した場所にきたらプログラムを停止させろ、というものです。
先ほどのCPUと書かれたウィンドウを見てみると、アドレス列の401054というところが赤くなっていると思います。
それがブレークポイントセット完了のサインです。
それでは実行されたcrkme01.exeに戻りましょう。

好きな文字列で構いませんので、適当に入力してOKを押してみてください。
すると先ほどのollyが最前面になり、さきほどの401054という文字が黒く反転していますね。
この状態がブレークしている状態、といいます。
401054というのは実行している位置を示す数値だったのです。
なので、ブレークしたこの場所で止まっているのです。

さて、サクサクと終わらせてしまいましょう。
ここからはF8キーで進めていきます。
2回押すと、ブレークしたアドレスの次のアドレスに来ると思います。
次の行に来た、ということはすでにブレークした位置の処理は済んでいるので、もう入力した文字列は取得できている、ということになります。
コメント部を見ていただければわかりますが、API関数名の左が括弧で括られていますね。
括弧で括られた関数名以外のものは引数(ひきすう)と呼ばれ、APIに渡すアドレスになっています。
渡す、というのはどういうことか、というと複雑な話になりますが、その渡されたデータをもとに関数がいろいろな処理を行う、と思っておいてください。

では今現在のアドレスの引数を渡されるAPI関数を見てみましょう。
lstrcmpAと書かれていますね。
これは二つの引数を比較する、というものです。
この後の処理がちょこっとあるのですが、レジスタという概念に触れなければならなくなるので、放置します。
つまり、lstrcmpAで比較される文字列が一致すれば良いわけです。
そしてコメント列にはString2に"crk01me"、String1に入力した文字列が表示されているはずです。
その二つが一致すれば良いので、crk01meが正解となります。

いかがでしょうか。
これはまだまだ初歩中の初歩の解析ですが、このようにプログラムの解析は行われるのです。
ニーモニックとレジスタという概念さえ理解してしまえばあとは処理が面倒になるだけで、難易度自体はあがることはありません。
それでは次回はその2つ全てに触れていきますので…。


Copyright © 2008 Rapidsy. All Rights Reserved.