质量效应吧 关注:55,982贴子:2,406,523

【技术讨论】MEA文件解包的那些事儿

只看楼主收藏回复

由于生软从DAI开始采用了寒霜引擎……所以导致以前针对于生软制作的游戏(Unity引擎)所编写的各种tools均无法使用。由于Mod制作、汉化制作、模型贴图提取等等需求,从头分析MEA的文件结构,尝试解密文件变得尤为重要。幸运的是,由于DAI的文件系统分析的已经较为透彻,所以给分析MEA的文件进程减轻了很多压力。但是,由于EA莫名的尿性,导致所有采用寒霜引擎的每一款游戏的文件系统都存在略微差别……随着国内外玩家的深入研究,今天我在这里大致讲解一下我的研究进程,此研究也和我们尝试进行的内核精确翻译密不可分。


IP属地:加拿大1楼2017-04-06 15:22回复

    首先我们来浏览一下文件主目录,除了主程序和一些DLL动态链接库文件以外,剩下的就是文件夹了。而我们说的“包”就在Data文件夹下。


    IP属地:加拿大2楼2017-04-06 15:27
    回复
      抱着德拉克老爷前排围观


      IP属地:江西来自手机贴吧3楼2017-04-06 15:29
      收起回复


        进入Data/Win32目录,我们可以看到这里有几十个toc文件,以及一些文件夹。而这些文件在我们的解包过程中将会扮演极为重要的角色。


        IP属地:加拿大4楼2017-04-06 15:29
        回复
          首先来讲解一下采用寒霜引擎的游戏如何调用资源的。
          首先,游戏开发者们会将游戏内运用到的资源(比如模型,贴图,文本,语音,BGM,CG动画等)放置到一个(或几个)加密并压缩的大型文件内。游戏运行时,主程序会调用DLL动态数据库,将这些大型文件调用到内存(或显存)中,然后调用解密和解压的语句,直接访问这些大型文件。在这个大型文件中,存在一个Virtual File System(虚拟文件系统),所有单独的资源文件都存在自己的一个虚拟路径。主程序当需要将某些资源文件加载进内存时,会通过一些特定的文件和语句(后面会讲到),寻找到这些资源文件的虚拟路径并加载。所以这些步骤是如何进行的呢?下面我们具体讲一讲。


          IP属地:加拿大5楼2017-04-06 15:37
          回复
            下面讲一下寒霜引擎的真实文件系统和文件格式。
            在一个寒霜引擎的资源文件夹里(也就是这里的Data文件夹),会存在四种不同格式的文件,他们本别是:
            TOC文件,包含了所有资源的SHA1值(文件签名)。
            SB文件,包含了对应的TOC文件中所有资源的SHA1的具体包地址。
            CAS文件,资源文件,即上文所说的大型文件。每一个CAS文件都是一个虚拟文件系统。
            CAT文件,对应相对的CAS文件,CAT文件包含了对应CAS文件中每一个资源的SHA1,offset(偏移量)以及size(大小)。


            IP属地:加拿大6楼2017-04-06 15:45
            回复
              游戏主程序调用步骤:
              运行主程序——挂载DLL——加载所有CAT和CAS——加载所有TOC——根据所需资源,在TOC和SB中获取所需资源对应的SHA1和包地址——根据包地址,在CAT中寻找对应SHA1——获取对应资源的offset和size——根据SHA1、offset和size,在CAS包文件中找到对应的block(区块)——调用到内存,解密,并输出


              IP属地:加拿大7楼2017-04-06 15:48
              回复
                所以,我们如何模拟游戏主程序的方式,查到到我们所需的资源并且将其提取出来呢?首先我们从TOC文件做起。我们可以通过读取TOC+SB文件的方式,了解所有资源对应的CAS文件以及SHA1,了解这些文件的格式类型,方便我们区分资源类型并且提取。


                IP属地:加拿大8楼2017-04-06 15:53
                回复
                  请继续,坐等大神讲解


                  IP属地:广东9楼2017-04-06 17:07
                  收起回复
                    最好能贴代码啦


                    IP属地:广东10楼2017-04-06 18:05
                    回复
                      要虚拟出一个地址来通过代码来访问而不是路径,怪不得内存需求涨的这么高


                      IP属地:黑龙江来自手机贴吧11楼2017-04-06 18:28
                      回复
                        好复杂,学习了。


                        IP属地:黑龙江来自iPhone客户端12楼2017-04-06 18:48
                        回复
                          mark


                          IP属地:广东来自Android客户端13楼2017-04-06 18:54
                          回复


                            IP属地:江西来自Android客户端14楼2017-04-06 19:53
                            回复


                              IP属地:北京来自Android客户端15楼2017-04-06 22:11
                              回复