【うさみみハリケーン】うさみみハリケーンをつかってみよう【逆アセンブル編】
今回はちょっと踏み込んだことをやるよ
アセンブラコードをいじってみます。
このうさみみハリケーンの関連記事はチートを推奨する記事ではありません。あくまでも、解析して遊びたいなどの知識欲を埋めるためだけに存在する記事です。
あとね、記事と同じことを実行して仮にお前のPCに不利益を被ってもアザラシ(この記事書いてる俺)に責任は一切なしだから(でりさくら)
自己責任ね。
はい。そもそもアセンブラコードをいじる理由について一旦話そうかと思います。
前回はメモリをいじり所持金を99999にすることができました。しかし、そこからキャラを購入やレベルをあげるなどの所持金を使用する行動を取れば、どんどんなくなってしまいます。
一応改造コードを作成するという項目もあり、1秒ごとに所持金のメモリアドレスに対し、
0x1081141C – 9F860100 としてあげれば、所持金は実質99999となる。
あれ、前回となんか書き方が違うような?と思った方もいると思います。
前回は所持金のメモリアドレスに対し 0x9F860100 と説明しましたが、正確には
0x1081141C – 9F
0x1081141D – 86
0x1081141E – 01
0x1081141F – 00
ということである。
ちなみに改造コードの書式と使用例は こちら にあるので参照されたし。
なお 先程の 0x1081141C – 9F860100 でも問題なくできる。
これは 0x 1081141Cのアドレスを基点として そこから 9F860100に書き換えるということです。
本題
先程のコードは数値を99999に1秒ごとに書き換えるということなので、お金が減らない。ということではない。減ってはいるが、1秒毎に99999に書き換えているだけです。
なので、今回はそもそもお金を減らさない方法をとります。
お金が減らないということはどういうことでしょうか?
A. 所持金が減る行動(キャラ購入、レベ上げ)の価格を0にする。
B. 所持金が減る行動をしない。
C. 所持金が減る行動によって生じる所持金の変動処理を止める、
正解は Cです。Bと答えた人は縛りプレイでもしててください。というかぱちゅコンにおいてキャラ買わないと本を盗まれる一方だから何をするんだよ。あとAはやろうと思えばできるだろうけど所持金を減らさないようにするというよりは、購入価格を変えるというものになるのでちょっと意味合いが変わってくるかと思います。
なので、今回はそのやり方を実際にやってみたいと思います。結構長くなりますよ。
今回は前回に引き続き、所持金のメモリアドレスを把握している状態から進めていきますので、準備しておいてください。
こうなりましたか?
気づいた方もいるかも知れませんが、前回の所持金のアドレスと場所がかわっているかとおもいます。これは 環境依存型変動アドレスです。なので毎回変わります。
チートコードを作る際にこれだと、そのまま前に調べた値をそのまま使うことはできません。それを説明するほどの頭を持ち合わせていないので、 こちら をご覧になってください。いつか説明できるほどしっかりと実践できるようになりましたら、関連する記事を作成したいと考えています。
2020年3月1日追記 : 書きました。よかったらどうぞ見てください。
【うさみみハリケーン】環境依存型変動アドレスを調べてみる【解析】
話を戻しまして、今回やることは
所持金のアドレスに対してブレークポイントを仕掛け、値を変動させるコードを特定します。
早速ブレークポイントを仕掛けて見たいと思います。
所持金アドレスを選択状態で デバッグ -> ブレークポイントを挿入
こういうウィンドウがでてきます。
先程の所持金アドレスが ハードウェアブレークポイントの部分に入っていれば大丈夫です。
次に、アタッチを押すことでブレークポイントを挿入できます。ブレークポイントを挿入することで、値を変動させている該当箇所が分かるようになります。
早速アタッチを押してみましょう。
このような画面になりましたか?
この状態になれば、ブレークポイントの挿入をするためのデバッギーが作動している状態です。
次に、先程のハードウェアブレークポイントの項目の所持金アドレスが記載されている行を見てください。
そこに設定というボタンがありますね?そちらを押すことで該当箇所にブレークポイントを設定できるということです。
今回は書き込みの監視なので、このままの状態で 設定 ボタンを押します。
この状態になれば先程の所持金アドレスの部分を監視し。変動があれば何が起きたか教えてくれるようになります。
早速この状態で、ぱちゅコンの方で所持金に対し変動が起きる行動をとります。(キャラ購入でもレベル上げでもなんでもいいです)
一番下の枠に、新たになにか表示されましたね。
これが何が起きたか教えてくれたものになります。下の一覧はレジスタといって、値を格納している場所です。
EAX EBX ECX …のように見慣れないものがあるように感じる人もいるかとおもいます。僕もまだちゃんとはわかってないですが。
まずこれらのレジスタは汎用レジスタといいます。それぞれに使用目的がありますが、今回それらを説明するとこの記事がまた長くなるのと、僕もまだまだわかってないことがあるので、また別の記事で汎用レジスタについては勉強したことをまとめたいと思います。
今知りたいというかたは こちら を読んでみてください。
EAXには算術結果を格納するということだったので、それは省きます。
なので今回関係ありそうなのは、EIP 命令ポインタです。
命令ポインタ (EIP) は、分岐が起きない前提で、次に実行する命令のアドレスを保持している。
EIPはcall命令の直後にのみ読むことができる。
先程のリンクより引用致しました。
このように次に実行する命令アドレスを保持しているレジスタになります。
なのでこちらの場所を見てみたいと思います。
readOnlyエリアですね。この付近に所持金アドレスに対して実行した命令があるかどうか探します。
ココでようやく逆アセンブルが登場します。
使い方としては今回のEIPは次に実行する命令がはいっているとのことでした。
なのでEIP付近を探すので、EIP付近をざっくりと選択します。
こんなかんじ。
この状態で、デバッグ -> 選択範囲を逆アセンブル を押します。
このような画面が出たかと思います。
開始アドレスの部分と終端アドレスの部分が先程の選択範囲の始点と終点になっています。
では逆アセンブルを実行を押してみましょう。
このように選択しているアドレス部分にどのような逆アセンブルコードがあるか、確認できます。
今回はEIP付近を確認したいので先程のEIPの位置あたりを確認してみます。
今回自分の場合ですと EIP = 00448858 でしたので該当箇所を見てみますと
このような形です(開始アドレス等が先程の画像と違いますが、うっかり違うアドレスを見てたので正しいアドレスを再度指定しました)
今回自分が指定下場所は
ADD DWORD PTR [ESI],1
でした。これは
ADD 加算
DWORD PTR 対象の値をDWORD(4byte)として扱う。
[ESI] これはESIの値のアドレスを指定しています。これが単に、ESI の場合はESIレジスタに対して何かをするということですが、[ ] がありますね。これはアドレスの指定に使います。なので [4489DE]としたら、メモリアドレス4489DEに対し、なにかするということです。
なので一旦ESIの値を見てみましょうか。
これですね。ESI = 0CA84708です。
ではそのアドレスは一体何があるのか見に行ってみましょう。
ちなみに 移動 -> 表示アドレスを指定 とすることで簡単に飛べます。
これですね。自分のほうだと3とでました。ゲーム内で思い当たる節があるとすれば、
現状購入したキャラの数ですね。(記事通りにやると2体かもしれませんが、うっかり僕は3体購入しました)
何はともあれ、これが本当にキャラの数なのかどうか一旦確認してみましょう。
4体目を購入しました。では、うさみみハリケーンの先程のアドレスを見てみましょう。
該当のところは4になっていますね。
つまりキャラの購入数だったようです。
あれ?今回は所持金の話だよね?って思った方。いると思います。
そうです。所持金の話ですが、このように1つ1つ紐解いて行く必要があります。そもそも、逆アセンブルをする箇所を決める際、そのアドレスが本当に所持金に関わる命令があるアドレスかどうかはまだわかっていません。
ですが、今回キャラの数を増やす逆アセンブルコードを確認しました。
少し考えれば分かると思いますが、キャラを購入するフローをざっくり考えて見ましょう。
1.キャラを選択
2.購入ボタンを押す
3 or 4 キャラを増やす もしくは所持金額を減らす
5 処理終了。
このようなフローになるかと思います。キャラを増やす処理と、所持金額をへらす処理は作りによってはどちらとも言えないので 3 or 4としました。
つまり、所持金を減らす処理とキャラを増やす処理は少なくとも先程の逆アセンブルコードの近くにある可能性が高いということです。
さて、先程の逆アセンブルコードに戻ります。つまり先程の
ADD DWORD PTR [ESI],1
は、ESIに格納されているアドレスの値に 1 を4byte型で追加ということでした。
さて、本題に戻りますが、所持金を減らす ということは減算処理をしているということになります。
減算処理はアセンブラでは
SUB
としてでてきます。なので先程の逆アセンブルコードの付近でSUBというものがあれば怪しいということになります。
早速見てみましょう。
現在選択状態になっているところがブレークポイントにて割り出されたEIPのアドレスの場所です。
その上下でSUBというものがあるのは、すぐ一個上にある
アドレス 00448852 の
SUB [EAX + 241C],EDX
ですね。
[EAX + 241C]の値に対しEDX分引く処理の用です。
一旦ブレークポイントの画面に戻ります。
こちらのEDXの値をみてみましょうか。
EDX=5F
5Fを10進数に戻しますと、
DEC 95
これは僕がぱちゅコン内で橙を購入した金額とマッチします!ようやく面白くなってきましたね!先程の逆アセンブルコードの部分が所持金に対して命令している可能性が高まりました。
ただ、まだ偶然の可能性は否定できません。
ですので次は
[EAX + 241C]
こちらを紐解いて行きましょう。
ブレークポイントの画面に戻ります。
EAX = 106A0038 です。
今回は、[EAX + 241C]ですので、これに対して 241Cを加算します。
つまり [EAX + 241C]は メモリアドレス 106A2454 を示しています。
では早速該当箇所を見てみましょう。
!!!
なんと一番最初に所持金を調べるところのアドレスに戻りました。
先程の逆アセンブルコードは所持金に対して減算するコードで間違いありませんね!楽しいですね!
さて、該当の逆アセンブルコードの場所が判明しました。
ではココからどうやって所持金を減らさないようにするか。それは、逆アセンブルコードを書き換えます。
方法としては
1.該当の処理自体 nop という何もしない処理に変える。
2.該当の処理を書き換え、 SUB [EAX+241C],0 の様に、所持金を変動させなくする。もしくは ADD ~~~のようにしてむしろ足すことも可能。
今回はNOPでやってみたいと思います。
先程の該当の場所に対して右クリックすることでコンテキストメニューがでます。その中にNOPで埋めるというものがありますそちらを押してみましょう。
この様になりました。
これで所持金の減算処理は消えました。早速ゲームでキャラを購入してみましょう。
現在 橙が4体の所持金1620ですね。
では試しに1体購入してみます。
現在 橙が5体の所持金1620ですね。
無事に成功しています!これで所持金が減ることはなくなりました。
ただし、この場合ですと、キャラクターを購入する場合は確かに減算処理は働かなくなりました。試しにこの状態でレベルアップを押してみましょう。
お金が減ってしまいました・・・。
レベルアップの際の処理はまた別のところで減算処理を行っているようです。しかし、ブレークポイントのアタッチをしたままなので、そこからまた割り出すことができます。
此処から先は自分でやってみてください。
終わりに
どうでしたでしょうか?無事に数値を変動させることはできましたか?
逆アセンブルコードを発見するまでの過程はパズルを解くような感覚で僕は好きです。
今回僕自身がまだあまり詳しくないこともあり稚拙な説明であったところはありますが、また色々と勉強しましたら、記事を乗っけたいと思います。
例えば環境変動型アドレスに対してうまくやる方法などですね。パラサイトルーチンを使った方法があるようなので、それをやってみてうまくできれば記事にしてみたいです。
ではありがとうございました。
ディスカッション
コメント一覧
とてもわかりやすいです!!!!!!
今勉強しているので参考になります!!
匿名 さん
ありがとうございます、参考になれば幸いです!
いつも参考にさせてもらってます、ありがとうございます。
ブレークポイント挿入すると、一瞬フリーズ後に強制再起動かかるのはスペック不足になりますよね…?
コメントありがとうございます、アザラシです。ご連絡遅くなってしまいすみません
>ブレークポイント挿入すると、一瞬フリーズ後に強制再起動かかるのはスペック不足になりますよね…?
んー・・・たぶんそうかと思います。自分は今のところ起きないのでスペックを見直してみるとよいかと思います。
ちなみにパソコンのスペックはどんな感じですか?