HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0225
ganmaセーブファイルの書き換えを無効にする方法14解決


ganma

リンク

2009/2/25(Wed) 12:44:57|NO.23589

僕は今RPG風のゲームを作っていますが、
最近セーブデータが簡単に書き換えられることが
気になってきました。

自分なりに調べてみたのですが
なかなか理解できません。

現在は数値を足したり引いたりした数値を
保存して、それが間違っていたらデータを最弱にしてます。

ご指導よろしくお願いします。

http://www.geocities.jp/ganma0108/hsp/elfeed3.html
↑問題のゲームのDL先



この記事に返信する


SYAM

リンク

2009/2/25(Wed) 13:21:07|NO.23590

マジな「暗号化」をしようとすると、すっごい勉強が必要です。おいそれと理解できるもんじゃないとは思います。
が、
ゲームのデータを書き換えられないようにする程度のことならそこまで勉強しなくても、いくつかの計算を組み合わせればコト足りると思います。

足したり引いたりもその手段のひとつですし、
特定の数値と XOR 演算するというのもあります。(※過去ログに何度かXORを使った簡単な暗号化みたいなのが出てます)
また、全然関係ない乱数値を混ぜておいて、読み出すときには無視するなんてのも、組み込むのが簡単で、しかし解析する側にとってはものすごく鬱陶しい手口です。

また、RPGであれば、
いきなりエラーにしたり最弱にしたりなどのように、改造を検出したことを即座にユーザーに知らせてしまうのではなく、
「改造されたデータも一見そのままロードして動いているように見せかけておいて、実はどこかのフラグが立たなくなっていてシナリオ進行しない」
……などのような挙動にすると、さらに意地悪です。
改造する側にとってみれば、改造に成功したかどうかさえすぐにはわからなくなるわけですから。



ganma

リンク

2009/2/25(Wed) 17:20:13|NO.23592

お早い回答ありがとうございます。
アドバイスは早速やってみます!

追加で質問なんですが、
上のゲームでは一応数字は書き換えにくい状況なんですが
名前や技名、武器名などは書き換えられてしまうんです。
それも書き換えられないようにできませんか?

よろしくお願いします。



コンテスト出品者

リンク

2009/2/25(Wed) 18:51:49|NO.23594

文字コードを数値データに置き換えて、暗号化して保存。
ロード時は逆の手順で復号化。
これではダメなのでしょうか?



Mimura

リンク

2009/2/25(Wed) 19:49:58|NO.23597

横から失礼します。

文字列暗号は、 peek 〜 poke や サイズを2の倍数にして wpeek 〜 wpoke
を用いてバイトデータを取得し、値を暗号計算して書き込むといった方式がベターとなると思います。

また、
書き換えられるか書き換えられないか。という点では微妙ですが、
書き換えられたことをはっきりと検出する方法としましては、
ハッシュ値を計算して、暗号化ファイルの先頭か何かに書き込んでおき、
読み込み時に、再度ハッシュを計算して、値が同一かどうかを比較する方法があります。

その値があわなければ改竄されていることが検出できますので、
エラー処理 or 意地悪な仕組みを行うというのはいかがでしょうか。



GENKI

リンク

2009/2/25(Wed) 20:10:25|NO.23598

もう他の方が解説してるので言えることが残ってないみたい…。
とうことで参考資料どうぞ。
http://hspdev-wiki.net/?%B0%C5%B9%E6%B2%BD



ganma

リンク

2009/2/26(Thu) 04:44:14|NO.23605

	a="あいうえお"
b=peek(a,0) ; mes "元データ" mes a mes b ; randomize 10000 mes "\n暗号" b+rnd(100) poke a,0,b poke a,2,b poke a,4,b poke a,6,b poke a,8,b mes a mes b ; randomize 10000 mes "\n解析" b-rnd(100) poke a,0,b poke a,2,b poke a,4,b poke a,6,b poke a,8,b mes a mes b
理解の仕方としてはこれでいいのでしょうか?



夢現因果

リンク

2009/2/26(Thu) 08:51:28|NO.23606

不慣れなものなので見当違いならすみません

「notesave」命令を使っていられるんですよね?
「bsave」命令にしてはいかがでしょうか?



ganma

リンク

2009/2/26(Thu) 09:38:22|NO.23607

すみませんが、「bsave」と「noteseve」の違いが
今ひとつわかりません。
詳しく教えていただけないでしょうか?



check

リンク

2009/2/26(Thu) 09:39:01|NO.23608

>ganma
そんな感じでOK。
ただ、世の中にはxor演算という便利なものが存在しているぞ。

enc=100 mes enc enc^50 mes enc dec=enc^50 mes dec



check

リンク

2009/2/26(Thu) 09:40:42|NO.23609

bsave : 変数を直接指定してその変数の値をファイルに書き込む
notesave : noteselで指定した変数の値を書き込む



夢現因果

リンク

2009/2/26(Thu) 10:44:30|NO.23611

「notesave」命令はテキストファイルとして保存します
ファイルの中身を見せる必要がない時は「bsave」命令が良いと思います

ただ「bsave」命令にも暗号化が必要かどうかはわかりません
あえて解析しようとしない限りは大丈夫だとは思います



ganma

リンク

2009/2/26(Thu) 12:06:15|NO.23614

bsaveの事は了解です。
暗号化のスプリクトですが、
	a="abcdefg\nhijklmn\nopqrstu\nvwxyz"
mes "元データ" mes a re=strlen(a) mes "\n暗号" repeat re b=peek(a,cnt) b=b^373 poke a,cnt,b loop mes a mes "\n解析" repeat re b=peek(a,cnt) b=b^373 poke a,cnt,b loop mes a
こんな感じで作ってみました
どうでしょうか?



check

リンク

2009/2/26(Thu) 12:12:47|NO.23615

いいと思うが、暗号化のやり方を公表したのだからその方法は使えないなw
まあ、基本が分かればそこから応用できるはず。



ganma

リンク

2009/2/26(Thu) 12:29:32|NO.23617

うっかりしてましたw
でも一応暗号化は理解できたので
解決にしておきます。

皆さん長々と付き合ってくださって
ありがとうございました。



ONION software Copyright 1997-2021(c) All rights reserved.