新着順表示

Re:【改造依頼】 みらくる☆パーティ
まるねこ / 2012/01/23/Mon/08:10 (No.13384)

  ステータスの基点の見つけ方を少し書いてみます。デッバガはollydbgを使用しています。
なお、実際にollyを使いながらでないとわからない箇所があるかもしれません。

まず、現在HPに書き込みブレークポイントを仕掛けて攻撃を受けブレークさせると次のようになります。

001F9D1C  |> \66:895E 0C    MOV WORD PTR DS:[ESI+0C],BX
EBX=0000000D  ESI=07E413D0
[ESI+0C]が現在HPのアドレスで、そこにEBXの値をWORDで転送

つまりESIを追いかければ良いので、ESIに値が格納される直前の処理を探します。
とりあえずジャンプ命令等は無視して上の方を見ると、次のような箇所があります。

001F9CF1  |> \8B75 F4       MOV ESI,DWORD PTR SS:[EBP-0C]

ここが怪しそうですので、実行ブレークポイントを仕掛けてみます。
ブレークさせる前に、以前に仕掛けたものは無効にしておくのを忘れないで下さい。

ブレークした後ollyのcpuウィンドウを見ると、Stack [0824F850]=07E413D0と表示されています。
初めにブレークさせた時のESIは07E413D0だったので、ここで値が格納されたわけです。

次も同様に、[EBP-0C]に07E413D0が書き込まれる処理を探すことになります。
とにかく上の方に遡ってみて下さい。すると、このような命令があります。

001F9B2B  |.  8945 F4       MOV DWORD PTR SS:[EBP-0C],EAX

ここにブレークポイントを仕掛けた時のレジスタは
EAX=07E413D0  EBP=0824F85C
となっており、ここで[EBP-0C]に07E413D0と書き込まれていることがわかります。次はEAXを追いかけます。

001F9B24  |.  8D83 C0010000 LEA EAX,[EBX+1C0]
EBX=07E41210

LEAは第1オペランドに第2オペランドの演算結果を転送する命令ですので、07E41210+1C0=07E413D0をEAXに転送しています。
つまり、現在HPのアドレスは[07E41210+1C0+0C]という演算によって算出されているわけです。

さて、本来なら次はEBXを追いかけることになるのですが、ここから先はかなり面倒になるので、少し方法を変えてみることにします。
要は07E41210へのポインタを探せば良いわけですので、[07E41210]上にある値に読み込みブレークポイントを仕掛けてみます。

0024D8F6  |> /8B06          |/MOV EAX,DWORD PTR DS:[ESI]
ESI=07E41210

処理を追いかけます。

0024D8F0  |> /8B37          /MOV ESI,DWORD PTR DS:[EDI]
EDI=0C9B2E50  [0C9B2E50=07E41210]

0024D8DF      CC               INT3
0024D8E0  /$  55              PUSH EBP
0024D8E1  |.  8BEC           MOV EBP,ESP
0024D8E3  |.  53               PUSH EBX
0024D8E4  |.  56               PUSH ESI
0024D8E5  |.  57               PUSH EDI
0024D8E6  |.  8D78 28       LEA EDI,[EAX+28] // BP
EAX=0C9B2E28  0C9B2E28+28=0C9B2E50

次はEAXですが、一見これ以上遡れないように見えます。そんな時は先頭の処理をクリックして選択してみて下さい。

0024D8E0  /$  55            PUSH EBP
Local call from 23F94F

これはアドレス23F94FからCALL命令で呼び出されたことを示しています。
Local call from 23F94Fの文字をダブルクリックすると、別ウィンドウが開きますので、選択してみて下さい。
すると、移動した先に次のような処理があります。

0023F946  |> \A1 4C4C4700   MOV EAX,DWORD PTR DS:[474C4C]

アドレス[474C4C]はASLRを考慮すると[(MName::LotusLand4.exe)+0x2B4C4C]となりますので、ここで基点が判明したことになります。

判明した現在HPのアドレスは[:[:(MName::LotusLand4.exe)+0x2B4C4C:]+0x28:]+0x1CCとなるわけですが、自分が作成したSSGとは若干異なっています。
実は、プログラムの処理的には、先頭のキャラが[:[:(MName::LotusLand4.exe)+0x2B4C4C:]+0x28:]+0x1CC、2番目が[:[:[:(MName::LotusLand4.exe)+0x2B4C4C:]+0x28:]+0xA4:]+0x1CC、3番目が[:[:[:[:(MName::LotusLand4.exe)+0x2B4C4C:]+0x28:]+0xA4:]+0xA4:]+0x1CC
と、このようになっているのですが、これをSSGにするなら
_[!R$Val, [: !][:[:(MName::LotusLand4.exe)+0x2B4C4C:]+0x28:][!R$Val, +0xA4:] !]+0x1CC
と、ワードリピート機能を使用することになるのですが、どうもこの機能が正常に動作していないように感じます。

