芖芚的な短線小説のリバヌス゚ンゞニアリングパヌト2

ゲヌム゚ンゞンの内郚に入り、そこからあらゆる皮類のコンテンツを匕き出す方法に関する䞀連の蚘事を続けたす。 参加したばかりの人たちのために、芖芚的な短線小説のような面癜いゞャンルを研究したこずを簡単に思い出したす。


ビゞュアルノベル゚ンゞンYukaのアヌカむブを解析する方法を孊んでからかなりの時間が経ちたした。そこで、私たちがそこで芋぀けた最も興味深いもの、実際はスクリプトを取り䞊げるずきが来たした。 スクリプトに぀いおは、ファむルを含むアヌカむブよりもはるかに耇雑な問題であるこずをすぐに譊告したす。したがっお、1぀の蚘事でそれを理解するこずはできたせんが、今日は、スクリプトがどの郚分で構成され、テキストリ゜ヌス。


バむナリダンプの深さに入る前に、ビゞュアルノベルの゚ンゞンのほずんどがどのように機胜するかを掚定したしょう。 芖芚的な短線小説自䜓は、テキスト英雄、察話、䞭間物語の発蚀、グラフィックス、および音声で構成されおいたす。 ナヌザヌに再珟するには、䜕らかの制埡アクションを䜿甚しおこれらすべおをたずめる必芁があるこずは明らかです。 理論的には、すべおを盎接exeファむルに瞫うこずは可胜ですが、99のケヌス倧䞈倫、嘘、個人的には100に芋られるでは、ただこれを行いたせんが、そのような指瀺を別個のスクリプトプログラムずしお個別に保存したす。 原則ずしお、スクリプトは次のような特別なプログラミング蚀語゚ンゞン固有で蚘述されおいたす。



$ tarot = 0 $ memory = 0 scene bg01_1 with dissolve play music "bgm/8.mp3" fadein (2.0) play ambience "amb/forest.mp3" fadein (3.0) "Morning." "Not my favourite time of the day." "The morning is when you're not awake enough to do anything..." 

これはRen'Pyの 1぀のVNからのスクリプト゜ヌスの断片です-最も人気のある無料/無料゚ンゞンの1぀です。 この蚘事では、Ren'Py自䜓がどれだけ優れおいるかずいう質問は別ずしお、今のずころは、ビゞュアルノベルスクリプトに通垞含たれおいるものず、芋぀ける必芁があるものに泚目したしょう。



もちろん、珟実の䞖界では、スクリプトの゜ヌスコヌドにアクセスできないこずがよくありたす。 人々はすでにむンタヌプリタヌではなく玄50幎間コンパむラヌの䜜成方法を孊んでいるため、通垞、スクリプト゜ヌスはバむナリコヌドバむトコヌドにコンパむルされ、ビゞュアルノベル゚ンゞン内の仮想マシンによっお実行されたす。 幞運なこずもあり、人気のある䞀郚の゚ンゞンでは、合法的に䜿甚できるツヌルたたは非垞に合法的に䜿甚できないツヌルデバッガヌ、コンパむラヌ、逆コンパむラヌ、スクリプトバリデヌタヌなどがありたすが、倚くの堎合、人生はそれほど単玔ではありたせん。


それでは、以前の蚘事「 恋する島井の六十䞉 」で探求し始めたビゞュアルノベルに戻りたしょう 。 既にアヌカむブを解凍し、内郚、グラフィックス、サりンド、音楜、そしお最も重芁で理解できない-拡匵子が.yksのファむルを芋぀けたした。 おそらく、圌らは短線小説のスクリプトを構成しおいたす。 ずころで、倚くのファむルがありたす


 YKS/ScriptStart.yks YKS/trial/Yoyaku.yks YKS/trial/trial_00100.yks YKS/trial/trial_00200.yks YKS/all/all_00010.yks ... YKS/all/all_02320.yks 

YKS / all /にあるのは103ファむルのみです。 詊甚版を完党に正盎にダりンロヌドしお怜蚎したこずを思い出させおください-しかし、どうやら開発者は少し面倒で、どうやら詊甚版/スクリプトには詊甚版ずすべお/完党版が含たれおいるようです。


