紅魔郷で学ぶチートの仕方 with うさみみハリケーン

以前は ぱちゅコン!で改造というか解析の仕方の記事を書きました。
今回は東方紅魔郷でどのようにチートをするのかを学んで行きます。
学ぶということは、いわゆる改造コードを配布する形式ではなく
この記事をみて、実際に探してやってみようという趣旨です。

しつこいですが、オンラインゲームではやってはいけません。
なんで?という方は以前僕が書いた記事のうさみみハリケーンの使い方
シリーズ
をよんできてください。わからない人はやってはいけません。

自己責任。いいね?

0.用意するもの

■ 東方紅魔郷

当たり前だよね。持ってないなら購入しようね。購入して遊ぼうね。
楽しいよ。ていうかやって♥(弾幕STGオススメおじさん)

もしくは公式から体験版をインストールしても
いいかもね。(但し記事同様にできる保証はしません)

【上海アリス幻樂団】東方プロジェクト東方紅魔郷 ~ the Embodiment of Scarlet Devil

価格:1,080円
(2019/5/20 14:54時点)
感想(12件)

■ うさみみハリケーンと付随する知識
これは以前の記事を参考に導入、操作方法などを憶えてきてください。
【うさみみハリケーン】うさみみハリケーン使ってみよう【導入編】
【うさみみハリケーン】うさみみハリケーンを使ってみよう【お触り編】
【うさみみハリケーン】うさみみハリケーンをつかってみよう【逆アセンブル編】
【うさみみハリケーン】パラサイトルーチンを触ってみる

1.実際にいじってみよう

まずは一番わかり易いスコアをいじってみましょう。
とりあえず紅魔郷を起動するまえに、
紅魔郷をもともとやってて、セーブデータがある人。

バックアップを取りましょう。セーブデータが壊れても
保証できません。なのでバックアップの仕方を教えます。

紅魔郷をインストールしてあるフォルダです。スクリーンショットに
どのようにするのかを記述しました。
ちなみに上のスクリーンショットのように拡張子がファイル名に
でてないよ・・・という人は

win7 拡張子 表示
win10 拡張子 表示

のようにgoogleで調べればでます。googleで調べるのは基本中の基本です。
会社で働いてたときもまずはgoogleで調べてダメなら上司に聞くのが
当たり前レベルでしたので、調べる癖つけようね

ちなみにwin10で紅魔郷うごかないヨ~という人は
vpatchでも使ってみるといいんじゃない?
それでも動かなければわかりません。そもそも動作対象外だし

ほいで、次はうさみみハリケーンの起動。
対象プロセスは 

東方紅魔郷.exe

を選択してね。

こんな画面になったかな?なってないなら・・・
以前の記事を見直してきて。

とりあえず、Normalで遊びます。

とりあえず少し雑魚を倒して得点が増えました。
(ハイスコアが低いとかそういうツッコミはいいから)

■ スコアの弄り方

この現在の得点部分をうさみみハリケーンで調べて見ましょう。
検索するときはうさみみハリケーンの
検索 -> メモリ範囲を指定して検索(64bitMode)
です。まさか今日日OSが64bitじゃない人は居ないと・・・思うので
もし64bitじゃない人は 64bitModeじゃないほうで検索してください。

比較用メモリを確保して 検索・比較単位を 4Byte として検索をしました。
2つ項目がでましたね。そこのアドレスを調べて見たいと思います。

0069BCA0hを試しに見てみた所このようになっていました。

0069BCA0h から4byteの値は 0x0004A7B8なので
これを試しに
0069BCA0h を 0x0004A7B9 としてみました

69BCA0h の最後の h って何?という人はこれも結局
16進数ですよという意味合いでつけるものですが、
メモリの値とメモリのアドレスでどちらとも 0x とすると
混同してしまうかと思うので
メモリアドレスは h
メモリアドレスの値は 0x とします。

スコアが1増えましたね。しかし、もう一つの値も気になります。
それは
0069BCA4h から4byteの値もスコアと同値だったので
こちらの様子を見てみます。

いじってみた所特に変化はありませんでしたが、
敵を倒しスコアをあげると間違いなく増えるので
スコアに関連する記述だということがわかりました。

あとでよく調べますが、憶測ですが東方は
現在スコア + 敵を倒した得点 をパッと表示するわけではなく
スコアが加算されるときのアニメーションを挟んでいるので
それ関連の処理に使っているのかな?と思いました