SSGのマニュアルによると、[!R($Val+1), [: !] 0x710000 [!R($Val+1), :] !]
この様に記述すると[:0x710000:]→[:[:0x710000:]:]→[:[:[:0x710000:]:]:]と変化するとなっているのですが、実際には
[:0x710000:]→[:[:[:0x710000:]:]:]→[:[:[:[:[:[:0x710000:]:]:]:]:]:]と変化してしまいます。
つまり、2回目は[:0x710000:]に$Val+1分の文字列が出力され、3回目は[:[:[:0x710000:]:]:]に$Val+1分の文字列が出力されてしまいます。

この様な理由からワードリピートを使用するのは避けて、別のアプローチをすることにしています。
今回は[:[:(MName::LotusLand4.exe)+0x2B4C4C:]+0x24:]+0x10からユニットが順番に並んでいるのを見つけたので、SSGにはこちらで記述しています。

わかりにくい説明ですみません…。
 

Re:【改造依頼】花咲く乙女と恋の魔導書
MAKI / 2012/01/23/Mon/03:50 (No.13383)

  Ver1.01eに対応して頂けると助かります。
ver1.01dへのバージョンアップを持っていないもので、
宜しくお願い致します。
 

Re:【改造依頼】 みらくる☆パーティ
カレー大使 / 2012/01/23/Mon/01:59 (No.13382)

  これは良いスレ

上のを参考にHPの現在値をサーチしてみたけど起点見つけるの難しいね。

HP現在値のアドレスが09AE93DCだったのでここにブレークした結果は、
EAX=0000000F EBX=0000000E ECX=0000000F EDX=046C9780
ESI=09AE93D0 EDI=09AE9210 ESP=048DFBAC EBP=048DFCF4
EIP=00439D20

00439D1C 66 89 5E 0C mov [esi+0C],bx <<ここでブレークしてる様子

ESIに+CしたアドレスにBX(2BYTE=1WORDの数値)を書き込む命令。
ESI=09AE93D0に+Cすると09AE93DCという事でHP現在値のアドレスと一致。

00439D1Cを逆アセンブルしてESIを辿るべきなのかわからず、ここが壁なんだと感じましたw
手当たり次第頑張ってみたものの0x2B4C4Cの起点には辿りつけず心がポキッ
明日は晴れるかな。。。
 

Re:東方幻想魔録
ns / 2012/01/23/Mon/01:19 (No.13381)

  ver1.10でドロップのコードを使用したらドロップはしたのですが、そのアイテムがアイテム欄に追加されませんでした。  

Re:【改造依頼】 みらくる☆パーティ
こたつ / 2012/01/22/Sun/12:20 (No.13380)

  >>でかさん
かゆい所に手が届いた説明ですごく分かり易かったです!
本当にありがとうございます。

ASLRを理解してない事もあって余計なポインタを探そうとしてたとはお恥ずかしい限りでした・・・

なるほどVISTAやWin7ではASLRが邪魔して解析に手間がかかるんですね。
でかさんのお陰で得られた情報が多かったです。
きっと他の方にもこの一連のやりとりは役立つと思います。
有難うございました。
 

Re:【改造依頼】 みらくる☆パーティ
でか / 2012/01/22/Sun/11:57 (No.13379)

  >>こたつさん
(MName::LotusLand4.exe)の使い方はそれで合っています。
XPであればASLRは機能しないので、さほど気にすることはありません。
Windows Vistaや7ではASLRが有効=起動毎にモジュール開始アドレスが変動するため、このような手間がかかります。

ASLRが有効かどうかは、うさみみハリケーンについてくるUMPE.exeで簡単に調べられます。
1.「PEエディタを起動して編集」を選択
2.実行ファイルのオープンから目的のファイルを選択
3.ヘッダ→フラグと開き、DYNAMIC_BASEのチェックが入っていればASLRが有効
もっとスマートな方法もあるかもしれませんが、個人的にこれが楽でした。

ASLRが有効かどうか気にせず、XPであればサーチ結果から00400000を引き、_(MName::モジュール名.拡張子)+0xXXXXXXXXとすることで他の環境でも使えるようになります。

今後Windows 7などに移行する場合、UMPE.exeを用い、DYNAMIC_BASEをオフ、RELOCS_STRIPPEDをオンにして書き込み実行し、ASLRを無効にして解析してみてください。
モジュール開始アドレスが固定のため、何も考えずに00400000を減算してMName::命令を使用したSSGを作ることが出来ます。

