Cheat Engineで暗号化された値を見つけよう!難易度★★★☆☆

今回はゲーム内で暗号化された値をどうやって見つけるか?その方法を手短に解説します。
使用するゲームは風来のシレン5plusです。


まずはゲーム画面上にあり1番目立つHP、もしくは満腹度から検索していくわけなんですが、普通に検索してもヒットしません。この時点でもしかしたら暗号化か何か対策されているかもしれないと思いました。このままでは手掛かりも何もないので、何かないかとゲームを操作してみると・・・ありました。


メニュー画面を表示すると満腹度が表示されています。この状態で検索をかけてみましょう。

無事に見つけることができ、最終的に2つに絞りこめました。ただ、値を変更してみてもゲーム内に変化はありません。おそらく画面表示用の一時的な変数なんだと思います。ではこの値はどのような処理の流れで90になったのでしょうか?私は以下のように仮説を立てました。

暗号化された満腹度
  ↓
復号化
  ↓
メニュー画面に表示

ここから暗号化された満腹度にたどり着くには、そう矢印の逆手順をたどればいいわけです。これをするにはアセンブリ言語の知識が必要ですがそんなに難しく考える必要はなく、値がどこから来たのかさかのぼっていけばよいだけです。それでは一応の方針が決まったので解析を進めていきましょう。

次はこの値に書き込んでいる命令を「Find out what writes to this address」で見つけます。値は2つありますが両方ともやってください。



全部で5つ命令がヒットしました。「Show disassembler」で逆アセンブラ画面を開き、周辺に怪しい命令がないか確かめます。5つの命令すべてです。場合によっては怪しい箇所にブレークポイントを仕掛け、レジスタやメモリの値も確認します。

要は5つの命令の内、どれが1番手っ取り早く満腹度の値までたどり着けそうかを見極めるわけです。このあたりは少し試行錯誤が必要です。

そうこうしていると1つ良さそうな命令がありました。


逆アセンブラ画面

ShirenTheWanderer5plus.exe+162256(青い行)にブレークポイントを設置し、レジスタを確認するとedxに満腹度が格納されています。ではこのedxの値はどこから来たのでしょうか?少し上にさかのぼってみるとmov命令でeaxから代入されています。そしてその1つ上にCall命令、つまり関数を呼び出しています。この関数の返り値がeaxに格納されていて、eaxからedxに代入されているということです。
このことから、おそらくこの関数は暗号化された値を複合化しているのではないかと推測できます。

複合化関数を呼び出す
   ↓  
関数の返り値(復号化された値)をedxに代入
   ↓
edxの値を画面表示用の変数に代入
   ↓
画面に値を表示


ここから先はネタばれになるので皆さんでやってみてください。

Tips1:
call ShirenTheWanderer5plus.exe+1EE3A0 <- この関数を調べてみよう!

Tips2:
x64の呼び出し規則
第一引数 rcx
第二引数 rdx
第三引数 r8
第四引数 r9
関連記事

2 Comments

-  

No title

とても勉強になります
答えも教えていただけると嬉しいです

2022/08/16 (Tue) 10:03 | EDIT | REPLY |   
ちーたー

なんでもチートの中の人  

お二人ともコメントありがとうございます。

To -さん
少しでもお役に立てたなら嬉しいです。やはり文字と画像だと実際に試行錯誤した様子を伝えるのが難しいですね。解答の記事はいつになるか明言はできませんが、なるべく近日中に作成したいと思います。

To Eurasiaさん
ここからでもひと山、ふた山あったんではないでしょうか。私も日々苦戦しています。おそらく他言語のプログラミング経験者だと思いますが、アセンブリ言語に触れたことがない状態で見つけるのはすごいです!

補足ですが、Memory Viewer画面の下に位置している「ダンプ画面」で暗号化された満腹度の値の近辺を調べればHPもあっさり見つけることが出来ます。


自分のコメントを削除しようとしたところ、間違えてEurasiaさんのコメントを削除してしまいました。大変申し訳ないです。

Eurasiaさんのコメント
"解説記事ありがとうございます。アセンブリ言語を読んだことがなく苦戦しましたが、無事暗号化された値のスクリプトを作成することが出来ました。"

2022/08/28 (Sun) 14:45 | REPLY |   

Post a comment