des 2019/09/21 12:13

【小ネタ】引数対策

定期進捗

(今やってる事)
・バグ取り
・演出やUIの修正
・アイコンの作成
(前回の記事についてあれから)
・2つ目の問題に関しては良い解決策を思いついたので問題はなくなりました。(エロを求めている方にはちょっとどころではなく大変な仕様になりそうですが……)
・1つ目の問題は…………。



下に貼った画像を隠したかったので演出用に作った画像でカモフラージュ

本題

今回も小ネタ(というより急いで対策した挙動)です。

注意

今回の内容はあまり広げるべきではない内容なのですが、過去の内容も十分広げるべきではない内容ですのでネタと備忘録として記事に残しておきます。

色々調べ物をしていた所、ウディタの開発者であるSmokingWOLF氏が2011年にこのような呟きをしていたのを見つけました。
https://twitter.com/WO_LF/status/30203006473474049

知らなかった そんなの・・・(画像略)
……公式チート機能じゃないですかこれ。

問題点

・基本システムのような「元々何が入るか決まっている枠」の書き換えが容易にできてしまう。
・セーブで保存される部分はセーブする事で以降も保持できてしまう。
・F12キーやタイトルに戻るで初期化した時は再び代入される。
・変数呼び出し値で設定可能な場所であればなんでも書き換えられる。
 ただし保存されない部分はセーブデータをロードする事で元の値に戻される、と思われる。
(UDBを変更した場合の参考動画)

試してみた

※画像の枚数が多くなりそうでしたのでbatファイルの内容をそのまま貼り付けてあります。
※文字列の代入はUTF-8で保存したbatファイルだと文字化けします。BOM付きで保存するとGame.exeが起動すらしません。文字コードをShift-JISかANSIにする事で確認した限りでは正常に表示されてました。
※条件は分かりませんが、変数を変更した後に文字列変数を変更して起動しようとすると起動しなくなる事があります。その時は文字コードの再設定をすると解消できます。

通常変数

Start Game.exe -vinput 2000000 16

文字列変数

Start Game.exe -sinput 3000000 あ

コモンセルフ変数

Start Game.exe -vinput 15000000 99

システム変数

※Sys110番の「現在の乱数のシード」を使用
Start Game.exe -vinput 9000110 255

可変データベース

Start Game.exe -sinput 1100000000 文章

ユーザーデータベース

Start Game.exe -sinput 1000000000 ウホウホ

システムデータベース

※弄っても面白い物がないのでSDB12番にある文字色の変更を使用
Start Game.exe -vinput 1312000000 255 -vinput 1312000001 0 -vinput 1312000002 0

セルフ変数

Start Game.exe -vinput 1000000 16
→ウインドウは立ち上がるもののすぐに強○終了。

弄られる事によって生じる問題

致命的な物

・ユーザーデータベースの値を弄る事により装備のパラメータやアイテムの効果を任意の値に設定できるため容易にバランスを破壊できます。
・特定のフラグを立てたりできる為、データの保存方法によってはゲームとして成立しなくなります。
(同人エロゲとしての観点だとフラグ管理をスイッチのように管理している場合は回想シーンを無理やり全開放できる場合があります。)

対策

この隠し機能を本気で対策するとなると以下のような処理を組む必要があり、はっきり言ってかなり面倒くさいです。

対策方法の一例(括弧内に各動作の詳細)

1.通常変数かどこかにフラグ管理用の変数を用意し、該当の変数が条件を満たしていれば起動時に自動実行されるコモンイベントを作っておく。(4の処理が終わり次第遊べるようにするためのイベントを書く)
2.起動した直後に全てのCDB、通常変数、システム変数、文字列変数、コモンセルフ変数を初期化する。(セーブで保存される部分の初期化処理、CSV化しておき起動時に読み込むのが簡単?)
3.はじめからを押したら、直後に使わないマップへ移動させフラグ管理用の変数を立て、使わない枠にセーブ。セーブ完了後すぐに該当セーブデータをロードする。(セーブで保存されない部分の初期化処理。使わないマップに移動させないとマップに自動実行イベントが設定されている場合にマップイベントが優先される)
4.1でイベントを作ったならば3でセーブデータをロードした時に1のイベントが起こるようになるので、フラグ管理用のフラグを消した状態でセーブし直し1のコモンイベントを経由してはじめから遊べるようにする。

……オンライン対応だとこのくらい対策をしなきゃいけない気もしますが、今回は「データを弄る方法が他にある以上、弄りたいなら弄れるようにする」というスタンスを貫き複数の回避方法を取れる雑な方法で対策しました。

凄く雑な対策

■文字列操作:CSelf5 =<→のフォルダのファイルリスト取得> ""
■文字列操作:CSelf5 =<から文字列を置換> "B" → "b"
■文字列操作:CSelf5 =<から文字列を置換> "A" → "a"
■文字列操作:CSelf5 =<から文字列を置換> "T" → "t"
▼ batファイルが含まれているなら起動を中断
■条件分岐(文字): 【1】 CSelf5が ".bat" を含む
-◇分岐: 【1】 CSelf5 ".bat" を含む の場合↓
|■ループ開始
| |■ウェイト:1 フレーム
| |■
|◇ループここまで◇◇
|■
◇分岐終了◇
■文字列操作:CSelf5 = ""

上の説明

1.まずGame.exeがあるフォルダのファイルリストを取得
2.拡張子に大文字が含まれていると正しく判定できないので該当文字列を全て小文字に変更
3.拡張子がbatのファイルがあれば無限ループを起こすよう条件分岐
※凄く雑な対策ですので「.bat.txt」等のファイル名に複数の拡張子が含まれている場合に誤検出が起きます。

という訳で引数対策の記事でした。
あとで色々直さないと……。

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索