注意点として、命令をexeファイルではなく、dllファイルで行っている場合などあります。
その場合は00400000を減算ではないため、どこに命令があるかチェックを忘れないようにしてください。
逆アセンブルを行う際にどれを選択したか、ということだけですが。

長文失礼しました
 

Re:【改造依頼】 みらくる☆パーティ
こたつ / 2012/01/22/Sun/11:14 (No.13378)

  >>でかさん
丁寧に教えてくださり感謝です><
最初に、でかさんからの質問についてですが当方もollydbgでブレイクしています・・・
同じくうさみみではブレイク出来ませんでしたので。
そこは書き漏らしました・・・すみません。
その後うさみみを使って調べていたという意味だったのです。

ここ
MOV ECX,[6B49F0]
ECXにアドレスを入れてるなーと思ったのと、0x2B49F0と似てるのが気になっていました。
ASLRの事とモジュール開始アドレスはこの事を意味していたのですね。
以前別のスレで、でかさんがこの解説をしていたのをようやく今回理解出来ました。ような気がします・・・

>>こたつさんのサーチ環境はWindows Vistaか7以外の環境だったか、ASLRを無効にしていたのではないでしょうか。
その通りです!WinXPの32bit環境です。

そこでASLRを無効にしなくてもSpoilerALが使えるように(MName::LotusLand4.exe)としてある、という認識で合ってますか?
006B49F0-00400000=002B49F0 ですよね?

あとASLRが有効になってるかどうかというのは、どうやって判断するものなのでしょうか?
素人な質問ばかりで申し訳ありません。
 

Re:【改造依頼】 みらくる☆パーティ
でか / 2012/01/22/Sun/10:52 (No.13377)

  >>こたつさん
横から失礼します。うさみみでブレークポイントが正常に動作するんですね
うちではなぜか無反応だったので、ollydbgを使ってやっていました。

あと、そこまでできたらもう起点となるポインタは見つかっています。

MOV ECX,[6B49F0]
MOV ECX,[ECX+20]
MOV EAX,[ECX+1C]
まででお金のアドレス決定とお金の代入

ADD EAX,ESI
でお金の加算

CMP EAX,3B9AC9FF
お金の最大値を超えていないか判定

JLE SHORT 004E1182
お金の最大値を超えていない場合の処理

MOV EAX,3B9AC9FF
最大値を超えた場合の処理

となるので、0x6B49F0が起点となります。
特に今回のゲームはASLRが有効なため、他の環境でも使えるよう、そこからモジュール開始アドレスを減算して、「モジュール開始アドレス+0x2B49F0」が起点となります。
MOV ECX,[ECX+20]
MOV EAX,[ECX+1C]
で最終的なアドレスが決定されているため、SSGでの表記は
[:[:(MName::LotusLand4.exe)+0x2B49F0:]+0x20:]+0x1C
となっています。

ちなみに、起点となるアドレスをサーチする際は書き込みブレークポイントでうまくいかない場合でも、読み込みでブレークさせると簡単に見つかる事があります。

こたつさんのサーチ環境はWindows Vistaや7以外の環境か、ASLRを無効にしていたのではないでしょうか。
モジュール開始アドレスは0x400000だったかと思います。
モジュール開始アドレスはうさみみで逆アセンブルする際に、選択するプロセス名の横に書いてあります。
たとえば、00400000(00369000) LotusLand4.exeとなっている場合は00400000がモジュール開始アドレスです。


あと、最後に私が知りたい事があるので質問させてください。
うさみみでブレークポイントの設置がうまくいかないゲームがときどきあるので、何か設定を変えていれば教えていただけないでしょうか。
私の環境はWindows 7 x86で、うさみみは管理者モードで実行しています。

私も知りたい事があったので、横から口を挟んでしまいました。
申し訳ありません。
 

Re:【改造依頼】 みらくる☆パーティ
こたつ / 2012/01/22/Sun/08:06 (No.13376)

  すみません解析のことで質問なのですが・・・教えていただけないでしょうか。
うさみみを使っています。

例えば、まるねこさんのようなお金のSSGにする場合、解析はどのように追っているのかわからなくて。
一応ブレイクポイントを見つけるまでは出来ています。

最初に検索したお金のアドレスが043D7FFC
ブレイクポイントがmov [ecx+1C],eaxでお金は+186=BA増えた状態です。

EAX=3B9ABDAC
EBX=0479EC70
ECX=043D7FE0
EDX=00658A1C
ESI=000000BA
EDI=0479D4E0
ESP=048DFB60
EBP=048DFCBC
EIP=004E1188

