メインコンテンツへスキップ

ジサツのための101の方法 データ

··2242 文字·5 分·
VisualNovel
著者
gf
目次

推敲せずに思いのままに書きなぐったので、話題が飛びまくったり、関係ない話が多かったり、文がめちゃくちゃだったりすると思うので覚悟、対処してくれ。
どうせほぼ読まれないだろうから時間がもったいない。

ジサツのための101の方法とは
#

エロゲ。

🔗Wikipedia

解析
#

ゲームファイルの中身を見たかったのでコードを解析して3日ぐらいで発狂しながらシコシコと復号化プログラムを書いた。

modernな人間になるために最初はpythonでやろうと思ったが、バイト列のキャストなどの取り扱いが悪すぎたので結局C++を使うことになった。


まあともかくだ。

生き苦しい諸般の事情であまり詳細は書けないが、中身についてざっとまとめておくことにした。

ファイル
#

暗号化されているdata.datから抽出。

001C.FOB_final.bin
001C.FOB_second.bin
002C.FOB_final.bin
002C.FOB_second.bin
003C.FOB_final.bin
003C.FOB_second.bin
004C.FOB_final.bin
004C.FOB_second.bin
005C.FOB_final.bin
005C.FOB_second.bin
006C.FOB_final.bin
006C.FOB_second.bin
007C.FOB_final.bin
007C.FOB_second.bin
008C.FOB_final.bin
008C.FOB_second.bin
010C.FOB_final.bin
010C.FOB_second.bin
011C.FOB_final.bin
011C.FOB_second.bin
012C.FOB_final.bin
012C.FOB_second.bin
013C.FOB_final.bin
013C.FOB_second.bin
014C.FOB_final.bin
014C.FOB_second.bin
015C.FOB_final.bin
015C.FOB_second.bin
016C.FOB_final.bin
016C.FOB_second.bin
017C.FOB_final.bin
017C.FOB_second.bin
018C.FOB_final.bin
018C.FOB_second.bin
019C.FOB_final.bin
019C.FOB_second.bin
020C.FOB_final.bin
020C.FOB_second.bin
021C.FOB_final.bin
021C.FOB_second.bin
022C.FOB_final.bin
022C.FOB_second.bin
023C.FOB_final.bin
023C.FOB_second.bin
024C.FOB_final.bin
024C.FOB_second.bin
025C.FOB_final.bin
025C.FOB_second.bin
026C.FOB_final.bin
026C.FOB_second.bin
027C.FOB_final.bin
027C.FOB_second.bin
028C.FOB_final.bin
028C.FOB_second.bin
029C.FOB_final.bin
029C.FOB_second.bin
030C.FOB_final.bin
030C.FOB_second.bin
031C.FOB_final.bin
031C.FOB_second.bin
032C.FOB_final.bin
032C.FOB_second.bin
033C.FOB_final.bin
033C.FOB_second.bin
034C.FOB_final.bin
034C.FOB_second.bin
035C.FOB_final.bin
035C.FOB_second.bin
036C.FOB_final.bin
036C.FOB_second.bin
037C.FOB_final.bin
037C.FOB_second.bin
038C.FOB_final.bin
038C.FOB_second.bin
039C.FOB_final.bin
039C.FOB_second.bin
040C.FOB_final.bin
040C.FOB_second.bin
041C.FOB_final.bin
041C.FOB_second.bin
042C.FOB_final.bin
042C.FOB_second.bin
043C.FOB_final.bin
043C.FOB_second.bin
044C.FOB_final.bin
044C.FOB_second.bin
044SUBC.FOB_final.bin
044SUBC.FOB_second.bin
045C.FOB_final.bin
045C.FOB_second.bin
046C.FOB_final.bin
046C.FOB_second.bin
047C.FOB_final.bin
047C.FOB_second.bin
048C.FOB_final.bin
048C.FOB_second.bin
048SUBC.FOB_final.bin
048SUBC.FOB_second.bin
049C.FOB_final.bin
049C.FOB_second.bin
050C.FOB_final.bin
050C.FOB_second.bin
051C.FOB_final.bin
051C.FOB_second.bin
052C.FOB_final.bin
052C.FOB_second.bin
053C.FOB_final.bin
053C.FOB_second.bin
054C.FOB_final.bin
054C.FOB_second.bin
055C.FOB_final.bin
055C.FOB_second.bin
056C.FOB_final.bin
056C.FOB_second.bin
057C.FOB_final.bin
057C.FOB_second.bin
058C.FOB_final.bin
058C.FOB_second.bin
059C.FOB_final.bin
059C.FOB_second.bin
060C.FOB_final.bin
060C.FOB_second.bin
061C.FOB_final.bin
061C.FOB_second.bin
062C.FOB_final.bin
062C.FOB_second.bin
063C.FOB_final.bin
063C.FOB_second.bin
064C.FOB_final.bin
064C.FOB_second.bin
065C.FOB_final.bin
065C.FOB_second.bin
066C.FOB_final.bin
066C.FOB_second.bin
067C.FOB_final.bin
067C.FOB_second.bin
068C.FOB_final.bin
068C.FOB_second.bin
069C.FOB_final.bin
069C.FOB_second.bin
070C.FOB_final.bin
070C.FOB_second.bin
071C.FOB_final.bin
071C.FOB_second.bin
072C.FOB_final.bin
072C.FOB_second.bin
073C.FOB_final.bin
073C.FOB_second.bin
074C.FOB_final.bin
074C.FOB_second.bin
075C.FOB_final.bin
075C.FOB_second.bin
076C.FOB_final.bin
076C.FOB_second.bin
077C.FOB_final.bin
077C.FOB_second.bin
078C.FOB_final.bin
078C.FOB_second.bin
079C.FOB_final.bin
079C.FOB_second.bin
080C.FOB_final.bin
080C.FOB_second.bin
081C.FOB_final.bin
081C.FOB_second.bin
082C.FOB_final.bin
082C.FOB_second.bin
083C.FOB_final.bin
083C.FOB_second.bin
084C.FOB_final.bin
084C.FOB_second.bin
085AC.FOB_final.bin
085AC.FOB_second.bin
086C.FOB_final.bin
086C.FOB_second.bin
087C.FOB_final.bin
087C.FOB_second.bin
088C.FOB_final.bin
088C.FOB_second.bin
089C.FOB_final.bin
089C.FOB_second.bin
090C.FOB_final.bin
090C.FOB_second.bin
091C.FOB_final.bin
091C.FOB_second.bin
092C.FOB_final.bin
092C.FOB_second.bin
093C.FOB_final.bin
093C.FOB_second.bin
094C.FOB_final.bin
094C.FOB_second.bin
095C.FOB_final.bin
095C.FOB_second.bin
096C.FOB_final.bin
096C.FOB_second.bin
097C.FOB_final.bin
097C.FOB_second.bin
098C.FOB_final.bin
098C.FOB_second.bin
099C.FOB_final.bin
099C.FOB_second.bin
0.FOB_final.bin
0.FOB_second.bin
100C.FOB_final.bin
100C.FOB_second.bin
101C.FOB_final.bin
101C.FOB_second.bin
102C.FOB_final.bin
102C.FOB_second.bin
103C.FOB_final.bin
103C.FOB_second.bin
104C.FOB_final.bin
104C.FOB_second.bin
105C.FOB_final.bin
105C.FOB_second.bin
106C.FOB_final.bin
106C.FOB_second.bin
107C.FOB_final.bin
107C.FOB_second.bin
108C.FOB_final.bin
108C.FOB_second.bin
109C.FOB_final.bin
109C.FOB_second.bin
200C.FOB_final.bin
200C.FOB_second.bin
201C.FOB_final.bin
201C.FOB_second.bin
202C.FOB_final.bin
202C.FOB_second.bin
203C.FOB_final.bin
203C.FOB_second.bin
204C.FOB_final.bin
204C.FOB_second.bin
205C.FOB_final.bin
205C.FOB_second.bin
206C.FOB_final.bin
206C.FOB_second.bin
207C.FOB_final.bin
207C.FOB_second.bin
208C.FOB_final.bin
208C.FOB_second.bin
209C.FOB_final.bin
209C.FOB_second.bin
210C.FOB_final.bin
210C.FOB_second.bin
211C.FOB_final.bin
211C.FOB_second.bin
212C.FOB_final.bin
212C.FOB_second.bin
213C.FOB_final.bin
213C.FOB_second.bin
214C.FOB_final.bin
214C.FOB_second.bin
215C.FOB_final.bin
215C.FOB_second.bin
216C.FOB_final.bin
216C.FOB_second.bin
217C.FOB_final.bin
217C.FOB_second.bin
218C.FOB_final.bin
218C.FOB_second.bin
219C.FOB_final.bin
219C.FOB_second.bin
220C.FOB_final.bin
220C.FOB_second.bin
221C.FOB_final.bin
221C.FOB_second.bin
222C.FOB_final.bin
222C.FOB_second.bin
223C.FOB_final.bin
223C.FOB_second.bin
224C.FOB_final.bin
224C.FOB_second.bin
225C.FOB_final.bin
225C.FOB_second.bin
226C.FOB_final.bin
226C.FOB_second.bin
227C.FOB_final.bin
227C.FOB_second.bin
228C.FOB_final.bin
228C.FOB_second.bin
229C.FOB_final.bin
229C.FOB_second.bin
230C.FOB_final.bin
230C.FOB_second.bin
231C.FOB_final.bin
231C.FOB_second.bin
232C.FOB_final.bin
232C.FOB_second.bin
232SUBC.FOB_final.bin
232SUBC.FOB_second.bin
233C.FOB_final.bin
233C.FOB_second.bin
234C.FOB_final.bin
234C.FOB_second.bin
235C.FOB_final.bin
235C.FOB_second.bin
236C.FOB_final.bin
236C.FOB_second.bin
237C.FOB_final.bin
237C.FOB_second.bin
238C.FOB_final.bin
238C.FOB_second.bin
239C.FOB_final.bin
239C.FOB_second.bin
240C.FOB_final.bin
240C.FOB_second.bin
241C.FOB_final.bin
241C.FOB_second.bin
242C.FOB_final.bin
242C.FOB_second.bin
243C.FOB_final.bin
243C.FOB_second.bin
244C.FOB_final.bin
244C.FOB_second.bin
245C.FOB_final.bin
245C.FOB_second.bin
246C.FOB_final.bin
246C.FOB_second.bin
247C.FOB_final.bin
247C.FOB_second.bin
248C.FOB_final.bin
248C.FOB_second.bin
249C.FOB_final.bin
249C.FOB_second.bin
ALBUM01.BMP
ALBUM02.BMP
ALBUM03.BMP
ALBUM04.BMP
ALBUM05.BMP
ALBUM06.BMP
ALBUM07.BMP
ALBUM_CURSOL.BMP
BG.FOB_final.bin
BG.FOB_second.bin
BGM.FOB_final.bin
BGM.FOB_second.bin
BLACK.BMP
CAUTION.BMP
CG01.BMP
CG02.BMP
CG03.BMP
CG04.BMP
CG05.BMP
CG06.BMP
CG07.BMP
CG08.BMP
CG09.BMP
CG10.BMP
CG11.BMP
CG12.BMP
CG13.BMP
CG14.BMP
CG15.BMP
CG16.BMP
CG17.BMP
CG18.BMP
CG19.BMP
CG20.BMP
CG21.BMP
CG22.BMP
CG23.BMP
CG24.BMP
CG25.BMP
CG26.BMP
CG27.BMP
CG28.BMP
CG29.BMP
CG30.BMP
CG31.BMP
CG32.BMP
CG33.BMP
CG34.BMP
CG35.BMP
CG36.BMP
CG37.BMP
CG38.BMP
CG39.BMP
CG40.BMP
CG41.BMP
CG42.BMP
CG43.BMP
CG44.BMP
CG45.BMP
CG46.BMP
CG47.BMP
CG48.BMP
CG49.BMP
CG50.BMP
CG51.BMP
CG52.BMP
CG53.BMP
CG54.BMP
CG55.BMP
CG56.BMP
CG57.BMP
CG58.BMP
CG59.BMP
CG60.BMP
CG61.BMP
CG62.BMP
CG63.BMP
CG64.BMP
CG65.BMP
CG66.BMP
CG67.BMP
CG68.BMP
CG69.BMP
CG70.BMP
CG71.BMP
CG72.BMP
CG73.BMP
CG.FOB_final.bin
CG.FOB_second.bin
DATA.FOB_final.bin
DATA.FOB_second.bin
DUKE.BMP
ENDING回想.BMP
G1C.FOB_final.bin
G1C.FOB_second.bin
G2_1C.FOB_final.bin
G2_1C.FOB_second.bin
G2_2C.FOB_final.bin
G2_2C.FOB_second.bin
G2C.FOB_final.bin
G2C.FOB_second.bin
G2SUBC.FOB_final.bin
G2SUBC.FOB_second.bin
G3C.FOB_final.bin
G3C.FOB_second.bin
G3SUBC.FOB_final.bin
G3SUBC.FOB_second.bin
HCG01.BMP
HCG02.BMP
HCG03.BMP
HCG04.BMP
HCG05.BMP
HCG06.BMP
HCG07.BMP
HCG08.BMP
HCG09.BMP
HCG10.BMP
HCG11.BMP
HCG12.BMP
HCG13.BMP
HCG14.BMP
HCG15.BMP
HCG16.BMP
HCG17.BMP
HCG18.BMP
HCG19.BMP
HCG20.BMP
HCG21.BMP
HCG22.BMP
HCG23.BMP
HCG24.BMP
K01.FOB_final.bin
K01.FOB_second.bin
K02.FOB_final.bin
K02.FOB_second.bin
K03.FOB_final.bin
K03.FOB_second.bin
K04.FOB_final.bin
K04'.FOB_final.bin
K04.FOB_second.bin
K04'.FOB_second.bin
K05.FOB_final.bin
K05'.FOB_final.bin
K05.FOB_second.bin
K05'.FOB_second.bin
K06.FOB_final.bin
K06.FOB_second.bin
K07.FOB_final.bin
K07.FOB_second.bin
K08.FOB_final.bin
K08.FOB_second.bin
K09.FOB_final.bin
K09.FOB_second.bin
K10.FOB_final.bin
K10.FOB_second.bin
K11.FOB_final.bin
K11.FOB_second.bin
K12.FOB_final.bin
K12.FOB_second.bin
K13.FOB_final.bin
K13.FOB_second.bin
K14.FOB_final.bin
K14'.FOB_final.bin
K14.FOB_second.bin
K14'.FOB_second.bin
K15.FOB_final.bin
K15.FOB_second.bin
K16.FOB_final.bin
K16.FOB_second.bin
KANNASP.FOB_final.bin
KANNASP.FOB_second.bin
KINJOUSP.FOB_final.bin
KINJOUSP.FOB_second.bin
MARU.BMP
MUSIC.BMP
RED.BMP
S1C.FOB_final.bin
S1C.FOB_second.bin
S2C.FOB_final.bin
S2C.FOB_second.bin
S3C.FOB_final.bin
S3C.FOB_second.bin
S4C.FOB_final.bin
S4C.FOB_second.bin
S5C.FOB_final.bin
S5C.FOB_second.bin
SAMOMOSP.FOB_final.bin
SAMOMOSP.FOB_second.bin
SCE204SEL.FOB_final.bin
SCE204SEL.FOB_second.bin
SCENARIOROOT.FOB_final.bin
SCENARIOROOT.FOB_second.bin
SE01.WAV
SE02.WAV
SE03.WAV
SE04.WAV
SE05.WAV
SE06.WAV
SE07.WAV
SE08.WAV
SE09.WAV
SE10.WAV
SE11.WAV
SE13.WAV
SE14.WAV
SE15.WAV
SE16.WAV
SE17.WAV
SE18.WAV
SE19.WAV
SE20.WAV
SE21.WAV
SE22.WAV
SE23.WAV
SE24.WAV
SE25.WAV
SE26.WAV
SE27.WAV
SE28.WAV
SE29.WAV
SE30.WAV
SE31.WAV
SE32.WAV
SE33.WAV
SUBMENU.FOB_final.bin
SUBMENU.FOB_second.bin
SYSTEM_MAIN.BMP
TEXTFUNC.FOB_final.bin
TEXTFUNC.FOB_second.bin
TITLE.BMP
TITLE.FOB_final.bin
TITLE.FOB_second.bin
WHITE.BMP
おまけモード.BMP
シーン回想.BMP
タイトル画面.BMP
設定画面.BMP

