解析講義

講師:Lear教官

Lear教官によるデータ解析講義です。adpdata.dllのデータ構造の解き明かしを軸に、質疑応答形式で進む予定です。講義録本文中のリンク(赤字の部分)をたどると、Q&A集の関連項目にジャンプできます。講義録に戻るときには、ブラウザの機能で戻ってください。みなさんも質問があれば、どんどん談話室に書込んでください。なお、Q&A集のみ読みたい方は、こちらをどうぞ。
開講日:98年7月31日
第一回目
「暗号のような英数字の羅列の中から、どうやって意味あるデータを見つけ出すのか?」

当然、今まで得てきたコンピュータの知識をフル動員するわけですが作業そのものは単純で地道な作業が多いです。
先ず最初はテキストエディタ、次はバイナリーエディタでファイルをのぞいてみます。
ADPDATA.DLLの様にこのレベルで目で見て何か判別できるキーワードがあればかなり楽です。

今回、私の場合はデータ構造の解析から入りましたが、けんこうさんは所謂「トライ&エラー」で解析していったものと思われます。つまり、直接一部の値を書き換えてゲーム上でどう反映されたかを見てみることを何度も繰り返すわけです。繰り返すと言ってもちょっとした指針を立てて反映が目に付きやすいように工夫をしたり、同じことを繰り返さないように記録を取りながらやってデータをとって行くわけです。
ある程度、データがたまると、データ間で似たような働きをするものを見いだして更にデータの内容を確定して行くわけですね。

かたやデータ構造解析から入った私は、先ず全体を見渡して同じ様なデータの繰り返しを探して全体的にどの部分が関連性ある集合かを見極めて全体の流れをつかみます。
ADPDTATA.DLLを見た人にしか分かりませんが、AD98のプログラマはデータ構造をいくつかに分割しています。
兵器名はDLLの最後の方に固めて単一構造にしております。
一挙に1兵器データ1構造体だったら楽だったのですが何かの理由で分離させていますね。

でもって、けんこうさんからもらった別角度から解析した結果を合わせると以外と簡単にデータ内容が予測できてしまうものです。
ちなみに、けんこうさんの解析データと自分のものを掛け合わせて食い違っている部分なんかを再検証したりしていたので解析作業そのものは非常に早かったです。
私の解析ミスもけんこうさんの解析ミスもお互いに補完しているわけですね。

さて、バイナリーエディタで目で見える分には基本的にはトライ&エラーで行くわけですが、そうでない場合が厄介です。
普通の人?はここで脱落します
所謂、暗号化等がほどこされているとこれを解かねばなりません。
とはいっても、どこの開発元でも1円にもならない暗号化に時間を大量につかって開発することはまずありえませんからある程度、指針が見えてくれば解け無くもありません。
基本的には下記の3つの内のどれかまたはその組み合せが多いです。
  1. ただの圧縮データ。
  2. せいぜいバイト単位でXORを被せているだけ。
  3. ついでにチェックサムをとって改造データかどうかの判別チェックぐらいはプログラムに仕込んでおく。
1.は適当な圧縮ツールで圧縮してみて、圧縮効率が悪ければ圧縮データであるとほぼ予測されます。lhaが採用している圧縮論理が手軽で良く使われています。
2.はトライ&エラーで割り出します。手でやるのでは無くてツールをこさえて片っ端から試して暗号化前のデータが出てくれば文字データとかが出てきて分かります。
3.はチェックサムデータを探し出してツールでチェックサムデータを作ってやってチェックプログラムを回避します。

またも専門用語が大量に出てきたのでその都度「これはなんですか?」と聞いて下さい。
説明が詳細になればなるほど分かりにくい専門用語が出てくるでしょう。
例えば16進数は理解できますか?
これが分からないと話が具体化して例題を上げたりしたときに一発で引っ掛かります。
ってことで分からなければ16進数の説明しないとね。
その内、1バイトってどんな単位とか、構造体って良くわかいんないってのが来るのかな?と戦々恐々です。

先は長いぜ・・・続けばね。


開講日:98年8月3日
第二回目
第一回目の補講

「解析講義:第1回補足」
解析方法として非常に単純な「トライ&エラー」は軽く説明しました が、もう一つ代表的な方法があります。
ADPDATA.DLLの解析では使えませんがアドベンチャやRPGゲームの様に現状の進み具合を記録しているファイルを解析する方法として差分解析法(っと勝手に銘々)があります。
記録ファイルを探しだし、適当な別ファイル名で保存して置いて、適当に進んだところで元のファイルと比較して変更点を探し出して変更されるフラグにアタリを付けると言うものです。
後は変更された周辺に他のフラグも固まっているだろう適当に予測してトライ&エラーで実験すればあっと言う間に解析完了と言う感じです。
当然、暗号化されていればそっちを先に解決しなければなりません。


開講日:98年8月6日
第三回目
「解析にはどんなツールが必要なのか」

>Lear教官殿
 さっそくの補講ありがとうございました。でも、無理はなさらないでくださいね。
 第二回目の講義で私が理解したことは、解析には「膨大な時間がかかりそう」&
「豊富な経験が必要そう」です。これは間違ってませんよね? Lear教官は「まず
 解析する範囲を絞り込む」とおっしゃってますが、どこが自分の必要とするデータ
 であるのか、その見当をつけるだけで一苦労のような気がします
たしかに、解析に一番重要なものは「努力と根性、忍耐力」です。
ただし、その先には「欲望と経験」が控えています。
解析して「・・・してやる」と言った欲があればこそ解析も進むってもんでしょう。
ろくにC言語も知らないひとが解析こうじてプログラマになるときは強者になりやすいです。
C言語の場合、後になって「こんな便利な関数が実は標準であったのね」みたいに標準で用意されているものすら知らずに自分で作ってしまうことは珍しくありませんから。
そして、やった努力が自分でハッキリと認識できるので病み付きになりやすいです。
強者にならない訳はありませんね。
ある意味では根っからの根性無しにはできません。

