O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.
いかにして乱数を解析するか
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のゲームの解析ができま
す
● 楽しいけれども、大変です
質問はないか?
Próximos SlideShares
Carregando em…5
×

イカ乱

3.722 visualizações

Publicada em

イカ乱

Publicada em: Tecnologia
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

イカ乱

  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のゲームの解析ができま す ● 楽しいけれども、大変です 質問はないか?

×