とりあえず現在の得点をいじることはできましたね。なので
次は 残機数を調べて行きたいと思います。

■ 残機回り

残機回りを調べるにあたって一度タイトルに戻り、
残機数を 5 にした上で調べます。

2byte で 検索数値を 5 と入れたいところですが、
残機 5 のときは星が4つですね。
星が 0 の状態でもゲームオーバーになるわけではなく、
星が 0 の状態で再度被弾するとゲームオーバー(もしくはコンティニュー)
になるのでこの状態は 4 であると推測します。
なので 4 で調べます。

ゲーム上で残機を減らして 3 で結果から検索

な、なんだってー!!(AA略

ちなみにやっぱ 5 に設定したんだから5じゃね?という考えの元
検索しましたが出ませんでした・・・

何故だ・・・と頭を抱えて居たのですが東方の残機ってそういや最大いくつだっけ・・・と思い調べる

参考サイト : 東方紅魔郷/解析データ
(便利な世の中だ・・・)

解析データの通りであるなら最大で増えても 8 のようですね。
・・・ん?つまりこれは 1byte で十分ですね・・・

と思い早速 1byte で残機数を検索し直す

一旦この状態で絞り込みをしたいので、変動検索実行の
不動 を何度か押してみました。

だーいぶへったので、最後の踏ん張り

でたぁ!
早速ここの数値換えてみましょうね~

これが該当アドレス。ここを試しに3に換えます。

数値を変更してみた所、現状は残機 1 ですが・・・
この状態で残機に変動のある行為、わざと被弾してみます。

残機が 2 になりました!パチパチパチ
内部的には残機 3 の状態だったので、被弾して 残機 – 1 した結果
それが見た目として反映し、 残機 2 の状態になりました。

ちなみにここで気になるのが、じゃあボムの数は?ということです。
先程見つけた残機のメモリアドレスのすぐとなり
0069D4BBh の値が 0x3 でした。
大抵ステータスのアドレスは近くにあるので、これがボムの
アドレスだと想定して、ボムを一度使ってメモリの値がどのように変化するのか、確認してみます。

赤枠で囲んだところがボムの値ではないか?と思われる部分です。
すぐ左の黄色くなっている部分は先程の残機のアドレスです。
では、この状態でボムを一度使ってみましょう。
(先程のスクショと変わらず、ボムの残数は3の状態で使用します。)

ボムを使用しました。
では、先程のメモリを確認してみましょう。

2 です!これはボムの残数で有ることが濃厚になってきましたね。
先程の残機のとき同様に、数を現状の数 + 2 をして
ボムを使用してみましょう。

ボムの数が 3 になりました!これは間違いなくボムの数です!
やったね!

■ 残機を減らなくしてみよう

ここからは逆アセンブルを使用するので、逆アセンブルの記事
読んでなければ読むことをオススメ。
あとレジスタの知識も軽くあるといいので、
汎用レジスタについての記事をみると良いかもしれません。

では、先程の残機のアドレス(0069D4BAh)に
ブレークポイントを仕掛けます。ブレークポイントを仕掛けることで
そこの値が変動したときのログのようなものが見れます。

ブレークポイントを仕掛けた後に、残機を減らして見ました。
ログが出てますね。ここの EIP という値にご注目。
ここは次に実行されるアドレスが格納されています。
なのでこのアドレスを確認することで、残機を減算したときの
処理を見つけることができます。

早速 EIP の値の 00428DF2h に飛んでみましょう。

赤枠で囲んだところが先程の EIP の該当アドレスです。
でもこれを見たところで正直何もわかりませんよね。
なので、ここから逆アセンブルします。

その前に該当のアドレスを左クリックで一度選択した後に、

ここのボタンで 栞(しおり) をつけておくことをおすすめします。
これをつけておくと、他のアドレスを見ているときに戻って来るのが
容易くなります。戻るときはすぐ右にある 緑の矢印ボタン
来ることができます。他にも逆アセンブルをする際に
該当の場所がわかりやすくなります。

話を戻しまして、逆アセンブルを早速してみます。

該当のアドレスの前後大体 3~4行を含めた選択をします。
なんで?という方の為に説明すると、該当のアドレスは
あくまでも次に実行される行です。なので
その後ろの部分が大事になってきます。他にも、すぐ後ろの
行を見てもそれらしいコードが無い場合もあります。

なので、該当アドレスの前後を余裕を持って逆アセンブルすることで
何をしているのかが分かるためです。

では、この選択している状態で、 デバッグ -> 選択範囲を逆アセンブル を実行しましょう

こんな感じ。 ちなみに先程の該当アドレスどれだよ!
と思うかもしれませんが、アドレス一覧表の左に * がついているものがあるかと思います。

これは、先程 栞 をつけた部分です。栞をつける必要性がわかりましたね?
早速この逆アセンブルの内容を見ていきます。

さっとみて気になるのは、赤枠で囲った部分ですかね。
テキストとして抜き出すと

00428DE6    MOV AL,[69D4BA]
00428DEB    SUB AL,1
00428DED    [69D4BA],AL

こんな感じ。分かる人はパッとみてなるほどねと思うかもしれませんが、一応説明。

1行目
ALレジスタに メモリアドレス 69D4BAh の値を 格納します。
69D4BAh このアドレスは先程の残機のアドレスですね。
これを一度 AL レジスタに格納しています。

2行目
AL から 1 減算します。
そういうことです。

3行目
メモリアドレス 69D4BAh に ALレジスタの値を格納します。
2行目で減算した値を残機のところに格納しています。

もうおわかりだと思いますが、間違いなく残機を減らしている処理です。
じゃあ残機を減らさないためにはどうするか?

1行目,2行目,3行目の処理、消しちゃいましょう。
大抵はこれで問題ありません。

が!プログラムによっては、この数値が正しく格納されたか?
等のチェックをしている場合もあります。
そういうときは、そのチェックしている機能ごとスルーしなければなりませんが、見た感じなさそうなのでそのままやっちゃいます。

先程の三行を選択して、右クリックして~
NOPで埋める を選択!

こんな感じになったかな?
ちなみにうっかり間違えて別の場所 NOP にしちったwwwww
とかやっちゃうと、ゲームがフリーズする可能性があるので
やめようね。あと場合によってはゲームデータが破損します。
(ぱちゅコンで1敗)

じゃ、この状態で被弾してみましょっか

スクショだと伝わりづらいので動画にしました。
このように残機の減算がなくなりましたね!

■ ボムの残数も減らないようにしたぁ~い

残機の時と同様にやりゃあええやん(ハナホジ
ボムの方はこの記事を見てくれている方への問題という形にしておきます。
先程どやることは基本的に変わらないので、是非自分でやってみてくださいね。

■ わかっている物一覧

0069BBFCh 画面上に出ている弾の数
0069BCA0h 現在スコア
0069BCA4h スコア加算用(もしくは総合スコア)
0069BCB0h 難易度
0069BCB4h グレイズ
0069BCB8h 総合グレイズ数
0069BCC0h 死亡回数
0069D4B0h Power
0069D4B4h 点
0069D4B6h 総合点
0069D4BAh 残機
0069D4BBh ボム
0069D4BFh 一時停止フラグ(だと思う)
0069D6D4h ステージ番号

1から解析するときはメモ帳などでやってることなどを
メモするのがオススメです。

2.終わりに

どうでしたか?実際にやってみることはできましたでしょうか。
結構な長文になってしまったので、見てくれているかは少々不安ですが
大体この通りにやれば基本的にはいじることができますし、
アセンブリ言語の勉強にもなります。

残機を減らす以外にも、いじることでスコア計算をn倍にするとか
Grazeをn倍にするとか・・・
あとは紅魔郷 Ultraモードっていうのは結局解析をした上で、
こういうことができたので、いろいろやっていくうちに
できるかもしれません。

あとどうでもいい話ですが、スコアをいじる際に偶然難易度を保持している
アドレスを見つけ、試しにいじってみたのですが、
ゲーム中にいじっても難易度変わるんスね・・・
なんかの同人誌で神主のプログラムコードを見たこともありますが
本当に良く出来てる・・・しゅごぉい・・・。

どうでもいい話2ですが、そもそもこういうのにアザラシが興味を持ち始めた理由ですが、本当に最初は単純な理由です。
クソガキだった頃はやっぱチートとかしてみたくなるんですよ。
そういう経緯でネットに転がってるチートコードみて
使ってみてたりしたんですが、いつだかチートコードがそもそも
無いものがあって、どうしたものかなぁ~と思ってた頃に
だったら自分で探せばいいじゃない!ということになって
今に至るという感じです。(隙あ自

なんでもそうですがだったら自分で作ってみればいいじゃない!の
精神は大事です。

おわり