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

2020-03-05 20:34:21 +08:00
 AX5N

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

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

对象是 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 的结构,感觉...不太像?但除了这两种我也想不出还有什么格式可以用了,实在没有经验。

946 次点击
所在节点    问与答
4 条回复
fline
2020-03-05 20:37:01 +08:00
看完了发现没说游戏名字?这个一般先从游戏本身用的引擎入手,报个游戏名问起来可能更快。
ETiV
2020-03-05 21:18:41 +08:00
如果你只想提取文件内容,可以在游戏本身的解码函数后下断点,然后 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
2020-03-05 21:31:56 +08:00
@ETiV 我有想过直接 dump 内存,但不知道什么格式,dump 出来,不补齐文件头的话,大概率也打不开啊。(目前还没试过)

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

那个 ARGB 格式是啥意思,是如何看出来的。
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%)不透明度的纯白色

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/650204

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX