-- 2009-09-08 (火) 21:52
Perfect Darkとは
Perfect darkはWindowsで動作する匿名ファイル共有ソフトである。会長と名乗る匿名の作者によって開発中であり、最終的にはWinnyやShareの後継となりうるものを目指している。PDと略されることも多い。 現在、公開テスト中である。
http://ja.wikipedia.org/wiki/Perfect_Dark から引用
このソフトウェアにはファイル共有機能だけでなくフローやボードといった匿 名性に優れた簡易掲示板機能がある訳だが、たとえフローやボードを使う目的で Perfect Darkを導入するにしても、Unity(キャッシュ)フォルダとして最低でもH DDの空き容量が40GBは必要である。
というわけで、実行ファイルの改変によってこの40GB制限を解除しようという のが今回の解析の目的である。 なお、パッチの違法目的での使用はご遠慮ください。
今回の解析で使用するソフトウェアは以下の通りです。
- OllyDbg
- IDA Pro 4.9 Freeware
- うさみみハリケーン
- Perfect Dark 1.02(ターゲット)
それではテンポ良く解析していきましょう。
- Unityサイズを保持している変数のアドレスを探そう。
まずはOllyDbgでperfect dark.exeを開き、実行させます。 次にうさみみハリケーンを実行し、実行中のperfect dark.exeにアタッチします。Vistaの場合はどちらのソフトウェアも管理者権限で実行しないと正常な動作をしないので注意してください。
そしてメニューバーの「検索」→「メモリ範囲を指定して検索」を押します。 通常検索という項目があるので「数値」の右にあるテキストボックスに今現在の Unityのサイズを入力し、「通常検索実行」というボタンを押すと右上のリストボ ックスに検索結果が表示されます。
このままでは候補が多すぎるのでPerfect Darkを操作してUnityのサイズを変更 し、再びその値をテキストボックスに入力して検索、というのを繰り返して候補 が一つになるまで繰り返します。
一つだけ残ったのが今現在のUnityの大きさを保持しているアドレスです。メモ してください。 それではうさみみハリケーンを終了して、次にOllyDbgの方で作業を続けます。
- Unityサイズを保持している変数にアクセスしている箇所を探そう。
OllyDbgの左下のDump画面内で右クリック→「移動」→「アドレス移動」を押し て先ほどメモしたアドレスを入力します。すると今現在のUnityサイズの値が16進 数で表示されているのが確認できると思います。
次に、ここにアクセスしている箇所を探すためにブレークポイントをセットし ます。値の上で右クリック→「ブレークポイント」→「HWブレークポイント書き 込み」→「byte」を押すとハードウェアブレークポイントがセットされます。
そしてPerfect Darkの方で再びUnityサイズを変更し、Okを押すと以下の場所で ブレークします。
0040DF5B . E8 90E4FFFF CALL perfect_.0040C3F0
しかし、ハードウェアブレークポイントは一つ行き過ぎるという特徴があるの で、実際には以下の命令が先ほどのアドレスにアクセスしています。
0040DF55 . 8981 78020000 MOV DWORD PTR DS:[ECX+278],EAX
とりあえずハードウェアブレークポイントを解除して0×0040DF55
にブレークポ
イントをセットしてもう一度さっきと同様にUnityサイズを変更すると0×0040DF55
でブレークします。このときのEAXの値が変更する値で、DS:[ECX+278]
が変更前の値であるのが確認できると思います。つまり、このEAXをチェックしている箇所を
探すことで40GB制限を回避できるわけです。
と言うわけで、その少し上のコードを見てみましょう。MessageBoxを呼び出し ている箇所があるのかすぐに見つかると思います。これが設定した値が40GB未満 の場合にエラーとして表示されるものだと言うことは容易に想像がつくでしょう。 ということはこの処理より前の比較でチェックしているというのも分かります。 それが以下の命令です。
0040DEE6 . 3BC6 CMP EAX,ESI
というわけで、その下の項目を以下のように変更します。
0040DEE8 . /EB 5E JMP SHORT perfect_.0040DF48
ブレークポイントを外してから再開させて、Unityサイズを40GB以下にしてもエ ラーが出ずに値が更新されているのが確認できるでしょう。
最後に変更を実行ファイルに書き込み、解析終了です。お疲れ様でした。とい いたいんですがね。
というわけで、変更した実行ファイルを実行してもすぐに終了します。つまり 改変チェックが存在するという事です。
それではサクっと回避しちゃいましょう。 まずはIDA Proでperfect dark.exeを開きます。分析が終了するまで暫く待ちましょう。実行してもウインドウが表示されないので、そこらあたりから攻めていきます。Importウインドウの中のCreateWindowEXの項目をダブルクリックをする と
idata:004CE3D8 …
というところに移動します。CreateWindowEXのところで右クリック→「jump to xref to operand」を押すと多くの項目が表示されますが、これの一番上をダブ ルクリックします。周りのコードを見るとここがメインのウインドウを作成して いる箇所であるのが確認できると思います。
それでは次にメニューバー「View」→「graph」→「Flow chart」を押します。 すると今の箇所を含めたフローチャートが表示されます。ここからが面倒なので すが、改変前と改変後の実行ファイルをこのフローチャートを見ながらデバッグ していきます。
そして、どこで違いが生じるかをチェックします。結果は以下の箇所で、改変 後の場合は、ジャンプしてしまいます。
text:0040A1B0 jnz loc_40A3FB
というわけで、試しにこれを飛ばないように変更して実行すると、なぜかソフ トが落ちます。 しょうがないのでその前の
.text:0040A1A6 call sub_40AA20
この中もチェックすることにします。ここでもフローチャートを表示させてか ら、改変前と改変後の実行ファイルの違いをチェックしていきます。結果は以下 の箇所で、改変後の場合は、ジャンプしません。
text:0040AB6A jz short loc_40ABCA
というわけで、その前の
.text:0040AB63 call sub_4628B0
この中をさらに調べます。CreateFileWやReadFile関数などを使って改変チェック をしているのが分かると思います。 というわけで以下のように変更することで改変チェックを回避します。
.text:0040AB68 cmp eax, eax
すると改変後の実行ファイルでも実行できるようになりました。 お疲れ様でした。といいたいんですがね。
実行してもらったら分かるんですが、起動時のUnityサイズは40GBで変更すると 40GB以下になります。これはちょっと…って感じです。
というわけで適当なところにUnityサイズを設定するコードを作成します。取り 敢えず、改変チェック後に入れてみました。まずは以下のように変更して、空い てる場所までジャンプさせます。
0040AD6A . /E9 BC120C00 JMP perfect_.004CC02B
そして、変更によってつぶれた命令とUnityサイズを設定するコードを書き加え ます。取り敢えず、設定するサイズは7GBにしてみました。
004CC02B 64:890D 0000000>MOV DWORD PTR FS:[0],ECX
004CC032 BB 07000000 MOV EBX,7
004CC037 8B0D F8C25000 MOV ECX,DWORD PTR DS:[50C2F8]
004CC03D 8999 78020000 MOV DWORD PTR DS:[ECX+278],EBX
004CC043 ^ E9 29EDF3FF JMP perfect_.0040AD71
実行させると確かにサイズが7GBになっているのが確認できるでしょう。後はこ れを外部から変更するソフトを作れば終わりです。