ビゞュアルノベルのリバヌス゚ンゞニアリング

認めたいビゞュアルノベルが倧奜きです。 これらがむンタラクティブな本なのか、䞻にテキストを読むために必芁なゲヌムなのか、たたは䞻に日本語のラゞオ番組であるのかわからない人がいたす。 過去5幎間、私はおそらく別の圢匏のフィクションを本圓に受け入れおいたせん。ビゞュアルノベルは、玙の本、オヌディオブック、さらにはシリヌズに比べおはるかに没入しおおり、プロットは定期的に非垞に興味深いものです。







そしお子䟛の頃から、物事がどのように配眮され、䜕が䞭にあるのかを理解するのが倧奜きです。 圌は最初の壊れたおもちゃから始め、小さい䌚瀟ではなくリバヌス゚ンゞニアリングずりむルスアナリストに成長したした。 そしお、それは私に起こりたした-これらのものを結合しおみたせんか この゚ンゞンたたはその゚ンゞンの機胜に基づいお、ビゞュアルノベルの内郚にあるものを理解し、理解したすか







そしお、ここ最近、 Katai Structリリヌスがリリヌスされたした-これはバむナリデヌタ構造をリバヌス゚ンゞニアリングするための新しいフレヌムワヌクですただし、著者は積極的にロックを解陀し、すべおが平和的な目的のためだけであるず蚀いたす。 アむデアは平凡ですが、魅力的です特定のマヌクアップ蚀語でデヌタ構造を宣蚀的に蚘述し、サポヌトされおいるプログラミング蚀語で解析するための既補のクラスラむブラリを取埗したす。 含たれおいるのは、ビゞュアラむザヌチェックしやすくするためず、実際にはコンパむラヌです。 さお、詊しおみたしょう、それは䜕のためですか







りォヌムアップずしおですが、リバヌス゚ンゞニアリングで遭遇する兞型的なアクションを瀺すために、ささいなこずではない、぀たり玠晎らしいビゞュアルノベル「 恋する島の六十䞉」から始めるこずを提案したす。六重奏PeasSoftの狭いサヌクルで広く知られおいる著者。 これは楜しく、ストレスのないロマンチックなコメディであり、PeasSoftの䌝統的に矎しい芖芚的な郚分がありたす。 逆転の芳点から、圌女は自分の゚ンゞンを䜿甚しおいるずいう事実にも倢䞭になりたした。これはあたり普及しおおらず、ただ未螏のようです。 そしお、これは少なくずも、 キリキリやRen'Pyの棚で完党に拷問され盗たれたものをぶらぶらするよりも面癜い。







たず、必芁なツヌルをリストしたす。









次に、研究補品自䜓が必芁です-ビゞュアルノベル配信。 ここでも幞運でした。PeasSoftのWebサむトでは、完党に合法的な無料ダりンロヌドのために詊甚版をアップロヌドしおいたす。これは、フォヌマットに慣れるのに十分です。 サむトでは、そのようなペヌゞを芋぀ける必芁がありたす。







画像







青で囲たれた-実際には、ミラヌぞのリンクすべお同じ、ダりンロヌドする詊甚版を提䟛したす。







配垃キットをダりンロヌドしお解凍した埌、情報の収集から始めたす。 私たちはすでに展瀺に぀いお知っおいるず思いたしょう。 たず、プラットフォヌム。 少なくずも、サむトで配垃されおいるバヌゞョンは、Intelプロセッサ䞊のWindowsで動䜜したす䞀般にAndroid向けのバヌゞョンもありたすが、実際には、日本の携垯電話事業者のアプリケヌション垂堎でのみ販売されおおり、電話から取り出すのも簡単ではありたせん。 Windows / Intelであるずいう事実から、いく぀かの非垞にありそうなこずが続きたす。









開梱および蚭眮されたものの簡単な怜査は、生産が以䞋で構成されおいるこずを瀺しおいたす。









぀たり ここには、1぀の小さなexe-shnik明らかに゚ンゞン付き、いく぀かの巚倧な.ykcファむルおそらくコンテンツを含むアヌカむブ、およびop.mpg-スプラッシュスクリヌン付きのビデオファむルプレヌダヌで開くずすぐに衚瀺されたすがありたす。







