SharedObject の中身いじってみた

前置き
こういうことやる人がいるからコンピューターウイルスがなくならないのだ。でも、防衛のために知らなきゃいかん(キリッ。今回はローカルにデータ保存するとこういうケースは絶対あるから、Flash 使って開発するなら考慮したほうがよいね。というような教訓。

SharedObjectとは
Flash のゲームは、スコアやセーブデータ等を SharedObject っていうキャッシュみたいなもんに格納していく。これは何もゲームに限ったことじゃなく、用途はともあれデータの蓄積に使われる。イヤなら Flash のローカル保存の設定?みたいなのでキャッシュしないこともできる。(システムで考慮されてないことも多いけどねっ)

んで、実際の中身は AMF0 とか AMF3 とかで記述されているのだけど、テキストエディタとかじゃ見れない。AMF の中身はバイナリなのだ。詳しくは自分もよくしらないけど、FMSとか使って RTMP でおしゃべりしたり、LocalConnection だったり ExternalInterface だったり使って、別のFlashじゃないシステムとおしゃべりする場合に役立ったりするから、そういうことしたい人は自分で調べてね。俺もしらん(キリッ

SharedObject の中身をいじるには
Macだとターミナルを使って見れる。Windowsも「バイナリエディタ」とかで検索したものを使うとよいと思う。今回はMacVimでいじってみる。Vimにはバイナリモードがあって、あるコマンドを打つと16進数の並びが表示される。こいつを編集することで SharedObject がいじれる。
vimでバイナリを表示し、値を変更したい - rderaログ ← このブログを参考にしました。感謝。

~$ vi -b hogehoge.sol

でviをバイナリモードで開いて、

:%!xxd

で16進数で表示

:%!xxd -r

で元に戻して

:wq

で保存・終了
みたいな感じ。
上のブログにあるように .vimrc を編集しておくと、バイナリを編集/保存するのがすごく楽になるからお試しあれ。


実践
今回は、http://babarageo.com/games/2007/08/post_66.htmlが面白かったから、こいつをいじってみた。
SharedObject の保存場所は割愛。調べてください。


とりあえず開いてみた
こんな感じのが表示されるはず

0000000: 00bf 0000 00cb 5443 534f 0004 0000 0000  ......TCSO......
0000010: 000c 6675 746f 6e61 6761 7361 7665 0000  ..futonagasave..
0000020: 0000 0006 6875 746f 7361 0041 2b77 4000  ....hutosa.A+w@.
0000030: 0000 0000 0006 6e61 6761 7361 0041 124f  ......nagasa.A.O
0000040: 8000 0000 0000 0002 6770 0041 e407 8294  ........gp.A....
0000050: 0000 0000 0003 736c 7600 41f0 f03a 3830  ......slv.A..:80
0000060: 0000 0000 0672 6f75 6e64 7300 4042 8000  .....rounds.@B..
0000070: 0000 0000 0000 0563 6f6c 6f72 0040 1000  .......color.@..
0000080: 0000 0000 0000 0005 7368 6170 6500 4000  ........shape.@.
0000090: 0000 0000 0000 0000 0c6d 6173 7465 7276  .........masterv
00000a0: 6f6c 756d 6500 4059 0000 0000 0000 0000  olume.@Y........
00000b0: 0570 7379 6368 003f f000 0000 0000 0000  .psych.?........
00000c0: 0005 6865 6172 7400 3ff0 0000 0000 0000  ..heart.?.......
00000d0: 00                                       .

左から、行番号、実際のテキスト、アスキーコードに変換したときの文字列、だったと思う(汗)。適当にこれをコピペ保存して、SWFをリロードするだけでもこのデータが反映される。

あたりをつけてみた
アスキーコードの方から考える。どうやらデータのプロパティには hutosa, nagasa, gp, slv, rounds, color, shape, mastervolume, psych, heartっていうのがありそうだぞと。じゃあ、hutosa いじったらどうなるのだろうか。

データいじってみる
適当にhutosaの文字列の後ろの16進数をひとつすすめてリロードしてみる。
あれ。。。反映されないや。

データいじってみる2
gp っていうのいじってみた。お、金がふえたぞ!こいつは金か。だけど、変更するとこ間違えると、小数点出てくるね。。。w double のままなんだね。

データいじってみる3
slv っていうのいじってみた。お、強さが変わった!じゃあ、これと、太さと長さを変更すると。。。
つえぇ!
俺、TUEEEEEEEEEEEEEEEE

そんな感じ。


※飽くまでSharedObjectの研究です。悪用しないようにお願いします。