䞀般に、最小限の経隓に基づいお、ビゞュアルノベル゚ンゞンのビルダヌには2぀のアプロヌチがありたす。すべおを1぀の巚倧なファむルに詰め蟌むか、倚数のファむルがあり、それぞれに独自のシヌンたたはむベントがありたす。 2番目のようです。 さらに、ただ別のScriptStart.yksがありたすが、それ自䜓はほずんど関心がありたせん実際、開発者は倚くの堎合、゚ンゞンを可胜な限り倚甚途にし、あらゆる皮類のナヌザヌむンタヌフェむス、menus-load-save-optionsなどを実装するこずを望んでいたす.d。 たた、そのスクリプト蚀語によっお。 あなたはこれに察凊するこずができたすが、むしろ退屈で実りがありたせん。したがっお、私は角で雄牛を取り、ゲヌムの実際のスクリプトから始めるこずを提案したす。


衚面的な目芖怜査から䜕が蚀えるでしょうか 第䞀に ゲヌムはWindows䞊で実行されるため、実行しお倖芳を確認するこずは非垞に可胜です。 n番目の時間を費やし、Windowsマシンを芋぀けお起動し、新しいゲヌムのスタヌトボタンをクリックした盎埌に䜕が起こるかを確認したす。


ゲヌム開始盎埌


物語の始たりが私たちに出䌚ったようです。 ここには背景がありBGで簡単に怜玢した埌/この背景を持぀bg01_01.pngファむルがありたす、テキストがありたす。 このテキストはただ必芁なので、画面から再入力する䟡倀がありたす。


 恋する姉効の六重奏「セクステット」䜓隓版Ver2をダりンロヌド頂きありがずうございたす。 

2぀のポむント


  1. 日本語テキストの入力に問題がある堎合は、この問題を倧幅に簡玠化する3぀たたは4぀のトリックを習埗するこずをお勧めしたす。少し忍耐匷く、波線がたったくわからない人でも日本語テキストを入力できるようにしたす。 各アむコンを個別に怜蚎したす。


    • 次のような衚の句読点かどうかを確認したす。「...」」。-運がよければコピヌしたす。 ここでは、「コンマ」、「ドット」、および括匧の䞡方が具䜓的であるずいう事実に泚意しおください。
    • そうでない堎合は、この衚を芋おくださいあいうえおかきくけこさしすせそたち぀おずなにぬねのはひふぞたみむめもやゆよらりをれろろろろろろ
    • 次に、次のようなものを探したすアむり゚オカキクケコサシスセ゜タチテテトナニヌネノハハヒフヘホマミムメモモダナペラリルレロワワワ
    • それが圹に立たない堎合-䟋えば、恋がキャッチされた-これは挢字です。 次に、フォントを300〜500増やしお、すべおの小さな詳现がはっきりず芋えるようにし、「ラゞカルによる怜玢」セクションでjisho.orgにアクセスしたす。 そこで、構成郚分ラゞカルの衚を芋お、芋たものず同様のものを探したす。 たずえば、恋-短い瞑想の埌、圌はの䞋にコンポヌネントがあるこずがわかりたした-このコンポヌネントでボタンを抌し続けるず、数千のアむコンが数十個しかありたせん。 圌らの目を通しお芋お、セクション「10」の問題で最初から5番目のサむンを芋぀けおくださいこれは望たしいものです。

  2. Ver2かVSer2があるかはわかりたせん-これらは異なるフォントではなく、いわゆる党角文字であるこずに泚意しおください-Unicodeでは、U + FF01..U + FF5Eリヌゞョンのどこかにありたす。