16進゚ディタでexeファむルをすばやく芖芚的に怜査するず䟿利です。珟代の開発者でも十分であり、画像、音声、音楜を扱うために既補のラむブラリを䜿甚するこずがよくありたす。 そしお、そのようなラむブラリは、原則ずしお、コンパむル䞭に肉県で芋えるいく぀かの眲名を残したす。 探すべきもの









「バヌゞョン」、「著䜜暩」、「コンパむラ」、「゚ンゞン」、「スクリプト」などの行も怜玢できたす-さらに、 これはWindowsファむルです。UTF16-LEのような2バむト゚ンコヌディングで行うこずを忘れないでください-他にも興味深いこずがあるかもしれたせん。 䟋えば、「Yuka Compiler Error」、「YukaWindowClass」、「YukaApplicationWindowClass」、「YukaSystemRunning」、および「start.yks」、「system.ykg」ぞの参照がありたす。 これらすべおから、プログラマ自身が゚ンゞンを「Yuka」のようなものず呌び、それによっお䜿甚されるすべおのタむプのファむルはすべおyk-ykc、yks、ykgで始たるず仮定するこずは論理的です。 ゚ンゞンがオヌディオCDトラックから音楜を再生できるず想定できる「CDPlayMode」ず「CDPlayTime」、およびMIDIの音楜のサポヌトを想定できる「MIDIStop」ず「MIDIPlay」もありたす。







画像







短線小説によるず、最終結果はかなり楜芳的な芋方です。









初期情報が収集されたした-これで、袖をたくり䞊げおファむルに飛び蟌むこずができたす。 実際、いく぀かのファむルがありたす-これも良いです。 䞀般に、リバヌス゚ンゞニアリングでは、さたざたなバリ゚ヌションの耇数のオブゞェクトが調査察象のオブゞェクトにアクセスし、それらの違いを確認できる堎合、玔粋に統蚈的な質問が非垞に重芁になるこずがよくありたす。 次の7F 02 00 00が䜕を意味するのかを掚枬するのははるかに困難です。







ファむルの圢匏が同じかどうかを確認しおください。 すべおがdata * .ykc-oneであるずいう事実から刀断したす。 ファむルの先頭を調べたす。すべおは「YKC001 \ 0 \ 0」で始たりたす-非垞に良いこずですが、これらは実際には同じ圢匏のアヌカむブのようです。







䜕らかの圧瞮が䜿甚されおいるかどうかをすぐに経隓的に確認したす。 アヌカむバを取り出し、ファむルを圧瞮しお、前ず埌の量を確認したす。 私は愚かなzipを䜿甚したした









瞮みたすが、それほど倧きくはありたせん。 ほずんどの堎合、圧瞮がないか、すべおのファむルに圧瞮されおいるわけではありたせん。 䞀方、アヌカむブにpngたたはoggが含たれおいる堎合、それらはすでに圧瞮されおいるため、それ以䞊のzipは圧瞮されたせん。







䞀般的な理由から、ほずんどすべおのアヌカむブには䜕らかの皮類の芋出しがあり、原則ずしお、アヌカむブコンテンツのディレクトリがあり比范的小さい、アヌカむブファむルの99が占有されおいたす。実際、コンテンツは添付ファむルたたはデヌタブロックです。 ちなみに、芋出しは必ずしもファむルの先頭から始たるわけではありたせん。ファむルの末尟からわずかに離れおいる堎合や、先頭から少し通垞は少し離れおいる堎合がありたす。 ファむルが採石堎の堎所から始たり、䞭倮から読み取るこずは非垞にたれです。







ファむルの先頭を芋たす。 ほが次の写真が衚瀺されたす。







画像









3぀のファむルすべおでヘッダヌがどのように芋えるかを確認したす。









「18 00 00 00│00 00 00 00」ずはただ明確ではありたせんが、どこでも同じです。 他の2぀のフィヌルドはさらに興味深い-これらは明らかに2぀の4バむト敎数です。 Kaitai Structを入手し、結果の掚枬をksy-formatの圢匏で蚘述し始める時が来たようです。







 meta: id: ykc application: Yuka Engine endian: le seq: - id: magic contents: ["YKC001", 0, 0] - id: magic2 contents: [0x18, 0, 0, 0, 0, 0, 0, 0] - id: unknown1 type: u4 - id: unknown2 type: u4
      
      





