despairtck吧 关注:2,221贴子:32,407
  • 22回复贴,共1

使用quickbms提取游戏音乐的一个简单实例

只看楼主收藏回复

前几天我在找sam free music的一首音乐,由于sam free music这个素材屋已经在2010年关闭了,我要找的这首音乐已经无法再从官网下载到了。只好想了点曲线的办法。
像sam、炼狱庭园、SENTIVE这些素材屋的音乐都是可以免费使用的,所以我想肯定有许多地方引用过sam的音乐。视频的话有可能混有其它声音,所以最好找一些引用过的游戏中提取。
于是我找到了一个叫 《しあわせの魔法石》的游戏,里面引用了我要找的这首,音乐的名字叫 おやすみ 。根据官网提供的引用列表,这首音乐的文件名叫做O-01 。


IP属地:辽宁1楼2014-11-07 14:17回复

    知道了以上几点之后,我就去下游戏了。下载之后发现没有音乐文件夹。整个游戏里最大的一个文件就是 GAME.DAT ,所以所有音乐很可能就都在这个文件里了。
    注意:扩展名为DAT的文件不一定是同一类文件。自己封装的文件可以指定任意扩展名。
    这个DAT文件好像没有现成的可以提取的工具。于是我想到了标题中的quickbms,一款通用解包器(注意,并不是你随便拿一个文件放进去就能给你自动解包,没有这么厉害的东西。这个需要自己写脚本)。


    IP属地:辽宁2楼2014-11-07 14:18
    回复
      然后往后翻就能看到想要的东西了——音乐。

      注意到每一行,第一行是路径,但是好像没写完。从截图中最下面可以看到,有个d08.og,这个应该是d08.ogg 才是完整文件名,从中我们知道了一个有用的信息,这些音乐的格式是ogg。
      另一方面,两个路径之间相隔很短,中间不可能含有文件(通常一个文件很长,音乐估计至少也要1M),所以说,前面这些大家可以当成是文件索引,文件应该在后头。


      IP属地:辽宁4楼2014-11-07 14:21
      回复
        那么两个文件中间的部分究竟是什么内容呢?
        先找到我要的那个文件O-01。然后观察一下前后。

        发现每个路径下一行,前8位有内容,中间都是0,最后4位有内容。3、4行就都是0了。
        由于路径不完整,所以第2行前8位可能是路径的后续(为什么不能正常显示不清楚)。0的部分先忽略。 最后4位估计是记录了音乐文件在这个GAME.DAT中的具体位置(要不然游戏本体岂不是找不到音乐了)。
        观察一下,free03的下面是 70 d9 ac 05, 这里面我们需要倒过来看,也就是05 ac d9 70。然后依次观察
        (后4位倒过来之后)
        free03 05 ac d9 70
        O01 05 c0 ef e0
        k05 05 cd a3 70
        都是05,然后是依次增长的。由于文件是依次在文件里的,所以这些依次增长的数应该就是文件的位置。如果猜测每一个是该文件的结束位置,那么 O01这个文件结束位置就是05 c0 ef e0了。


        IP属地:辽宁5楼2014-11-07 14:23
        收起回复
          我们来看一下05 c0 ef e0这个位置是什么。

          这一行开头是OggS。 我们使用Hex Editor Neo随便打开一个电脑里的ogg文件试试,会发现ogg文件的开头好像都是OggS。也就是说,前面说05 c0 ef e0可能是音乐的位置,这个推测应该是正确的。
          那么这个文件大小应该是多少?在哪里结束?
          猜测下一个文件的开始应该是上一个文件的结束。
          05 c0 ef e0这个位置猜测是 O-01的结束位置,那么就应该是下一个文件k05的起始位置。
          那么我要找O-01,只要从前一个文件free03的结束位置05 ac d9 70输出到05 c0 ef e0就可以了。


          IP属地:辽宁6楼2014-11-07 14:24
          收起回复
            接下来使用quickbms,这里需要用到的一些指令可以在这个贴查到http://tieba.baidu.com/p/1742428872
            我们需要用到的是log,关于它的介绍:
            log NAME OFFSET SIZE [FILENUM]
            提取文件,本操作不影响输入文件的当前位置计数器,提取的文件内容能够自动使用Encryption命令进行解密。
            参数: NAME 输出文件名称
            OFFSET 定位文件在资源中的位置
            SIZE 提取的数据大小
            FILENUM 与资源关联的文件号
            然后新建一个txt文档,写下代码
            math size = 0x05c0efe0
            math size -= 0x05acd970 //做减法,计算文件大小
            set name string "O01.ogg"
            log name 0x05acd970 size
            保存txt,起名叫ogg.txt


            IP属地:辽宁7楼2014-11-07 14:25
            回复
              然后启动quickbms,第一步,制定要使用的脚本

              第二步,制定要解包的文件,也就是GAME.DAT

              第三步,选择输出的目录。


              IP属地:辽宁8楼2014-11-07 14:27
              回复
                然后文件就成功输出啦~


                IP属地:辽宁9楼2014-11-07 14:28
                回复
                  哇,好有技术含量


                  IP属地:广东来自WindowsPhone客户端11楼2014-11-08 01:25
                  回复
                    查了一下,しあわせの魔法石用的是Shooting Game Builder引擎开发的游戏.
                    我想如果用这个开发引擎的话,应该能对游戏本体进行反编译,然后就能解包BGM.
                    结果没想到的是,Shooting Game Builder的官网也关闭了.


                    12楼2014-11-08 10:43
                    收起回复
                      楼主还在吗


                      IP属地:陕西来自Android客户端14楼2020-07-02 15:45
                      收起回复