自動芋のアドレスの算出

最新パッチに即座に対応するために自力のRagaddress.ini更新方法。
なんかうまくいったっぽいんで忘れないためにその流れをメモ。

○逆アセンブラ兼デバッガ
OllyDbg
http://home.t-online.de/home/Ollydbg/
OllyDbgの日本語解説と日本語化パッチ
http://gamereverserz.cjb.net/

まず最初にOllyDbgというソフトで逆アセンブルします。
このソフトは解析界では有名らしいです。

最初にこれからやろうとする流れをまとめると
Ragaddress.iniにあるWeight=の部分に入れるアドレスを知りたいとする。
そこでWeightの格納されてるアドレスを割り出したい。
ゲームを思い出すと、”Weight 1123/4010”のように表示されてたので、
1123の格納されてるアドレスを割り出したいのでまずいっしょに出力されるWeightという文字を検索する。

まず、RagnarokのインストールされてるフォルダにあるRagexe.exeをOllyで開く。

画面が4分割されてます。
これがソフト全体を解析した結果です。

まず、このソフトにある全ての"文字列"というものを引っ張り出してからその中からWeightを検索します。
で、右上の部分で右クリック->Search for->All referenced text stringsを選択。

んでこういう画面。

新しくでたWindowのなかにある文字列を検索したいと思います。
今回はWeightを検索します。

一番上から検索したいのでバーを上まで持っていって一番上の行を選択し
右クリック->Search for textを選択

Weightの検索ですので、新しく出たWindowにそれを入力します。

こういう行が見つかりました。近くにLvやらHPもありますね。

0044BDB5 | PUSH Ragexe.0054F7BC         | ASCII "Weight : %3d / %3d"
  ↑          ↑                       ↑
メモリアドレス  0054F7BCにあるものをStackに入れろ 0054FCBCにある文字列

おそらくこういう意味だと思います。

次に実際に逆アセンブルした流れをたどっていって
ASCII "Weight : %3d / %3d"の%3dの部分に格納されるアドレスを
探っていきたいと思います。
今いるWindowは全体の中から文字列のみを引き出したWindowです。
はじめに表示されたものが全体を表示したものなのでそのWindowにもどります。
やりたいことは全体の流れの中で0044BDB5にあるアドレス付近の処理を見たいのです。
まず、全体の流れの方のWindowで0044BDB5の位置に移動したいと思います。

さっきの行の上にカーソルを持っていって右クリック->copy to clipboard->addressとします。

全体Windowに戻ってそのアドレスのところに移動したいと思います。
左上の部分で右クリック->Go to->Expressionとして出てきた枠にクリップボードにコピーしたアドレスを入れる。

OKを押すとその位置に移動すると思います。

今の行より少し上の部分の処理がみたいので少し上に移動します。
検索したアドレスにある少し上の部分を抜き出すと

0044BD9B . 8B0D 844B5A00 |MOV ECX,DWORD PTR DS:[5A4B84]
0044BDA1 . 83F9 01       |CMP ECX,1
0044BDA4 . 8BD9        |MOV EBX,ECX
0044BDA6 . 7F 05        |JG SHORT Ragexe.0044BDAD
0044BDA8 . BB 01000000   |MOV EBX,1
0044BDAD > 8B3D 884B5A00|MOV EDI,DWORD PTR DS:[5A4B88]
0044BDB3 . 51          |PUSH ECX
0044BDB4 . 57          |PUSH EDI
0044BDB5 . 68 BCF75400   |PUSH Ragexe.0054F7BC           |ASCII "Weight : %3d / %3d"

どうやら下から4行目のMOV EDI,DWORD PTR DS:[5A4B88] の 5A4B88 が自動芋のWeightに入れる部分のようです。現在の重量
sprintf(buf, "Weight : %3d / %3d", EDI, ECX); を展開すればこうなるようです。
とりあえずこの数字を自動芋の設定ファイルに書いとけば動きます。
こんな風にして他のアドレスも求まるようです。
HPとSPは少しめんどくさいけどよく読めば分かります。
サンプルプログラムを作りましたのでそのソースの一部→