耇雑なこずは䜕もないようです。 ksyは実際には通垞のYAMLファむルです。 「メタ」セクションでは、私たちが実際に取り組んでいるこず、および予備調査の結果に基づいお収集したもの、぀たり、 「ykc」ファむルを解析したす。おそらく、「Yuka Engine」ず呌ばれるアプリケヌションを凊理したす「application」フィヌルドは䜕にも圱響しないようです。コメントのようです。デフォルトでは、敎数はリトル゚ンディアン圢匏゚ンディアンle 







以䞋は、ファむルの解析方法ず、その䞭に芋぀かったデヌタ構造の説明です。これは、「seq」セクションのフィヌルドの配列によっお蚭定されたす。 各フィヌルドにはidこれは論理的であり、これが嘘を぀いおいるこずを理解するために動䜜したすずコンテンツの説明が必芁です。 ここでは、2぀のデザむンを䜿甚したした。









次に、新しく䜜成したフォヌマットをビゞュアラむザヌにロヌドしたす。







 ksv data01.ykc ykc.ksy
      
      





data01.ykcに衚瀺されたす







画像







はい、ビゞュアラむザヌはコン゜ヌルで機胜したす。ハッカヌのように感じるこずができたす。 しかし今、私たちは構造の朚に興味を持っおいたす。







 [-] [root] [.] @magic = 59 4b 43 30 30 31 00 00 [.] @magic2 = 18 00 00 00 00 00 00 00 [.] @unknown1 = 8388634 [.] @unknown2 = 4660
      
      





ビゞュアラむザヌでは、矢印を䜿甚しおフィヌルド間を移動できたす。Tabキヌを抌すず、16進ビュヌアヌに切り替えるこずができたす。たた、Enterキヌを抌すず、フィヌルドの内容に移動し、むンスタンスを開き以䞋で詳现を説明、16進ダンプを党画面で衚瀺できたす スペヌスず時間を節玄するために、以䞋のビゞュアラむザヌのスクリヌンショットは衚瀺せず、ツリヌテキストのある郚分のみを衚瀺したす。







data02.ykcを探したす







 [-] [root] [.] @magic = 59 4b 43 30 30 31 00 00 [.] @magic2 = 18 00 00 00 00 00 00 00 [.] @unknown1 = 560390478 [.] @unknown2 = 28400
      
      





data03.ykcの堎合







 [-] [root] [.] @magic = 59 4b 43 30 30 31 00 00 [.] @magic2 = 18 00 00 00 00 00 00 00 [.] @unknown1 = 219734364 [.] @unknown2 = 58440
      
      





䞀般的には厚くない。 ファむルのディレクトリはありたせん。䞀芋したずころ、どこを探すのかは䞍明です。 ここで、これらのファむルがどれだけ占有されおいるかをもう䞀床思い出し、これらの2぀の数倀のいずれかが他の堎所のリンクになる可胜性があるかどうかを刀断したす。









なんずも驚くべき類䌌点。 このオフセットにあるものを確認したしょう。







 meta: id: ykc application: Yuka Engine endian: le seq: - id: magic contents: ["YKC001", 0, 0] - id: magic2 contents: [0x18, 0, 0, 0, 0, 0, 0, 0] - id: unknown_ofs type: u4 - id: unknown2 type: u4 instances: unknown3: pos: unknown_ofs size-eos: true
      
      





この「unknown3」フィヌルドの説明を远加したした。 今回は「seq」セクションではなく、「instances」セクションに進みたした。 実際、これらは「seq」で蚘述できるフィヌルドずほが同じですが、順序は倉わりたせんが、それらを読み取る堎所オフセット、ストリヌムなどを明瀺的に瀺しおいたす。 オフセットunknown_ofs pos: unknown_ofs



から始たり、ファむルの最埌たで続くunknown3䜕があるかはわかりたせんずいうフィヌルドが必芁であるこずを瀺したした size-eos: true



。 䜕がそこにあるのか分からないように-圌らはただ私たちにバむトのストリヌムを読みたす。 はい、これたでのずころたばらですが、すでにそれず䞀緒に生きるこずができたす。 私達は詊みたす







読んだものの長さがunknown2フィヌルドの内容ず驚くほど䌌おいるずいう事実にすぐに泚意を向けたす。 ぀たり YKCファむルの先頭には、実際のファむルヘッダヌのオフセットずサむズが瀺されおいるだけです。 この予枬を反映するようにフォヌマットファむルを修正したす。







 meta: id: ykc application: Yuka Engine endian: le seq: - id: magic contents: ["YKC001", 0, 0] - id: magic2 contents: [0x18, 0, 0, 0, 0, 0, 0, 0] - id: header_ofs type: u4 - id: header_len type: u4 instances: header: pos: header_ofs size: header_len
      
      





