Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
いかにして乱数を解析するか
oupo
2014 / 9
2014 / 12 追記部分は青で示しました
自己紹介
● 第4世代でいろいろ
– バトルファクトリーの解析
– くじ番号から裏IDを特定するツール
– バトルタワーの解析
– ものひろいの乱数調整
●
線形合同法についてのいくつかの記事
● ほか:某超次元サッカーRPGの解析
●
コンピュータプログラムの用語をたくさん使います
が、分からない用語があってもあまり気にせずに聞
いてもらえれば。
● 質問やツッコミがあればお気軽に
お気軽にね!
DeSmuME
DeSmuME
● DSのエミュレータ
– DSのゲームがPCで動かせる
実践:戦闘乱数のトレース
実践:戦闘乱数のトレース
戦闘乱数の関数が呼
ばれたときにその呼び
出し元を出力するLua
スクリプトを実践しまし
た
実践:メモリサーチ
実践:メモリサーチ
解析で最初の難しいと
ころは目的のメモリア
ドレスを見つけること
です。
それを達成するため
のもっとも基本的の方
法である「メモリサー
チ」を実践しました。
解析ではアプローチが重要
● プラチナで戦闘乱数のルーチンを見つけるのに、
試しに現在HPを出発点にしてたぐっていったが遠
すぎて途中で諦めた
● クイックセーブ、クイックロードで時間で勝手に進ん
でいかないことはわかるので、さっきのペラップの...
アセンブリコード
アセンブリコード
● ある程度踏み込んだ解析をしようとしたらアセンブ
リコードを読むことが必要
– アセンブリコード=機械が実行できるように変換された
プログラム
● DSではARMという命令セットが使われている
– iPhoneやAndroi...
アセンブリコード
void init_genrand(unsigned long s)
{
mt[0]= s;
for (mti=1; mti<N; mti++) {
mt[mti] =
(1812433253UL * (mt[mti-1] ^...
アセンブリコード
void init_genrand(unsigned long s)
{
mt[0]= s;
for (mti=1; mti<N; mti++) {
mt[mti] =
(1812433253UL * (mt[mti-1] ^...
アセンブリコード
● 逆アセンブルして出てくるのは関数名も変数名も型
情報もないプログラム
● そのまま静的に読むのはしんどい
● デバッガがあれば少しはラクになるところだが…
DeSmuMEのいけてないところ
● デバッガがない
Photo by hobvias sudoneighm / CC BY
http://www.flickr.com/photos/34427466731@N01/2192192956
デバッガとは?
● プログラムのバグを自動的に直してくれるとっても
便利なプログラム!
デバッガとは?
● プログラムのバグを自動的に直してくれるとっても
便利なプログラム!
● ではない
● レジスタ(作業領域のこと)やメモリの値を見なが
ら、命令を1行1行実行(ステップ実行)してくれる
ツール
NO$GBA Debugger
●
デバッガのついたエミュ
レータ
●
シェアウェアだったものが
2014年7月28日にフリー
ウェアとして公開
● あのktxadさんも使っている!
● ちょっと触ってみたが使い方が分からなかった…orz
でもでも
● DeSmuMEはソースコードが公開されているので
意欲と時間さえあれば自分でデバッガを実装する
ことだって可能
DeSmuMEのいけてるところ
● ソースコードが公開されている
● Luaスクリプト
– 乱数ルーチンをトレースするというようなデバッ
ガではできないことができる
– メモリフックと逆アセンブルリストを読むことで、
効率は悪いにせよデバッガで...
まとめ
● エミュレータを使えばDSのゲームの解析ができま
す
● 楽しいけれども、大変です
まとめ
● エミュレータを使えばDSのゲームの解析ができま
す
● 楽しいけれども、大変です
質問はないか?
Upcoming SlideShare
Loading in …5
×

イカ乱

3,650 views

Published on

イカ乱

Published in: Technology
  • Be the first to comment

  • Be the first to like this

イカ乱

  1. 1. いかにして乱数を解析するか oupo 2014 / 9 2014 / 12 追記部分は青で示しました
  2. 2. 自己紹介 ● 第4世代でいろいろ – バトルファクトリーの解析 – くじ番号から裏IDを特定するツール – バトルタワーの解析 – ものひろいの乱数調整 ● 線形合同法についてのいくつかの記事 ● ほか:某超次元サッカーRPGの解析
  3. 3. ● コンピュータプログラムの用語をたくさん使います が、分からない用語があってもあまり気にせずに聞 いてもらえれば。 ● 質問やツッコミがあればお気軽に お気軽にね!
  4. 4. DeSmuME
  5. 5. DeSmuME ● DSのエミュレータ – DSのゲームがPCで動かせる
  6. 6. 実践:戦闘乱数のトレース
  7. 7. 実践:戦闘乱数のトレース 戦闘乱数の関数が呼 ばれたときにその呼び 出し元を出力するLua スクリプトを実践しまし た
  8. 8. 実践:メモリサーチ
  9. 9. 実践:メモリサーチ 解析で最初の難しいと ころは目的のメモリア ドレスを見つけること です。 それを達成するため のもっとも基本的の方 法である「メモリサー チ」を実践しました。
  10. 10. 解析ではアプローチが重要 ● プラチナで戦闘乱数のルーチンを見つけるのに、 試しに現在HPを出発点にしてたぐっていったが遠 すぎて途中で諦めた ● クイックセーブ、クイックロードで時間で勝手に進ん でいかないことはわかるので、さっきのペラップの ような手順でseedをメモリサーチすればすぐに見 つかる
  11. 11. アセンブリコード
  12. 12. アセンブリコード ● ある程度踏み込んだ解析をしようとしたらアセンブ リコードを読むことが必要 – アセンブリコード=機械が実行できるように変換された プログラム ● DSではARMという命令セットが使われている – iPhoneやAndroid端末などでも使われている組み込み 向けのもの – なお、多くのPCで使われている命令セットはx86という。 ARMとはずいぶん性格が違う
  13. 13. アセンブリコード void init_genrand(unsigned long s) { mt[0]= s; for (mti=1; mti<N; mti++) { mt[mti] = (1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti); } }
  14. 14. アセンブリコード void init_genrand(unsigned long s) { mt[0]= s; for (mti=1; mti<N; mti++) { mt[mti] = (1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti); } } :0203EEA4 E92D4008 stmdb sp!, {r3,lr} :0203EEA8 E59F1060 ldr r1, [0203ef10] ; 021467b8 :0203EEAC E3A02001 mov r2, #1 :0203EEB0 E5913000 ldr r3, [r1, #0] :0203EEB4 E5830000 str r0, [r3, #0] :0203EEB8 E5910000 ldr r0, [r1, #0] :0203EEBC E58029C0 str r2, [r0, #1c0] :0203EEC0 E5910000 ldr r0, [r1, #0] :0203EEC4 E590E9C0 ldr lr, [r0, #1c0] :0203EEC8 E35E0E27 cmp lr, #270 :0203EECC A8BD8008 ldmiage sp!, {r3,pc} :0203EED0 E59F003C ldr r0, [0203ef14] ; 6c078965 |0203EED4 E591C000 ldr r12, [r1, #0] :0203EED8 E08C210E add r2, r12, lr, lsl #2 :0203EEDC E5122004 ldr r2, [r2, -#4] :0203EEE0 E0222F22 eor r2, r2, r2, lsr #1e :0203EEE4 E023E092 mla r3, r2, r0, lr :0203EEE8 E78C310E str r3, [r12, lr, lsl #2] :0203EEEC E5913000 ldr r3, [r1, #0] :0203EEF0 E59329C0 ldr r2, [r3, #1c0] :0203EEF4 E2822001 add r2, r2, #1 :0203EEF8 E58329C0 str r2, [r3, #1c0] :0203EEFC E5912000 ldr r2, [r1, #0] :0203EF00 E592E9C0 ldr lr, [r2, #1c0] :0203EF04 E35E0E27 cmp lr, #270 *0203EF08 BAFFFFF1 blt 0203eed4 :0203EF0C E8BD8008 ldmia sp!, {r3,pc} ワオ!
  15. 15. アセンブリコード ● 逆アセンブルして出てくるのは関数名も変数名も型 情報もないプログラム ● そのまま静的に読むのはしんどい ● デバッガがあれば少しはラクになるところだが…
  16. 16. DeSmuMEのいけてないところ ● デバッガがない Photo by hobvias sudoneighm / CC BY http://www.flickr.com/photos/34427466731@N01/2192192956
  17. 17. デバッガとは? ● プログラムのバグを自動的に直してくれるとっても 便利なプログラム!
  18. 18. デバッガとは? ● プログラムのバグを自動的に直してくれるとっても 便利なプログラム! ● ではない ● レジスタ(作業領域のこと)やメモリの値を見なが ら、命令を1行1行実行(ステップ実行)してくれる ツール
  19. 19. NO$GBA Debugger ● デバッガのついたエミュ レータ ● シェアウェアだったものが 2014年7月28日にフリー ウェアとして公開 ● あのktxadさんも使っている! ● ちょっと触ってみたが使い方が分からなかった…orz
  20. 20. でもでも ● DeSmuMEはソースコードが公開されているので 意欲と時間さえあれば自分でデバッガを実装する ことだって可能
  21. 21. DeSmuMEのいけてるところ ● ソースコードが公開されている ● Luaスクリプト – 乱数ルーチンをトレースするというようなデバッ ガではできないことができる – メモリフックと逆アセンブルリストを読むことで、 効率は悪いにせよデバッガでの解析とだいたい 同等なことが解析できる (はず?)
  22. 22. まとめ ● エミュレータを使えばDSのゲームの解析ができま す ● 楽しいけれども、大変です
  23. 23. まとめ ● エミュレータを使えばDSのゲームの解析ができま す ● 楽しいけれども、大変です 質問はないか?

×