2぀のこずに぀いおテキストが必芁になりたす。 たず、テキストずしお、䜕が起こっおいるのかを理解するために日本語を話さなくおも、Google翻蚳に挿入しお、このゲヌムの詊甚版をダりンロヌドしおくれたこずに感謝したす=>぀たり、これは本圓の始たりではありたせんプロット、および特定の玹介、「著者から」。 次に、このテキストたたはその䞀郚を取埗しおShiftJISに倉換し前のノヌトで芋たように、すべおがこの゚ンコヌディングに含たれる可胜性が高い、ファむルで怜玢できたす。 最埌からピヌスを取り、探しおいるものを準備したす。


 $ echo 'ダりンロヌド頂きありがずうございたす' | iconv -t sjis | hd 00000000 83 5f 83 45 83 93 83 8d 81 5b 83 68 92 b8 82 ab |._.E.....[.h....| 00000010 82 a0 82 e8 82 aa 82 c6 82 a4 82 b2 82 b4 82 a2 |................| 00000020 82 dc 82 b7 |....| 

すべおの.yksファむルでこの行を探しおいたすが、もちろん芋぀かりたせん。 それほど単玔ではありたせん。


別の䜙談を行っおみたしょう。ShiftJIS゚ンコヌドの仕組みを理解したしょう。 日本語では、明らかに、ペヌロッパよりもはるかに倚くのアむコンがありたす。ShiftJISでは、各アむコンは少なくずも1バむト、最倧2バむトで゚ンコヌドされたす。 このプレヌトからわかるように、バむト00..7Fの倀はASCIIず同じですが、バむト81..9F E0..EAは、これが2バむトの組み合わせであるこずを意味したす。たた、互換性のために、バむナリ読み取りず同様に、2番目のバむトには倀がありたせんが 、40〜FFの間です。


日本語ぞのマむクロ゚クスカヌション蚀語では3぀のグルヌプのアむコンが䜿甚されたす。



さらに、句読点があり、プラスたたはマむナスはペヌロッパ蚀語ず同じです。ドット、コンマ、、省略蚘号、匕甚笊「」 、感嘆笊、疑問笊など。 しかし、通垞、ギャップはありたせん。 秘trickは、テキストが絶えず挢字で蚘録される「重芁な」単語ずひらがなで蚘録される粒子ず亀互になり、その結果、この混合物が少なくずも䜕らかの方法で分類できるこずです。 たずえば、ゲヌム「恋する姉効の六重奏」の名前を取りたす。



これにより、最終的に䜕が埗られたすか 非垞に簡単頻床衚。 日本語の最初のビゞュアルノベルの既補のスクリプトを手に入れ、Unicodeの3぀のグルヌプすべおの範囲の境界をすばやく調べお、このスクリプトを実行したすしゃれでごめんなさい。


 stats = {} $stdin.each_char { |c| t = case c.ord when 0x3041..0x309F then :hiragana when 0x30A0..0x30FF then :katakana when 0x4E00..0x9FCC then :kanji end stats[t] ||= 0 stats[t] += 1 } p stats 

出力のようなものが埗られたす


 {nil=>72384, :kanji=>5731, :hiragana=>15377, :katakana=>2241} 

぀たり 通垞のテキストは、玄25の挢字、65のひらがな、10のカタカナです。


ツヌルを発芋し、仕事に真っ向から飛び蟌む時が来たようです。 新しいオヌプン゜ヌスツヌルKaitai Structを䜿甚しお、理解できない構造のバむナリファむルを分析するこずを簡単に思い出させおください。これにより、テンプレヌトをマヌクアップ蚀語で蚘述し、ファむルに適甚しお、ツリヌ内の棚に配眮されたコンテンツをすばやく芖芚化できたすメガボヌナスずしお、-ほがすべおの䞀般的なプログラミング蚀語でテンプレヌトを゜ヌスに盎接コンパむルしたす前の蚘事の執筆以来、カむタむストラクツはJava、JavaScript、Python、Rubyだけでなく、C ++、C、Perl、PHPもサポヌトし始めたした。 ぀たり、トップ蚀語のあらゆる皮類のリストを芋るず、トップ10が完党にカバヌされおおり、トップ20から、ドメむン固有のものをずらないず、Delphi、Visual Basicは十分ではありたせん誰もリバヌス゚ンゞニアリングを行うずは思いたせんが叀代のVisual Basicは.NETではありたせん、Swift and Go。


蚘事の最初の郚分でKaitai Structテンプレヌトの基本的な構文を研究したので、それが䜕であるかを芋逃した/忘れた人は、それをよく理解し、メモリでリフレッシュする時です。


そのため、3〜4個のファむルのダンプをすばやく確認し、そのようなテンプレヌトが出発点ずしお適しおいるこずを理解したす。


 meta: id: yks application: Yuka Engine endian: le seq: - id: magic contents: ["YKS001", 1, 0] - id: magic2 contents: [0x30, 0, 0, 0, 0, 0, 0, 0, 0x30, 0, 0, 0] - id: unknown1 type: u4 - id: unknown2 type: u4 - id: unknown3 type: u4 - id: unknown4 type: u4 - id: unknown5 type: u4 - id: unknown6 type: u4 - id: unknown7 type: u4 

YKC圢匏ですぐに類掚できたす。 なぜなら 最初に「ヘッダヌ」の説明があり、その長さから始たり、高い確率でmagic2のすべおの堎所にある固定の0x30が元のヘッダヌの長さであるため、0x30たでのすべおを䞀床に読むこずを提案したす。 7぀の数字が刀明したしたが、今ではそれが䜕であるかを掚枬しようずしたす。


Yoyaku.yksの堎合ファむル自䜓は27741バむト


  [.] @unknown1 = 1845 [.] @unknown2 = 7428 [.] @unknown3 = 795 [.] @unknown4 = 20148 [.] @unknown5 = 7593 [.] @unknown6 = 25 [.] @unknown7 = 0 

trial_00100.yksファむル91267バむトの堎合


  [.] @unknown1 = 6433 [.] @unknown2 = 25780 [.] @unknown3 = 2376 [.] @unknown4 = 63796 [.] @unknown5 = 27471 [.] @unknown6 = 5 [.] @unknown7 = 0 

たた、比范のために、すべおのファむル、たずえばall_00010.yks12968バむト


  [.] @unknown1 = 933 [.] @unknown2 = 3780 [.] @unknown3 = 353 [.] @unknown4 = 9428 [.] @unknown5 = 3540 [.] @unknown6 = 1 [.] @unknown7 = 0 

䜕が芋える たず、ファむルのオフセットやサむズのような壮倧なものです。なぜなら、 ファむルサむズが91 Kの堎合、数倀は25〜63 Kの範囲で、12 Kのサむズは3〜9 Kの範囲で倉動したす。 よく芋るず、オフセットずサむズは、unknown2、unknown4、unknown5のみである可胜性が高く、それらは4぀に分割され、非垞に倧きくなっおいたす。 第二に、unknown7は垞に0のようです。第䞉に、unknown6は非垞に区分的に䜕かを蚭定しおいるようです。 これは、たずえば、倉数甚の仮想マシンの予玄メモリのサむズ、倉化するシヌン/スプラむト/背景の数、たたは他の䜕かです。


0x30の盎埌、肉県でも、人間の16進゚ディタでは、増加するたたはほずんど垞に増加するテヌブルが衚瀺されたす。 これはほずんどバむトコヌドそのものではありたせん。バむトコヌドの特城は、同じシヌケンスの䞀定の繰り返しだけです。 これはおそらくいく぀かのオフセットでもありたす。たずえば、バむトコヌドのコマンドの先頭、可倉長の行の先頭たたは末尟などを定矩するオフセットです。 䞍明な倀は7぀ありたすが、これはそれほど倚くありたせん-調べお、そのうちの1぀が次のようになっおいるかどうかを確認したしょう。



ほが最初の詊みは非垞にうたく適合したす。unknown1はこのセクションの芁玠の数であり、unknown2は次のセクションの先頭ぞのポむンタヌであるこずがわかりたす。 したがっお、実際にはunknown2 = 0x30 + unknown1 * 4のようです。すぐに説明を远加し、同時にヘッダヌを明瀺的に遞択されたヘッダヌタむプに移動し、開いたセクションsect1..sectXの呌び出しを開始したす。


 seq: - id: header type: header - id: sect1 size: header.sect2_ofs - 0x30 type: sect1 types: header: seq: - id: magic contents: ["YKS001", 1, 0] - id: magic2 contents: [0x30, 0, 0, 0, 0, 0, 0, 0, 0x30, 0, 0, 0] - id: sect1_qty type: u4 - id: sect2_ofs type: u4 - id: unknown3 type: u4 - id: unknown4 type: u4 - id: unknown5 type: u4 - id: unknown6 type: u4 - id: unknown7 type: u4 sect1: seq: - id: entries type: u4 repeat: expr repeat-expr: _root.header.sect1_qty 

その結果、trial_00100は次のようになり始めたす。


  [-] @header [.] @magic = 59 4b 53 30 30 31 01 00 [.] @magic2 = 30 00 00 00 00 00 00 00 30 00 00 00 [.] @sect1_qty = 6433 [.] @sect2_ofs = 25780 [.] @unknown3 = 2376 [.] @unknown4 = 63796 [.] @unknown5 = 27471 [.] @unknown6 = 5 [.] @unknown7 = 0 [-] @sect1 [-] @entries (6433 = 0x1921 entries) [.] 0 = 6 [.] 1 = 7 [.] 2 = 3 [.] 3 = 3 [.] 4 = 4 ... [.] 6425 = 2371 [.] 6426 = 2372 [.] 6427 = 34 [.] 6428 = 1 [.] 6429 = 2373 [.] 6430 = 2374 [.] 6431 = 1 [.] 6432 = 2375 

実際、これらは単なる増加する倀ではなく、バむトコヌドである可胜性がありたす。 このファむルでは、顕著な増加数は0たたは1から2375に増加するように芋えたす。突然、unknown3 = 2376はこれらの倀の数に非垞に䌌おいたす。 ぀たり バむトコヌドは、2376の異なる倀明らかに0から2375たでがある別のテヌブルを参照したす。 䜕だろう


次のセクションでは、画面3〜4で䜕が起こるかを芋おいきたす。




私の意芋では、これらが16バむト1行の長さのレコヌドであるこずは倚かれ少なかれ明癜であり、再び、それらは明らかに䞍均䞀に増加するオフセットたたはむンデックスに著しく䌌たものを持っおいたす。 そのような蚘録は2376個ありたすか unknown3の名前をsect2_qtyに倉曎し、簡単なスラむスを远加しお16バむトのレコヌドからsect2を収集するこずで確認したす。


  - id: sect2 size: 16 repeat: expr repeat-expr: header.sect2_qty 

そしお、ビンゎ、これはそれであり、非垞に正確です




これらの非垞に现い16バむトのレコヌドは、sect2_qtyピヌスの盎埌で実際に終了し、完党に異なるものが始たるこずが肉県ではっきりずわかりたす。 ここで䜕が芋えたすか これらは明らかに4バむトの長い数字ではなく、ほずんどすべおれロではありたせん。 少なくずも䞀芋するず、明らかに呚期的な構造も远跡されたせん。 豊富な0xaa。 倚くの0x28が時間ずずもに倉化したす。 ファむルの最埌を芋お、他のセクションを芋぀けようずしたす-最埌の同じテクスチャに぀いおはそうではありたせん




぀たり、これはファむルの3番目の最埌のセクションであり、それ以䞊䜕もありたせん。 そしお、私たちが芋たこずがないものは䜕ですか テキストず行。 どうやら、これは圌らが䜕であるかですが、明らかに䜕らかの圢で゚ンコヌドされおいたす。 絞った いいえ、そうではありたせん。 このような0x28ず0xaaの繰り返しはありたせん。 はい、あらゆる皮類の28 08 28 1b 28 0e 28 6c 26 6f 28 07 3a 14 28 6b 0x28を繰り返すず、非垞に疑わしいように芋えたす。 比范のために、ShiftJISでの平均的な日本語テキストがどのように芋えるか思い出しおみたしょう 82 a0 82 e8 82 aa 82 c6 82 a4 82 b2 82 b4 82 a2 。 これは、これが最も単玔なワむルドカヌド暗号であり、各バむトが垞に同じ他のバむトに倉換されるずいう仮説がすぐに生じたす。 それは䜕ですか、0x82 => 0x28から取埗する方法は 実際、人類はそれほど倚くの遞択肢を思い぀きたせんでした。



䞀般に、 XORSearchのようなプログラムの圢の「重い」倧砲さえありたす。これらは総圓たりでそのような倉換を掚枬しようずしたすが、ここではそれはより䞀般的であり、私は二床目に掚枬するこずができたす。 0xaaが豊富にあるずいうこずは、0xaaずXORを行うずれロが倚くなり、0xaaが埗られるこずを瀺しおいたす。 そしお、突然0x82 ^ 0xaaは正確に0x28です。 0xaaは䞀般に、たず最初にチェックする必芁がある最も䞀般的な仮定の1぀です。 0xaa = 0b10101010、぀たり xorは、2ビットごずにそれをバカにしたす。


幞いなこずに、Kaitai Structには、このような倉換のサポヌトが組み蟌たれおおり、 process:によっおアクティブになりprocess: このように曞くだけです


  - id: sect3 size-eos: true process: xor(0xaa) 

その埌、ようやく信頌スクリプトの文字列定数の豊富な内郚䞖界を芳察できるようになりたす。


 000000: 69 66 00 c8 00 00 00 47 6c 6f 62 61 6c 46 6c 61 | if.....GlobalFla 000010: 67 00 3d 00 ff ff 00 00 01 00 00 00 3d 00 7b 00 | g.=.........=.{. 000020: 0d 00 00 00 57 69 6e 64 6f 77 4e 61 6d 65 53 65 | ....WindowNameSe 000030: 74 00 97 f6 82 b7 82 e9 8e 6f 96 85 82 cc 98 5a | t........o.....Z 000040: 8f 64 91 74 28 83 66 83 6f 83 62 83 4f 29 81 7c | .dt(.fobO).| 000050: 46 69 6c 65 20 3a 20 74 72 69 61 6c 68 5f 6d 61 | File : trialh_ma 000060: 79 75 2e 79 6b 73 00 7d 00 09 00 00 00 44 72 61 | yu.yks.}.....Dra 000070: 77 53 74 6f 70 00 47 72 61 70 68 69 63 48 69 64 | wStop.GraphicHid 000080: 65 00 0a 00 00 00 54 72 61 6e 73 69 74 69 6f 6e | e.....Transition 000090: 00 02 00 00 00 64 00 00 00 0a 00 00 00 0b 00 00 | .....d.......... 0000a0: 00 47 72 61 70 68 69 63 4c 6f 61 64 00 00 00 00 | .GraphicLoad.... 

幞いなこずに、特にASCIIラむンのクラりドがあり、これにより人生が倧幅に簡玠化されたす。 䞀芋、これらはれロで終了する単なるCスタむルのラむンのように芋えたすが、詳现に調べるず、これは完党に真実ではないこずがわかりたす。 行ず、理解できない定数の散圚がありたす。たずえば、 ff ff 00 00 01 00 00 00たたは02 00 00 00 64 00 00 00 0a 00 00 00 0b 00 00 00たたは02 00 00 00 64 00 00 00 0a 00 00 00 0b 00 00 00これは、印刷されたASCII文字が1぀あるにもかかわらず䞭倮 d = 0x64にある可胜性が最も高いのは線ではありたせん。 さらに、最も䟡倀のあるもの-ここにある-は、ShiftJISで82ず同じ行です。


たずめるず、成功したした


  1. 4バむト敎数おそらくこれはバむトコヌドで構成されるsect1、これらの番号を持぀sect2の16バむト゚ントリを郚分的に参照
  2. sect2、内郚の数倀が増加する16バむトのレコヌドで構成されるおそらくいく぀かのオフセット
  3. 䞻にShiftJISのヌル終了行で構成されおいるsect3ですが、完党ではありたせんおそらく-文字列リ゜ヌスおよびバむトコヌドで参照される他のすべおの定数

この小さな勝利で、今日の研究が完了するず思いたす。蚘事が再び無数に倧きくなったからです。 ある皋床、たずえば、タスクがビゞュアルノベルの翻蚳である堎合、今日の成果はすでにテキストを切り取っお翻蚳者に提䟛するのに十分です。 sect3を取埗し、SJISのように芋えるものをすべお芋぀け、他のすべおを泚意深く砎棄したす-出来䞊がり


 恋する姉効の六重奏(デバッグ)File : trialh_mayu.yksたゆ「きゃっ  」教育的指導を兌ねお、お望み通りメチャクチャにしおやろうじゃないか 「あっ  お、おにぃっ  」自分から誘っおおきながら、䞍安そうな衚情を浮かべるたゆ。そんなたゆを、゜ファヌに抌し぀けお  胞を露出させ、股間が䞞芋えになる䜓勢を匷いる。 「んぁっ  」 

この堎所を読んでくれたみんなに感謝したす。 次回はバむトコヌド自䜓に行き、sect1ずsect2がどのように機胜するかを理解しようずしたす。 じゃあね



Source: https://habr.com/ru/post/J309414/


All Articles