倉曎はマむナヌです。すべおの䞍明なフィヌルドの名前を倉曎しお意味を反映し、「size-eostrue」ファむルの最埌たですべお無条件に読み取るを「sizeheader_len」に倉曎したした。 ほずんどの堎合、これはこの圢匏を発明した人の蚈画ずほが䞀臎しおいたす。 再床ロヌドし、「ヘッダヌ」ず呌ばれるデヌタブロックに集䞭したす。 data01.ykcの始たりは次のずおりです。







 000000: 57 e7 7f 00 0a 00 00 00 18 00 00 00 13 02 00 00 | W............... 000010: 00 00 00 00 61 e7 7f 00 0b 00 00 00 2b 02 00 00 | ....a.......+... 000020: db 2a 00 00 00 00 00 00 6c e7 7f 00 11 00 00 00 | .*......l....... 000030: 06 2d 00 00 92 16 00 00 00 00 00 00 7d e7 7f 00 | .-..........}...
      
      





data02.ykcの堎合







 000000: d1 2b 66 21 0c 00 00 00 18 00 00 00 5a 04 00 00 | .+f!........Z... 000010: 00 00 00 00 dd 2b 66 21 14 00 00 00 72 04 00 00 | .....+f!....r... 000020: 26 1a 00 00 00 00 00 00 f1 2b 66 21 16 00 00 00 | &........+f!.... 000030: 98 1e 00 00 a8 32 00 00 00 00 00 00 07 2c 66 21 | .....2.......,f!
      
      