その後逆アセンブルしてブレイクポイントから上を見ていき、
ECXを追ってみると

004E1147 E8 74B5F3FF CALL 0041C6C0
004E114C 8B7D 10 MOV EDI,[EBP+10]
004E114F 8B17 MOV EDX,[EDI]
004E1151 8B42 7C MOV EAX,[EDX+7C]
004E1154 8BCF MOV ECX,EDI
004E1156 FFD0 CALL EAX
004E1158 833D F0496B00 00 CMP DWORD PTR [6B49F0],0 <<ここと
004E115F 8BF0 MOV ESI,EAX
004E1161 75 05 JNZ SHORT 004E1168
004E1163 E8 8812F2FF CALL 004023F0
004E1168 8B0D F0496B00 MOV ECX,[6B49F0] <<ここと
004E116E 8B49 20 MOV ECX,[ECX+20] <<ここ
004E1171 8B41 1C MOV EAX,[ECX+1C]
004E1174 03C6 ADD EAX,ESI
004E1176 3D FFC99A3B CMP EAX,3B9AC9FF
004E117B 7E 05 JLE SHORT 004E1182
004E117D B8 FFC99A3B MOV EAX,3B9AC9FF

「ここ」と記した3箇所が気になったのですが、
OLDGAMERさんの記事を読みながらポインタを探します。

ECX=043D7FE0をバイト列E07F3D04に並び替えて、バイト列検索すると
003E5378 E0 7F LOOPDNE SHORT 003E53F9
050EF9A8
050EFDBC
の3件ヒットしました。
ここで手詰まり状態です・・・
この後どこを見て追っていけばいいのでしょうか?
ヒットしたアドレスのバイト列を見るとあるのですが、それがよくわかりません。
すみません・・・よろしくお願いします。
 

Re:サクラ大戦 Premium Edition 1・2
hf / 2012/01/22/Sun/03:36 (No.13375)

  サクラ大戦1のSSGお願いしたいんですが
難しいんですかね?
 

Re:【改造依頼】 みらくる☆パーティ
z / 2012/01/21/Sat/20:26 (No.13373)

  あれ、なんか引用ミスってる;
まるねこさんSSGありがとうございました
34さん修正感謝です、レス数増やしちゃってすみません;
 

Re:【改造依頼】 みらくる☆パーティ
z / 2012/01/21/Sat/20:23 (No.13372)

  >34修正ありがとうございまし
付け加えるなら金額の部分、もう三ケタ足さないと金額が最大にならないと思います
 [subject]お金'+'['+'_mem,_[\:[\: (MName\:\:LotusLand4.exe)+0x2B49F0\:]+0x20\:]+0x1C,4,num,−,%d'+']/現在値 /:calc,_[:[:(MName::LotusLand4.exe)+0x2B49F0:]+0x20:]+0x1C,0,999999999,unsigned
こっちはこれでいけました、不都合があったらすみません
 

Re:【改造依頼】 みらくる☆パーティ
でか / 2012/01/21/Sat/19:37 (No.13371)

  >>まるねこさん
ありがとうございます!

まるねこさんのSSGの記述に1か所不都合があったため、報告です。

[subject]お金'+'['+'_mem,_[\:[\:(MName\:\:LotusLand4.exe)+0x2B49F0\:]+0x20\:]+0x1C,4,num,−,%d'+']/現在値/:calc,_[:[:(MName::LotusLand4.exe)+0x2B2690:]+0x20:]+0x1C,0,999999,unsigned

となっているところを

[subject]お金'+'['+'_mem,_[\:[\:(MName\:\:LotusLand4.exe)+0x2B49F0\:]+0x20\:]+0x1C,4,num,−,%d'+']/現在値/:calc,_[:[:(MName::LotusLand4.exe)+0x2B49F0:]+0x20:]+0x1C,0,999999,unsigned

と直さないと、お金の変更ができませんでした。
 

Re:東方幻想魔録
migihidari / 2012/01/21/Sat/17:20 (No.13370)

  >>48
なるほど、ありがとうございました。
 

Re:【改造依頼】 みらくる☆パーティ
t / 2012/01/21/Sat/11:38 (No.13366)

  >>22
ssg作成お疲れ様です。

ファイルに書いてあったASLR無効の手順を試したのですが
「現在の実行中のwindowsのバージョンとは互換性がありません。」
と表示されexeが開けなくなってしまいました。
当方はwindows7の64bitなのですが他に何か手順が必要なのでしょうか?
初心者丸出しの質問ですみません...
 


- Web Topics ver 1.26 -