関数が呼ばれたときに呼び出し元アドレスを出力する補助プログラム

ktxadさんによって戦闘中の乱数列が解析されましたね!

僕も以前に戦闘中のメモリダンプを比較してseedっぽく変化してるところを探してそこを書き換えるとかしてみたけどなぜかうまくいかなかったんだよなぁ。今試したらうまくいったけれど
戦闘のプログラムは膨大でしょうし全ての消費契機を網羅するのは難しいでしょうけど、ダメージ量などから初期seedを特定して消費を調整することによる物拾い乱数調整とかできると面白そうですね!

一方僕はDeSmuMEのプロセスメモリにアクセスして、ある関数が呼ばれたときにその呼び出し元アドレスを出力する補助プログラムなど作っておりました。

試しに戦闘中の乱数ルーチンの呼び出し元を調べてみました。(コメントは後で自分で追加しています)
再戦カーネル(Lv36)、物拾いを1匹つれて、先頭はレックウザ

seed          next seed   r14
0x6f0c0253 -> 0xd004a7ca, 0x0225059f ; 爪判定用の乱数保存
0xd004a7ca -> 0x0d575d75, 0x0225059f ; ditto
0x0d575d75 -> 0x4a2ad144, 0x0225059f ; ditto
0x4a2ad144 -> 0xbe963267, 0x0225059f ; ditto
; ゆけっ!レックウザ!
0xbe963267 -> 0x0bf9384e, 0x02257b4f
0x0bf9384e -> 0x62991da9, 0x02257b4f
0x62991da9 -> 0x7bf17f68, 0x0221b3d7
0x7bf17f68 -> 0x4d154fbb, 0x0221b3d7
0x4d154fbb -> 0x76004d12, 0x0221b3d7
0x76004d12 -> 0x8388ad1d, 0x0221b3d7
0x8388ad1d -> 0xe75eebcc, 0x0221b553
; りゅうのはどう選択
0xe75eebcc -> 0x9b0aee4f, 0x02248965 ; 爪判定用の乱数保存
0x9b0aee4f -> 0xb85dea16, 0x02248965 ; ditto
0xb85dea16 -> 0xc053bfd1, 0x02248965 ; ditto
0xc053bfd1 -> 0xd4c0ba70, 0x02248965 ; ditto
0xd4c0ba70 -> 0xf17de223, 0x02257251 ; 急所判定
0xf17de223 -> 0xf792535a, 0x02257183 ; ダメージ乱数
0xf792535a -> 0x504f49c5, 0x0224b51d ; 命中判定
0x504f49c5 -> 0x6d9acf54, 0x02257b4f
; カーネルとのしょうぶにかった!
; しょうきんとして7200円てにいれた!
0x6d9acf54 -> 0x850e3f37, 0x0224365b ; ものひろい判定

ソースコードはこちら。

プロセスメモリのアドレスとか決めうちになってますが... (そういやWindowsってメモリアドレスのランダム化とかされてるはずじゃなかったっけ。僕の環境じゃ再起動してみてもアドレス変わりませんでした)

戦闘の乱数ルーチンは戦闘に入る前にはロードされていないっぽく、ロードされてから最初の乱数ルーチン呼び出しまでのどこかのタイミングで停止させてから実行する必要があります。

追記 (2010-04-14T07:22:07+09:00)

本当にここがこれの判定をしている場所だろうかということを改造コードを作って確認してみました。

; 常に急所判定
12257254 00002100 ; mov r1, #0x00
12257256 00000000 ; nop
; 常にダメージが最大乱数(100%)
12257190 00002064 ; mov r0, #0x64
; 常にダメージが0% (=1)
12257190 00002000 ; mov r0, #0x00
; 常に攻撃が外れる
1224B526 00000000 ; nop
; 常に攻撃が命中
1224B526 0000E004 ; b 0224B532
; 常にツメ発動
; 乱数ルーチンを呼んでいるコードを置き換えている点に注意
1225059A 00002000 ; mov r0, #0x00
1225059A 00000000 ; nop
12248960 00002000 ; mov r0, #0x00
12248962 00000000 ; nop

↓4/22追記

; 常に指を振るで出る技がXXYY
1223FE00 000025XX ; mov r5, #0xXX
1223FE02 0000022d ; lsl r5, r5, 8
1223FE04 000035YY ; add r5, #0xYY
; 常にものひろい発動
12243662 00000000 ; nop
; 常にものひろいで拾うアイテムがxx(0x00〜0x63)
12243670 000025XX ; mov r5, #0xXX
筆者: oupo (連絡先: oupo.nejiki@gmail.com)