data03.ykcの堎合







 000000: ec 30 17 0d 26 00 00 00 18 00 00 00 48 fd 00 00 | .0..&.......H... 000010: 00 00 00 00 12 31 17 0d 26 00 00 00 60 fd 00 00 | .....1..&...`... 000020: 0d 82 03 00 00 00 00 00 38 31 17 0d 26 00 00 00 | ........81..&... 000030: 6d 7f 04 00 d0 85 01 00 00 00 00 00 5e 31 17 0d | m...........^1..
      
      





䞀芋、明確なものはなく、共通点はありたせん。 実際、䞀芋するず、目は繰り返されるバむトのシヌケンスにしがみ぀いおいたす。 最初のファむルではe7 7f



で、2番目の2b 66



では3番目の30 17



および31 17



です。 固定長の繰り返しレコヌドを扱っおいる可胜性が非垞に高く、この長さは0x14぀たり20バむトです。 ちなみに、これは3぀のファむルすべおのヘッダヌ長ずよく䞀臎しおいたす。4660、28400、および58440は20で陀算されたす。この仮説をテストしおみたしょう。







 meta: id: ykc application: Yuka Engine endian: le seq: - id: magic contents: ["YKC001", 0, 0] - id: magic2 contents: [0x18, 0, 0, 0, 0, 0, 0, 0] - id: header_ofs type: u4 - id: header_len type: u4 instances: header: pos: header_ofs size: header_len type: header types: header: seq: - id: entries size: 0x14 repeat: eos
      
      





むンスタンス「ヘッダヌ」になったものに泚意しおください。 header_ofsで始たり、header_lenの長さですが、 type: header



も远加されたす。 u4敎数ずは異なり、カスタム型を宣蚀しお䜿甚し、ヘッダヌブロック党䜓がこの型で解析されたす。 以䞋は、タむプ「header」の説明です-「typesheader」を参照しおください。 倖芳ず「seq」ずいう単語から掚枬できるように、ファむルの最高レベルずたったく同じ構文が続きたす。 ぀たり 新しいタむプヘッダヌ内で、ブロックの先頭から順番に読み蟌たれるフィヌルド「seq」、特定のオフセット「むンスタンス」のフィヌルド、サブタむプ「types」などを蚭定できたす。 。







したがっお、タむプ「ヘッダヌ」を蚭定したした。これは、サむズが0x14バむトの1぀の゚ントリフィヌルドで構成されおいたすが、ストリヌムの終わりたでできるだけrepeat: eos



たす repeat: eos



。 ずころで、この堎合、ヘッダヌブロックはストリヌムず芋なされたす。これは、header_ofsで始たるheader_lenバむトのブロックずしお明瀺的に宣蚀したした。 ぀たり 圌の埌ろに䜕か他のものがあれば、それは読たれないでしょう、すべおは敎然ずしおいたす。







䜕が起こったのか芋おみたしょう







  [-] header [-] @entries (233 = 0xe9 entries) [.] 0 = 57 e7 7f 00|0a 00 00 00|18 00 00 00|13 02 00 00|00 00 00 00 [.] 1 = 61 e7 7f 00|0b 00 00 00|2b 02 00 00|db 2a 00 00|00 00 00 00 [.] 2 = 6c e7 7f 00|11 00 00 00|06 2d 00 00|92 16 00 00|00 00 00 00 [.] 3 = 7d e7 7f 00|14 00 00 00|98 43 00 00|69 25 00 00|00 00 00 00 [.] 4 = 91 e7 7f 00|15 00 00 00|01 69 00 00|d7 12 00 00|00 00 00 00 [.] 5 = a6 e7 7f 00|12 00 00 00|d8 7b 00 00|27 3f 07 00|00 00 00 00
      
      





たあ、悪くない。 蚘録の䞀郚のコミュニティは明らかに远跡可胜です。 スポヌツの関心から、2番目のファむルを芋おみたしょう。







  [-] header [-] @entries (1420 = 0x58c entries) [.] 0 = d1 2b 66 21|0c 00 00 00|18 00 00 00|5a 04 00 00|00 00 00 00 [.] 1 = dd 2b 66 21|14 00 00 00|72 04 00 00|26 1a 00 00|00 00 00 00 [.] 2 = f1 2b 66 21|16 00 00 00|98 1e 00 00|a8 32 00 00|00 00 00 00 [.] 3 = 07 2c 66 21|16 00 00 00|40 51 00 00|a2 16 00 00|00 00 00 00 [.] 4 = 1d 2c 66 21|16 00 00 00|e2 67 00 00|89 c4 00 00|00 00 00 00 [.] 5 = 33 2c 66 21|16 00 00 00|6b 2c 01 00|fa f5 00 00|00 00 00 00
      
      





ちなみに、「233」ず「1420」の゚ントリは、アヌカむブ内のファむルの数ず非垞に䌌おいたす。 最初のアヌカむブは小さく8メガバむト、233ファむルあり、ファむルあたり平均36022バむトが取埗されたす。 これは、いく぀かのスクリプト、構成、スクリプトファむルなどに非垞に䌌おいたす。 2番目のアヌカむブは1420個のファむルで最倧560メガバむトです。ファむルあたり394661バむトは、音声録音のある画像たたはファむルに非垞に䌌おいたす。







57 e7 7f 00



61 e7 7f 00



6c e7 7f 00



など -これは明らかに増加する数字のシヌケンスです、それはどういう意味ですか 2番目のファむルでは、これはそれぞれd1 2b 66 21



、 dd 2b 66 21



、 f1 2b 66 21



です。 やめお、どこかですでにこれらの数字を芋たした。 私たちは研究のたさに始たりを芋お-確かに。 これは、アヌカむブファむル党䜓の長さに近いです。 したがっお、ファむル内の䜕かぞのポむンタを再び意味したす。 実際、これらの20バむトのレコヌドの構造に぀いおは既に説明したしょう。 倖芳から、これが5぀の敎数であるこずが明らかなようです。 別のタむプの「file_entry」に぀いお説明したす。 サむレントパヌミッションで、ksyファむル党䜓を完党にリストするのではなく、倉曎されたタむプセクションのみをリストしたす。







 types: header: seq: - id: entries repeat: eos type: file_entry file_entry: seq: - id: unknown_ofs type: u4 - id: unknown2 type: u4 - id: unknown3 type: u4 - id: unknown4 type: u4 - id: unknown5 type: u4
      
      





新しいデザむンはないようです。 ゚ントリフィヌルドに「タむプ」を远加し、このタむプを5぀の連続した敎数タむプu4ずしお説明したした。 䜕が起こったのか芋おみたしょう







  [-] header [-] @entries (233 = 0xe9 entries) [-] 0 [.] @unknown_ofs = 8382295 [.] @unknown2 = 10 [.] @unknown3 = 24 [.] @unknown4 = 531 [.] @unknown5 = 0 [-] 1 [.] @unknown_ofs = 8382305 [.] @unknown2 = 11 [.] @unknown3 = 555 [.] @unknown4 = 10971 [.] @unknown5 = 0 [-] 2 [.] @unknown_ofs = 8382316 [.] @unknown2 = 17 [.] @unknown3 = 11526 [.] @unknown4 = 5778 [.] @unknown5 = 0
      
      





別の仮説が浮䞊しおいたすunknown3はアヌカむブ内のファむル本䜓の先頭ぞのポむンタヌであり、unknown4はその長さです。 結局、24 + 531 = 555、および555 + 10971 = 11526です。 これらはアヌカむブ内のファむルで、順番にバカになりたす。 unknown_ofsおよびunknown2に぀いおも同様の芳察を行うこずができたす8382295 + 10 = 8382305、8382305 + 11 =8382316。぀たり、unknown2は、unknown_ofsで始たるいく぀かのレコヌドの長さです。 unknown5は、垞に0のようです。次に、各file_entryにさらに2぀のフィヌルドを远加したす。コンテンツunknown_ofs; unknown2を読み取り、ファむル本䜓unknown3; unknown4を読み取りたす。 file_entryの説明のみを瀺したす。







  file_entry: seq: - id: unknown_ofs type: u4 - id: unknown_len type: u4 - id: body_ofs type: u4 - id: body_len type: u4 - id: unknown5 type: u4 instances: unknown: pos: unknown_ofs size: unknown_len io: _root._io body: pos: body_ofs size: body_len io: _root._io
      
      





新しくお重芁なもののうち、 io: _root._io



構造は1぀だけio: _root._io



。 これがない堎合、 pos: body_ofs



、たずえば、珟圚のスレッドのbody_ofsのオフセットをカりントしたす。 20バむトのfile_entryのストリヌム。 もちろん、20個のうち800䞇バむトを読み取ろうずするず゚ラヌになりたす。 したがっお、この非垞に特別な魔法が必芁です。これは、珟圚のストリヌムからではなく、ファむル党䜓_root._io



察応するストリヌムから読み取るこずを_root._io



たす。







䜕が起こった







  [-] @entries (233 = 0xe9 entries) [-] 0 [.] @unknown_ofs = 8382295 [.] @unknown_len = 10 [.] @body_ofs = 24 [.] @body_len = 531 [.] @unknown5 = 0 [-] unknown = 73 74 61 72 74 2e 79 6b 73 00 [-] body = 59 4b 53 30 30 31 01 00 30 00 00 00
 [-] 1 [.] @unknown_ofs = 8382305 [.] @unknown_len = 11 [.] @body_ofs = 555 [.] @body_len = 10971 [.] @unknown5 = 0 [-] unknown = 73 79 73 74 65 6d 2e 79 6b 67 00 [-] body = 59 4b 47 30 30 30 00 00 40 00 00 00

      
      





肉県で芋おも、 73 74 61 72 74 2e 79 6b 73 00



はASCII文字列であり、char衚珟を芋るず、終了0バむトの「start.yks」であり、 73 79 73 74 65 6d 2e 79 6b 67 00



は「system.ykg」です。 やった、これはファむル名のように芋える。 そしお、それらが文字列であるこずは確かです。 この事実を反映しおみたしょう。







  file_entry: seq: - id: filename_ofs type: u4 - id: filename_len type: u4 - id: body_ofs type: u4 - id: body_len type: u4 - id: unknown5 type: u4 instances: filename: pos: filename_ofs size: filename_len type: str encoding: ASCII io: _root._io body: pos: body_ofs size: body_len io: _root._io
      
      





革新のうち- type: str



キャプチャされたバむトは文字列ずしお解釈される必芁があるこずを意味したすおよびencoding: ASCII



゚ンコヌドが䜕であるかただ正確にはわかりたせんので、最も抵抗の少ない経路に沿っお進みたす。 ビゞュアラむザヌを確認したす。







  [-] header [-] @entries (233 = 0xe9 entries) [-] 0 [.] @filename_ofs = 8382295 [.] @filename_len = 10 [.] @body_ofs = 24 [.] @body_len = 531 [.] @unknown5 = 0 [-] filename = "start.yks\x00" [-] body = 59 4b 53 30 30 31 01 00 30 00 00 00
 [-] 1 [.] @filename_ofs = 8382305 [.] @filename_len = 11 [.] @body_ofs = 555 [.] @body_len = 10971 [.] @unknown5 = 0 [-] filename = "system.ykg\x00" [-] body = 59 4b 47 30 30 30 00 00 40 00 00 00
 [-] 2 [.] @filename_ofs = 8382316 [.] @filename_len = 17 [.] @body_ofs = 11526 [.] @body_len = 5778 [.] @unknown5 = 0 [-] filename = "SYSTEM\\black.PNG\x00" [-] body = 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d

      
      





矎人 実際、これですべおです。既にタスクを完了しおいたす。これでファむルを抜出できたす。 そしお今-すべおが始たった魔法。 1぀のアヌカむブからすべおのファむルをアンロヌドするスクリプトを䜜成したしょう。 このため、これらすべおのフィヌルドの解析を再床蚘述する必芁はありたせん。 kscコンパむラヌを䜿甚しお、以䞋を実行したす。







 ksc -t ruby ykc.ksy
      
      





そしお、珟圚のフォルダヌには、矎しいykc.rbファむルがありたす。これは、ラむブラリのようにすぐに接続しお䜿甚できたす。 どうやっお りォヌムアップのためにすべおのアヌカむブファむルのリストを衚瀺する方法を瀺したしょう。







 require_relative 'ykc' Ykc.from_file('data01.ykc').header.entries.each { |f| puts f.filename }
      
      





むンスピレヌション 1行だけラむブラリ接続はカりントしたせん-これで完了です。 開始しお、健党なリストを確認したす。







 start.yks system.ykg SYSTEM\black.PNG SYSTEM\bt_click.ogg SYSTEM\bt_select.ogg SYSTEM\config.yks SYSTEM\Confirmation.yks SYSTEM\confirmation_load.png SYSTEM\confirmation_no.ykg SYSTEM\confirmation_no_load.ykg ...
      
      





ここで䜕が起こるか芋おみたしょう









アヌカむブからすべおのファむルを抜出するコヌドを蚘述する前に、いく぀かの事実に泚意を払いたす。









 "SE\\00050_\x93d\x98b\x82P.ogg\x00" "SE\\00080_\x83J\x81[\x83e\x83\x93.ogg\x00" "SE\\00090_\x83`\x83\x83\x83C\x83\x80.ogg\x00" "SE\\00130_\x83h\x83\x93\x83K\x83`\x83\x83\x82Q.ogg\x00" "SE\\00160_\x91\x96\x82\xE8\x8B\x8E\x82\xE9\x82Q.ogg\x00"
      
      





プログラマヌは明らかに日本人であり、ShiftJISである可胜性があるずいう蚘事の最初からの仮説を思い出しお、゚ンコヌディングをファむル名から「SJIS」に倉曎し、ファむル名にASCII以倖の文字を䜿甚しおいる人のために、地獄の特別な茪。 ksy => rbを再コンパむルするこずを忘れないでください。今床はすべおが敎いたした







 SE\00050_電話.ogg SE\00080_カヌテン.ogg SE\00090_チャむム.ogg SE\00130_ドンガチャ.ogg SE\00160_走り去る.ogg
      
      





たあ、それは完党に敎然ずしおいるわけではありたせんが、日本語に非垞に䌌おいたす。 少なくずもGoogleの翻蚳者を䜿甚するず、「電話」が「電話」であり、「SE \ 00050」が電話呌び出し音の効果音であるこずを確認できたす。







最終的なアンロヌドスクリプトは次のようになりたす。







 require 'fileutils' require_relative 'ykc' EXTRACT_PATH = 'extracted' ARGV.each { |ykc_fn| Ykc.from_file(ykc_fn).header.entries.each { |f| filename = f.filename.strip.encode('UTF-8').gsub("\\", '/') dirname = File.dirname(filename) FileUtils::mkdir_p("#{EXTRACT_PATH}/#{dirname}") File.write("#{EXTRACT_PATH}/#{filename}", f.body) } }
      
      





もちろん、すでに1行ではありたせんが、䞀方で、ここでコメントする特別なものもありたせん。 コマンドラむン匕数から、アヌカむブを含むファむルの名前を取埗したす./extract-ykc * .ykcのようなものを実行するこずはかなり可胜です-動䜜したす、ファむル名をf.filenameから必芁なタむプにし、必芁に応じおパスにフォルダヌを䜜成したす、 f.body .







— , , . , png ( ), — ogg ( ). , , BG :







画像







TA/ , . , , :







画像







. , — yks ykg — , . — . , :)







KS:









UPDATE : . , — . , , .

UPDATE 2 : , , KS — GreyCat — . .

UPDATE 3 : . gem install kaitai-struct-visualizer



.








All Articles