他人が用意したツールのみで解析する方は、ある意味で不幸かもしれません。
なにせ、「経験」ってものがあっと言う間に行き詰るからです。
つまり、そのツールの範囲外には絶対に到達しませんから。
得られる経験はかなり限定されます。

解析に必要なツールに、基本的に必要な要素を考えましょう。
      A)バイナリーでは人間には読めませんのでバイナリーデータを数字に
        変換して読める様にするためのツールが先ず必要です。
        いわゆる、dump(ダンプ)ツールと言われるのがこれですね。

      B)dumpデータを更に読みやすくするために数値データを文字デー
        タと仮定した場合、それを文字として変換してくれるツールがある
        と便利です。

      C)バイナリーデータを低レベルで簡単に加工でいるエディターがある
        と便利です。

      D)2つのファイルの相違を抜き出せる比較ツールがあると良いでしょ
        う。
        これはUnixやDOSのコマンドでも存在します。

      E)思いついたキーワードをデータの中から検索してくれるツールがあ
        ると便利です。
        これは、アリ物のツールで有ったかな?
上記ABC、3要素を合わせ持つのが日本語表示可能なバイナリーエディターです。
ただし、日本語表示可能なバイナリーエディターは必ずしも万能ではありません。日本語とは言いましたが日本語文字コードは複数あります。
JIS、SJIS、EUC、UNICODE、半角カナ文字、機種依存文字。
全コードを表示してくれる日本語表示可能なバイナリーエディタなんてたぶん無いでしょう。
また、2バイト文字と1バイト文字が混在すると表示がおかしくなるツールも珍しくありません。
ツールだけに頼る解析は解析限界もしれています。
したがって解析をどこまで行うかによってはこれでは対処できないこともあります。
また、解析にかかる時間も、ツールだけに頼るとムダが多くなることもあります。
この限界を超える解析をしたければ自分で必要なツールをそろえるしかありません
一番の近道はC言語等をおぼえて、必要なデータは自分で抜き出せてたり、自分の思うように変換できたりできるように自分でツールを作ってしまう事です。
急がば回れですね。
別に、アリ物のツールを使うなとは言ってません。
アリ物のツールの限界を越える方法は自分でツールを作るしか無いって事です。
少数のデータ変更だけならバイナリーエディタで事は済みますが、インテリジェントに膨大な量のデータを編集したい場合はエディターでちくちく変えていくことはかなりの苦痛です。
また、タイプミスで全ての努力が無になることは珍しくも無いでしょうし、それを承知で行うことはかなりの忍耐力の消費をともないます。
それと比較すれば、C言語等で簡単な専用のツールを作り出す方が明らかに寛容です。
バイナリーエディタによるデータの書換えはあくまでも低レベルであることを認識していなければなりません。


開講日:98年8月7日
第四回目
「どうやって必要なデータを抽出するのか」

>バイナリエディタからカットして、テキストエディタにペーストし、整
 形するなんてことではあるわけないですよね。一体どのような方法で、
 あの膨大な兵器データをお作りになったのでしょう。
この回答は簡単です。
半自動的にHTMLファイルを作るところまで行うツールを作りました。
流石に、エディタでカット&ペーストだと不正確で完成もやばそうなのは直ぐに推論できますから力技は即放棄しました。
使用言語はCでOSはUnix、WindowsでやるとWindowの設定とかやんないと表示すらできないのでパス。
DOS上のCは今は無いので不可。
男はだまってGNUでしょう。(ウソ)
全てを1回でかたずけることもできますが作業は2回に別けました。
  1. DLLから兵器名を引っぱり出してそれだけのデータベース(テキスト)を作成。
  2. DLLと名前データベースからデータを引き出してHTMLを作る。
1.の段階ではまだ日本語兵器名とかも残ってたのですが、HTMLにもあるように機種依存文字とか日本語兵器名が無い兵器の対処が大変なのでバッサリ削除です。
兵器名は逆さに登録されているので順序は引っ繰り返しました。
兵器名のズレは力技で治しました。
これは、この方が速いと判断したためです。
だから、DLLが変ると使えません。

2.で問題なのがSJISコード。
通常、SJISではソ連の「ソ」とか図表の「表」の時がfprintf関数では書けません。
理由はSJIS、2バイト文字の2バイト目が0x5Cでこれは1バイト文字の「\」=「¥」と重なるのですがこの文字はprintf系関数の制御文字とバッティングするからです。
『SJISの危ない文字の羅列一覧』
      ― ソ Ы 噂 浬 欺 圭 構
      蚕 十 申 曾 箪 貼 能 表
      暴 予 禄 兔 喀 媾 彌 拿
      杤 歃 濬 畚 秉 綵 臀 藹
      觸 軆 鐔 饅 鷭
全てEUCとかで書けば良いのですが、DLLの中身はSJISだったので文字の比較はSJISにしなければなりません。
つまり、プログラム内に文字コードが複数存在したりします。
これでは間抜けなので文字コード変換関数なり、外部コマンドなりを使う予定でしたが、完成速度優先で、データやプログラムをSJIS系とEUC系に分離して対処。
こう書くと、カッコイイプログラム書いてる見たいですがソースは・・・・ダサイな。
文字にだまされては行けません。
C言語を書ける人なら、誰でも書けるレベルの簡単なプログラムです。

SiteTop
(c) ロドリゲス学級OB会 All rights reserved. 1997-2003Last Modified 2003/11/05 02:48:07