V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
AX5N
V2EX  ›  问与答

逆向游戏图像文件,有人能给点提示吗?

  •  
  •   AX5N · 2020-03-05 20:34:21 +08:00 · 931 次点击
    这是一个创建于 1527 天前的主题,其中的信息可能已经有所发展或是发生改变。

    逆向游戏图像文件,有人能给点提示吗?

    我没有多少逆向经验,只搞过那种打包的,没弄过纯图像的,这个过程有点看不太懂,来请教下。

    对象是 20 年前的 PC 游戏( 2D ),推测一个文件就是一个素材,这个素材大概是一个图像序列,因为是游戏素材,所以应该是支持透明的格式,但不清楚这个素材本身就是常用的动画序列格式(例如 gif ),还是纯粹的 N 张静态的图像。

    下面是这个文件的结构

    1 字节,magic number
    1032 字节,不知道什么鬼,基本都是 00 00 00 00,偶尔有一个数字,数字大概代表的是第 x 张图像。感觉不是关键
    
    4 个字节,表示次数 n,推测 n 就是图像的数量
    28 个字节 * 次数 n,推测是文件头或者是什么,大概是这样的。
    00 00 00 00  00 00 00 00  00 00 00 00  E8 FF FF FF DD FF FF FF  19 00 00 00  0E 00 00 00 
    不同的块各不相同,但总体来说是这种感觉,例如头 12 个字节都是 0,然后 8 个字节都是很大很大的数,之后 8 个字节都比较小。
    
    4 个字节,可能是图像数量,不清楚
    8 个字节,大概是下面这样的,有点像是长宽,但有时候又对不上,有时候一个很小的素材却有一个值高达 540
    31 00 00 00 31 00 00 00 
    
    4 个字节,表示次数 m,和次数 n 相等,大概就是图像的数量
    
    m 次:
      4 个字节,块长度
      N 个字节,块
      4 个字节,块长度
      N 个字节,块
    

    逆向的时候,我并没有认真读每一行的代码,前边的就大致走了下,我是直接去看解析“块”的部分的。解“块”的顺序有点诡异,不是一个字节一个字节地读,是很跳跃的,有时候前进 4 个字节,有时候又回退 2 个字节,而且解出来的内容存放方式也有点诡异,大概是一个地方写一点数据,然后又跳到另一个地方继续写,大概像这样 xxxx 00 00 00 00 00 00......xxxx 00 00 00 00 00 有时候会接连着写新的数据,有时候又会跳得很远才写。而且在 od 里看,数据也不是用 00 来填充的。

    总体来首,这些代码不算复杂,转换成高级语言问题不大,但问题是即便我把这些代码重新写一遍解开这些块后,我也不知道如何去阅读这些块,这些块到底是什么格式,需要补充什么文件头我都不知道,我推测游戏程序不会也没必要去补充文件头将这些图像变成完整的文件,直接在渲染的时候写死参数就好了。那么,这些参数是什么就很难找了,就算找到了,感觉可能也不好推测出其格式。

    我现在最想知道的是如何确定这种图像的格式。对照过 bmp 和 png 的结构,感觉...不太像?但除了这两种我也想不出还有什么格式可以用了,实在没有经验。

    4 条回复    2020-03-05 22:13:29 +08:00
    fline
        1
    fline  
       2020-03-05 20:37:01 +08:00
    看完了发现没说游戏名字?这个一般先从游戏本身用的引擎入手,报个游戏名问起来可能更快。
    ETiV
        2
    ETiV  
       2020-03-05 21:18:41 +08:00 via iPhone
    如果你只想提取文件内容,可以在游戏本身的解码函数后下断点,然后 dump 内存。

    “是很跳跃的,有时候前进 4 个字节,有时候又回退 2 个字节”
    压缩算法是这样的规律。
    然后 libpng 都是要带着 zlib 一起用的,大概率是 png 图?

    “00 00 00 00 00 00 00 00 00 00 00 00 E8 FF FF FF DD FF FF FF 19 00 00 00 0E 00 00 00 ”
    ARGB 格式?
    AX5N
        3
    AX5N  
    OP
       2020-03-05 21:31:56 +08:00
    @ETiV 我有想过直接 dump 内存,但不知道什么格式,dump 出来,不补齐文件头的话,大概率也打不开啊。(目前还没试过)

    我有想是 png 格式,理由一是因为这个算法看上去像解压算法,二是支持透明图层,三是好像只有 png 有压缩算法。但不是 png 格式也有个理由,这个游戏里似乎没有 zlib 或者 png 相关的函数,反而有 jpeg 和 bmp 相关函数。

    那个 ARGB 格式是啥意思,是如何看出来的。
    ETiV
        4
    ETiV  
       2020-03-05 22:13:29 +08:00
    支持半透明的图片,每个像素都由 alpha-red-green-blue 四种值来表示
    第一个字节表示 Alpha 通道,0x00 表示此像素纯透明,0xFF 表示纯不透明;
    然后后面 3 个字节表示颜色,所以总共 4 个字节 = 1 个像素。

    如果是这样的话,E8 FF FF FF = 91%(E8/FF ~= 91%)不透明度的纯白色
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1210 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:17 · PVG 02:17 · LAX 11:17 · JFK 14:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.