.FOBファイルは単一ファイルだが、ヘッダのようなものと本体を分けてダンプした。

.FOBファイル
#

.FOBファイルはエンジンのスクリプトのようだ。

詳しくは見ていないが、ヘッダでは恐らく、他のスクリプトから参照できるように関数テーブルのようなものがある。

多くの.FOBはシナリオ関連のものであり、テキスト表示やCGの切り替え、SE、BGM再生などが記述されている。

当然スクリプトなのでコードコメントがちょこちょこと残されている。

おそらくスクリプトのフローなどの把握が欠けていることが原因で、意味、意図を理解できないコメントが一つあったので、ASTを書いてパースできるようにしようと思ったが、 まあ流石にね と考えてやめた。
時間をかければやれるが、時間をかけるわけにはいかない(たくない?)事が多い。

それが実現すると好き勝手に内容を足せるので、色々できるなと少し想像した。

エンジン
#

このエンジンが別の作品で使われているのかどうか興味がある。
なにか知っているひとがいたら教えてほしい。

.FOBのスクリプトのコメントと、バイナリ内に存在するエンジン周りのエラーメッセージなどを見た感じ、結構ゆるい言葉使いが特徴だった。
同一人物かどうかは不明。

シナリオは🔗山田おろちらしいが、スクリプトを書いたのは誰かという情報はない。 はず。

