与えることで有効にすることが出来ます。今回はその方法をまとめてみました。
デバッグモードにはテストプレイとバトルテストがあり、テストプレイは
スイッチ(フラグなど)の変更や壁抜けなどができるようになります。
バトルテストはどうも制作環境でないと動作しなさそうですので、
ここではテストプレイをデバッグモードとして扱います。
F9キーでスイッチ(S)や変数(V)の変更ができます。
Ctrlキーを押しながら移動すると壁抜けができるようになります。
コマンドラインパラメータは以下のようになっています。
■RPGツクールVX Ace
Game.exe [test/btest] [console]
test テストプレイ
btest バトルテスト
console コンソールの表示
■RPGツクールVX
Game.exe [test/btest]
test テストプレイ
btest バトルテスト
■RPGツクールXP
Game.exe [debug/btest]
debug テストプレイ
btest バトルテスト
■RPGツクール2000/2003
RPG_RT.exe [TestPlay/BattleTest] [HideTitle] [Window]
TestPlay テストプレイ
BattleTest バトルテスト
HideTitle タイトル非表示
Window ウィンドウモードで起動
ショートカットを作成し、リンク先の末尾にパラメータを追加すると簡単です。
RPGツクール2000/2003製のゲームはデフォルトでフルスクリーン起動しますが
このようにパラメータを与えることで最初からウィンドウモードで起動できます。
2000/2003では第1、2引数を省略できないので適当な文字を入れておいて下さい。
例)RPG_RT.exe NULL NULL Window
残念ながらRPGツクールXP以降の多くのゲームは、デバッグモードで起動すると
「スクリプトの読み込みに失敗しました。」と表示され終了してしまいます。
(どうやらスクリプトが暗号化されているとこのように表示されるみたいです)
このような起動時のチェックであれば、チェックを回避するよう改造したり、
後から改造コードでメモリ上のデバッグモードフラグを入れることで対処できます。
しかし、対策としてスクリプトでデバッグモードフラグを常時チェックしている
ものには、これらの方法では回避することができません。
起動時チェック用に改造コードを記載しておきます。
改造コードの使い方はこちらを参照して下さい。
■RPGツクールVX Ace
*デバッグモード
FILENAME Game.exe
00000FA6: 32 14
■RPGツクールVX
*デバッグモード
FILENAME Game.exe
00001964: 23 1C
■RPGツクールXP
*デバッグモード
FILENAME Game.exe
0000160E: 14 06
制作者としては見てほしくない部分かもしれませんが、ユーザーとしては興味深い
ですよね。昔のRPGでどうしても行けない場所にやきもきした思いをした方は
特にそう思うのではないでしょうか。
デバッグモードフラグのチェックを回避する改造コードをテスト公開します。
上の改造コードは使用せず、こちらのコードのみを使用して下さい。
改造コードはうさみみハリケーンやスペシャルねこまんま等で実行できます。
ゲームが使用するdllによってコードが異なりますので、「Game.ini」の「Library」
の項目を確認しておいて下さい。
■RPGツクールVX Aceデバッグモードの改造コードをSSGにしてみましたのでこちらもどうぞ。
;デバッグモード(RGSS301.dll)
*00410004>19E550-8B018B500485D2750B83FB08740583FB18750142C3
*00410004>0635F4-E857AF1300
;デバッグモード(RGSS300.dll)
*00410004>19E700-8B018B500485D2750B83FB08740583FB18750142C3
*00410004>0633E4-E817B31300
■RPGツクールVX
;デバッグモード(RGSS200J.dll)
*0040BCC0>0FBBE0-8B018B500485D2750D85DB750985F6750585FF750142C3
*0040BCC0>088534-E8A7360700
;デバッグモード(RGSS202J.dll)
*0040BCC0>0FBC00-8B018B500485D2750D85DB750985F6750585FF750142C3
*0040BCC0>088554-E8A7360700
■2012/4/28更新
RPGツクールVX Ace製ゲームのデバックモードについて追加しました。
■2012/7/17更新
デバッグモードのチェックを回避する改造コードをテスト公開しました。
ありがとうございました。
ぜひVXaceも公開してもらえればと思います。
ちゃんと動作してますかね?何かおかしなところがあればコメントにお願いします。
ありがとうございました!
質問なのですが、VXのゲームをデバックチェックによってollydbgで実行できないのですが、その回避方法について知っていれば教えてもらえないでしょうか?
デバッグモードのチェック回避のコードで実行でできるのかとも思いましたが、うさみみハリケーンで実行しても終了後にはチェック回避のコードが無効になってしまうのでollydbgでの起動はできませんでした。
初心者すぎる質問かと思いますが、お暇がある時に是非ご教授お願いします。
こちらを参考にしてください。
私は「Olly Advanced」というプラグインを使用しています。
http://www.openrce.org/downloads/details/241/Olly_Advanced
大抵のデバッガチェックは回避できますし、バグの修正もできるので
ollydbg1を使うなら入れておくといいと思いますよ。
英語で訳がわらないのでとりあえずHELPの画像通りにチェックしてみたところ、読み込んだ瞬間終了してしまいました。
後日英訳しながらやってみます^^;
とりあえずの目標はVXのゲームでお金が減らないようにしてみたいですw
ご教授ありがとうございました!
「Anti-Debug」のProcess32Next、FindWindow、IsDebuggerPresent
にチェックを入れておきましょう。
後は状況に合わせてでいいかと思います。
Scramble Export Table、GetTickCountあたりは不具合を起こす可能性が
高いと思うので注意が必要です。
しかしVXのゲームを起動するとエントリーポイントがコードセクション外〜〜と出て、お金の格納アドレスが変わってしまっいブレークポイントがうまく設定できませんでした;;
これが自己変異型というやつなのでしょうか?
解説サイトと照らしあわせてやってるだけなので自分では手に余りそうです^^;
ただ、RPGツクールの実行ファイルはスクリプトのプレーヤーなので
プログラムを書き換えるような改造は、かなり難しいかもしれません。
もしかしてメモリのパラメータ全てが2n+1なんでしょうか?
だとするとニーモニックも全然違う表記されますよね・・・。
ということでパラメータの値だけ2n+1ですね。
DANAの部屋さんのHPでアドレス可変型の改造方法を参考にやってみましたが、ポインタの特定には至りませんでした;;
しかしポインタの特定をしたとしても、減算処理がスクリプトのプレーヤーで処理されているのなら○○減らないはできないのでしょうか?ねこまんまなどのコード自動更新で値が減ったら戻す、というのを繰り返せば出来はするんでしょうが・・・。
しているのであれば、ブレイクしたプログラムコードは様々なパラメータを
呼び出し、書き込みしているルーチンになるかと思うので、書き換えてしまうと
他の値にまで影響が出てしまいます。
私が公開しているデバッグモードフラグのチェックを回避する改造コードも
そうなのですが、特定の値以外には影響が出ないようにフィルタリングする
プログラムを書くことになるので、かなり大変です。
まぁ減らない処理ができないにしても増やすことは容易いので今のところそれでも十分なのでそれでいいかな、と思います。
色々ご教授いただいて本当にありがとうございました!
[subject]デバッグモード:b_toggle,_[:0x410004:]
,ssl->debug_chn,offset
[group]debug_chn
0x19E340,8B018B500485D2750B83FB08740583FB18750142C3
,000000000000000000000000000000000000000000
0x0633E4,E857AF1300,8B018B5004
[/group]
[group]debug_chn
0x19E700,8B018B500485D2750B83FB08740583FB18750142C3
0x0633E4,E857AF1300,8B018B5004
[/group]
にしないと、元からあるコードを塗りつぶしてしまいました。
環境によってズレがあるんでしょうか?
よろしければご確認お願いします。
確かに元からあるコードを塗りつぶしていました。
[group]debug_chn
0x19E700,8B018B500485D2750B83FB08740583FB18750142C3
0x0633E4,E857AF1300,8B018B5004
[/group]
上のコードだとフリーズしたため、[:0x410004:]+0x0633E4
に当たる部分の書き換え後のコードををうさみみで確認すると
CALL 101A1A80
という命令でした。
0x101A1A80は、_[:0x410004:]+0x19E340と同値でした。
改めて塗りつぶしを回避しつつ動作するコードを作ったら次のようになりました。
[group]debug_chn
0x19E700,8B018B500485D2750B83FB08740583FB18750142C3
0x0633E4,E817B31300,8B018B5004
[/group]
変更点としては、[:0x410004:]+0x0633E4の命令を
CALL 101A1E40
に書き換えるようにしました。
0x101A1E40は、_[:0x410004:]+0x19E700と同値です。
動作確認せずに書いて申し訳ないです。
せっかくなのでRGSS300.dllの回避コードも記事に掲載したいと思うのですが
よろしいですかね?
ところで、リックさんはこちらでSSGを公開なさっている方しょうか?
http://www.necocan.info/supb2/x/topics.cgi?mode=res&no=14064
私のブログにもRPGツクール系ゲームの改造リクエストを頂いているので
汎用的な改造SSGの作成を陰ながら応援しています。
私の方でも何かご協力出来ればいいのですが…
>>せっかくなのでRGSS300.dllの回避コードも記事に掲載したいと思うのですがよろしいですかね?
構いません。むしろ何故無いのだろうと思って掲示板に書かせてもらいました。
>>ところで、リックさんはこちらでSSGを公開なさっている方しょうか?
そうです。RICKとハンドルネームで公開しています。
自分がサーチした中気づいた点を書いています。
所持金はモジュール部分を変更すれば使えるみたいです。(当然他の項目のモジュール部分も書き換える必要あり)
ステータスは「status_info」をレベルやHP・MPの末端の領域と同一の領域の数値を書き換えれば使えると思います。3人目以降のアクターのデータがセーブデータに反映されると(?)ポインタが変動するようです。それに対応するため[14]のざくざくアクターズのssgは最近こっそり更新していたりします。ユニットリストがハオまであればそれが最新版です。
アイテムエディタは例のサイトに書いてあるとおり謎の16進数の解析ができなければ先に進めない状況です。謎の16進数はアイテム番号と関係有りそうですが、自力では無理そうなので断念しています。
XP,VX,VXAceのアイテム等のリストの取得はRPGツクールVXリーダー(とEXCELとサクラエディタ)が便利です。コピペしたあとちょっといじればアイテムの名前だけを取り出せます。(評価版の場合武器は除く)
長文失礼しました。
RGSS300.dllの回避コード掲載させて頂きました。
また、沢山の情報もありありがとうございます。
参考にさせて頂きたいと思います。
提案ですが、回避コードのssgも公開されてはいかがでしょうか?
自分は回避コードというより、いつでもデバッグモードがon/offできるコードというように使ってますので(もちろんSSGでの話)。また、当コードがonの状態だとF12リセット(勝手にこう呼んでる)が使用できないゲームも多いので。
RGSS200J.dllの場合のssgのコードを参考までに書いておきます。
(便宜上カンマ手前で改行あり)
[subject]デバッグモード:b_toggle,_[:0x0040BCC0:]
,ssl->debug_chn,offset
[group]debug_chn
0x0FBBE0,8B018B500485D2750D85DB750985F6750585FF750142C3
,0000000000000000000000000000000000000000000000
0x088534,E8A7360700,8B018B5004
[/group]
RGSS202J.dllのoffの文字列はRGSS200J.dllと共通です。
RGSS301.dllのoffの文字列はRGSS300.dllと共通です。
前のコメントはVXAceについてでした。ご存知かも知れませんが、
VX作品は猫缶INDEXのkn氏作の最新の「らんだむダンジョン」のssgがリストを書き換えるだけで使えるようになることが多いです。このssgで所持金が書き換えられたらビンゴといえるでしょう。(「らんだむダンジョン」が標準的な暗号化を施してあるため?)そうでなければ、ポインタ探索しつつ構文中のXXXX=>key;のXXXXを書き換えていけば使えるようになると思われます。
http://www.necocan.info/supb2/x/topics.cgi?mode=res&no=13298
上記サイトの[18]の添付ファイルにポインタ探索履歴等を書いたssgをアップしています。ぜひ参考にしてみてください。
XPも構文はそのまま使える模様です。キーの書き換えは必須ですが。
長文失礼しました。
ssgの件考えてみます。
回避コードだけでなく汎用的な所持金などのの変更も出来ると便利そうですね。
シリーズが多いので大変かもしれませんが、時間があればやってみたいです。
その際は色々と参考にさせて頂きたいと思いますのでよろしくお願い致します。
確認していませんが情報ありがとうございます。
ちなみにRGSS103J.dllの(ここでいう)回避コードのssgは猫缶INDEXの「投稿データ掲載所」にあります。
一部おかしな(?)RGSS103J.dllを同梱したゲームもありますが。(例:FANTASY WORLD ver.1.20)
確かに、ゲーム自体は稼働したのですが・・・どういうわけか
デバックモードが機能しないようです。
ゲーム自体はフリーで配布されてる物なんですが。。。orz
原因と思われる可能性と思いつく限りの対処法を書いてみます。
@Game.exeが改造済みである。
(対処法)再度そのゲームをDLし直す等で対応
Aそのゲームがランタイム(RGSS202J.dll)を同梱していて、更にそのファイルが通常とは違うものである
(対処法1)ゲームタイトルを書いた上で報告
(対処法2)自力で探す。
自分なりの探し方を書いてみます。
@ねこまんまの16進数検索で
8B018B50048B
を検索。自分の環境&通常のdllでは1008AE64がヒット。
ARGSS202J.dllを逆アセンブル。Hexダンプが
0000・・・・
というように00が続いている領域を探す。
自分の環境&通常のdllでは100FE510をコードの先頭アドレスに選択。
B1008AE64の命令を書き換え。
自分の環境&通常のdllでは
CALL 100FE510
バイト列は
E8A7360700
になりました
Cコード作成
1008AE64-E8A7360700
100FE510-8B018B500485D2750D85DB750985F6750585FF750142C3
RGSS104J.dllの「おっさん or die」のデバッグについて簡単に解析してみましたが
通常であればあるはずのデバッグモードフラグへのアクセスが全くないので
(デバッグメニューは常時、壁抜けは移動時にフラグを読み取っている)
デバッグ機能自体が削除されているか、無効化されているのかもしれません。
(そういったことが出来るのかわかりませんが…)
現状のところさっぱりといった感じです。
ちなみに猫缶INDEXのRGSS103J.dllのSSGはデバッグフラグのONOFFのみのようです。
RGSS103J.dllにも新旧があるようですね。その2種類に対応されていました。
(FANTASY WORLD ver.1.20のが古いもの)
↑↑のRPGツクールVX(RGSS202J.dll)でデバックモードが機能しないという方も
デバッグの無効化がされている可能性がありそうですので
タイトルを教えてもらえるとありがたいです。
どろっぷふぁくとりーってやつです。
ちなみに、この他に幾つか・・・
RPGツクールVXで作られて販売されているRPGがありますね。
同様に、デバックモード自体機能しないみたいですね。
あと、VXAce作られた物でも同様の現象の物が存在するようです。
質問。メモリパッチや回避コードでポインタを使っている理由は何ですか?ポインタで飛んだ先も起点となる(同じ)モジュール内にあるのだからポインタを使わなくてもよさそうなのですが。
あと、細かいことですが、VX Aceのモジュール名に「J」は不要です。
「おっさん or die」をRPGツクールVXリーダーで覗いてみたら、アイテム名が謎の文字列に置き換わっていました。RPGツクールXP セーブデータ改造ツール Pro(最近フリーウェア化)では正常に表示されました。
2000や2003も解析してみました。データはそのままなんの変換もなく格納サれており、多重ポインタも最大3(ssgの[:と:]のセットで1と数えると)という程度でした。
アイテムリストの取得方法は自分の知る限りRPGツクール2000/2003 セーブデータ改変ツールのアイテムリストを丸写しするくらいです。ちなみにjoydel(joykeyの付属ソフト)でパッドを無効化しても起点は変わらない模様です。
ついさっき落として検証してみました。自分の環境では普通にデバッグモード(回避コード)を使えました。多分Game.exeが改造されているのが原因だと思われます。
Game.exeを改造すると多少はRGSS202J.dllの領域に影響を及ぼすみたいです。(XPの「おっさん or die」ではそうだった。)
自分が使ったコードを一応書いてみます。(ssg用、便宜上カンマで改行あり)
[subject]デバッグモード:b_toggle,
_(MName::RGSS202J.dll),ssl->debug_chn,offset
[group]debug_chn
0x0FE510,8B018B500485D2750D85DB750985F6750585FF750142C3
,0000000000000000000000000000000000000000000000
0x08AE64,E8A7360700,8B018B5004
[/group]
ついでにいうと、このゲームは猫缶Indexのkn氏作のらんだむダンジョンのssgがリストを変更すればそのまま使える模様です。
どろっぷふぁくとりーを私の方でも確認してみましたが、掲載している回避コードで
問題なくデバッグモードに出来ました。
例えば管理者として起動していないだとか、既に改造済みのGame.exeだとか
何か別の問題で改造出来ていないのかもしれません。
>>リックさん
回避コードは上の方のコメントにもあるように様々なデータを読み出している
ルーチンにデバッグメニュー、壁抜けからフラグへのアクセスのみONにする
というプログラムを追加して、それをコード化したものです。
「おっさん or die」だとそもそもフラグへのアクセス自体がないので
この方法ではどうしようもない状態です。
質問のポインタを使っている理由ですが、環境によってズレが起きないよう
基本的に元々のプログラム通りそのままコードにしています。
回避コードはSSGなら↑の_(MName::RGSS202J.dll)のようにDLLを起点にするのが
良さそうですね。
それと「J」のご指摘ありがとうございました。修正しました。
2000や2003の場合はデバッグモードのアドレスへのポインタもデバッグモードのアドレスもモジュールRPG_RT.exe内にありますが、それでも環境によりズレが生じたりするのでしょうか?あるいは、全ver.のRPG_RT.exeに対応するためのものなのでしょうか?
1つ上の問題は自己解決しました。お騒がせしました。最近ツクールXP以降のssgばっかり作っていたので(1度構文を作ればほとんど流用可能&プログラム見なくても感覚でポインタ探索できるようになった)逆アセンブラのプログラムを逆に辿るという基本を忘れていました。.exeの中に入ってもまだ安心できないことを思い出しました。
ツクールのssgで思い出したのですが、
www.necocan.info/supb2/x/topics.cgi?mode=res&no=3237
の[153](No.9314)にRPGツクールシリーズ(2000〜VXまで)ある程度汎用性のあるssgがありました。これが自己解決の鍵になりました。
連投すみませんでした。
未初期化のグローバル変数や静的変数の領域ですので
アドレスが変動したり、ズレることもないとは思います。
本当に念のため、元々のアセンブラのプログラム通りにしたという感じです。
例えば.bssセクションまでポインタ探索したRPGツクール2003のゲーム「POKEMON FANTASY」用に作ったSSGは同じツクール2003のゲーム「どらえもんのび太のFINAL FANTASY」では使える気配がありませんでしたが、.dataセクションまでポインタ探索したものは「どらえもんのび太のFINAL FANTASY」でも使えそうでした。
ちなみに、アリスソフトのSystem3.xのいくつかのゲームも解析したことがあるのですが、やはり起点が.exeなら.dataセクションを起点とするのが正解のようです。
追伸:
最近SRPGツクール95の「メイドさんと最低の野郎ども」に手を出してみました。デバッグモードで何ができるのかに興味があるので、時間があったらでいいので対応お願いします。
環境で変動は無くても、ゲーム事に変動してしまうんですね。
.dataセクションは初期化されたデータの領域なので、ゲームが変わっても
同じデータですが.bssセクションはどこにどの値が入るかが
わからないってことですか。
汎用システムですもんね。ようやく見えて来ました。
SRPGツクール95の件了解です。
今やってる解析が終わったら取り掛かろうと思います。
「SRPGEXEC.EXE」を見てみましたがそれらしい文字列は見つからず
よくわかりませんでした。
検索すると「デバックでスイッチのオンオフ確認はできても変更ができない」
とあるので、一応デバッグ機能はありそうですが…
2013年05月30日 03:38に書いたURLの場所にSRPGツクール95用のプログラム改変系のssgがありまして、そのSSGで十分楽しむことができました。
上記URLには思わぬ掘り出し物があることが多いのでたびたび覗いてみるのもよさそうですね、更新は止まっていますが。
上記のツールで暗号化したツクール2000シリーズ製のゲームをデバッグできるようにできますか?
ちらっと目を通しただけなので、はっきりとは言えませんが
デバッグ機能自体が無いように思えます
なるほど
デバッグしたい時は暗号化ツールを無効化してRTPで動かせるようにしないとできないということですね
デバッグモードのSSGを公開しました。
ゴールドの改造なんかもいずれ入れていきたいですね。
しばらくは時間が取れそうもないですが…
2000/2003のデバッグモードのメモリパッチ版が消えてますね。何か問題でもあったのでしょうか?ssgではアドレス補正版になってるみたいですし。
ここで一つ質問です。VXACEの回避コードをONにした時のCALL命令のジャンプ先はRGSS300.dllの場合は
_(MName::RGSS300.dll)+0x1A1E40から
MOV EAX,[ECX] (8B01)
MOV EDX,[EAX+4] (8B50 04)
(以下略)
という意味で書かれていると思いますが、
うさみみでは
_(MName::RGSS300.dll)+0x1A1E3F
から
ADD [EBX+4508B01],CL (008B 018B5004)
(以下略)
というように認識されていますが大丈夫なのでしょうか?
RGSS301.dllの場合も同様の現象が見られます。
ちなみに使用はできますが、違和感を感じたので質問させて頂きました。
改造コードでの公開をやめ、全てに対応できるようSSGのサーチを
利用することにしました。
質問についてですが、「code cave」と呼ばれるコードの無い空間(00のところ)
にコードを書き込むと、デバッガが誤認識してしまうことがあります。
プログラム上は全く問題ないので大丈夫ですよ。
フラグ回避コードVX用(デバッグモード(RGSS202J.dll))のを使用しても
確かに正常には可動はするのですが、デバックモードへ入れないようです
※ゲーム自体は最新版を使用しました。
自分はここで公開されているデバッグモードのSSGのコードで
問題なくデバッグモードに出来ました。
例えば管理者として起動していないだとか、既に改造済みのGame.exeだとか
何か別の問題で改造出来ていないのかもしれません。
有料のゲームのようでしたので、私の方では確認していないのですが
以前にもRGSS202J.dllでデバッグモードにならないというものがあったので
何か問題があるのかもしれませんね。
念のためRTPの再インストールをお願いします。