公爵って最初からVAと関連してたんだっけ?
そうであればそっち関連のエンジンという可能性もある。

デバッグ機能
#

エンジンのスクリプト処理っぽいところを見ていたら偶然発見したので、エンジンのスクリプトのバッファみたいなところを弄ってハイジャックして、表示する命令を突っ込んだら動作した。

苦行
#

C++
#

配列外アクセスでstd::ifstreamが破壊されて、seekg(), tellg()などでstdlibc++の中の方でセグフォが起きるバグに遭遇した。

初めは配列外アクセスだとわからずにstd::ifstreamのバグだと思いこんで、ソースを読んだりデバッグしたりとかなり時間を使った。

文字コード
#

ゲーム側とアセットファイル側の方でShift_JISという日本語の文字コードが使われており、文字化けなどが面倒だった。

utf-8に変換したり。

変換にはiconvというライブラリを利用した。
C++の標準ライブラリにstd::codecvtというものがあるが、非推奨、deprecated、削除予定なようだ。

おわり
#

別のゲームの仕組みを見ようとしたら、見たことのないような良くわからないバイナリが出てきて、Ghidraでスクリプトなどを使いたくなったので、その練習にと思ったのが今回の動機だった。

最近は低気圧で数学をやる気が起きないので、別のを解析するためにGhidraのモジュールを開発している。
Ghidraのモジュール開発は情報が少なくとっつきにくそうに感じたが、数日ぐらいで多少感じは掴めてきた。

Ghira本体の機能に多少不満があるけどまあそのうち改善されていくだろう。

15年ぐらい使った古いPCをまるごと処分する際に救出したゲームが結構あるので、他のものも色々見ていきたいと思っている。(就活しろ)

関連記事

[PC98] この世の果てで恋を唄う少女YU-NO
··4452 文字·9 分
ゲーム VisualNovel
ペットボトルコーヒー UCC ColdBrew 感想
··1355 文字·3 分
食品レビュー
キンキンに冷えた美味しいアイスコーヒーを飲みたい
サメ肉
··609 文字·2 分
食品レビュー