ras文件怎么用(马克思佩恩3)

破解日记&-&马克思佩恩(Max&Payne)&.ras数据解释
破解日记 - 马克思佩恩(Max Payne) .ras数据解释
作者:blues_city @
插件信息:
&&&&&&&&&&&&&&&
Plugin: MaxPayne.dll Info
Copyright: Remedy Entertainment
Extension: *.*.mp2m TypeCode: 1
Auther: blues_city& at
日(星期日)& Ver: v1.00.080727
Notion: 解Max Payne 中文名:马克思佩恩又名英雄本色的游戏的 ras文件用的插件。
&&&&&&&&&&&&&&&
Plugin: MaxPayne.dll Info end
support game:(支持游戏,已经测试过了的):
MaxPayne 2 The Fall of MaxPayne
可能只有这个系列的两代用过这个系统吧……,其他的不知道了。
关于游戏的介绍……
二代(有中文版):
曾经很迷这个游戏,为了什么呢?嗯,是那种杀人的爽快感?或者是那种子弹时间的特殊效果?还是着迷那个充满了英雄主义、迷幻色彩和宿命感的故事?不管如何,为了见到最后的隐藏结局,我还特地通关了两次……。也算是少有的能让我玩上第二次的游戏了吧。
嗯,其实关于数据的解释工作,在玩第一代的时候就打算做了的,可是当初没有办法做出来。后来弄到了一个汉化版……。发现是以一个MOD的方式发行的。于是打开来看了看……。说起来这些都是半年前发生的事了,不知道为什么当时会被放下了这么久的。一直到最近重新拿到手,并完成了代码的分析后,才想起原因来的--这个游戏的封包做得太变态了……:
整个目录数据部分都进行了加密,而游戏的数据部分则根本没有进行过任何的加密和压缩……。根本就是专们用来防止进行反向工程用的……,也就是说,如果你不在意什么文件名的话,只想看看里面的图呀什么的,根本可以用抽取插件直接从里面得到想要的特定类型的文件数据的。
好了……。先说文件头部数据。整个的文件分成四个部分,不是一般文件的三个部分,分别是:头部数据区 文件项数据区 路径项数据区
DATA数据区,文件项中没有包含路径的项目,所以专们放了一项,也许是为了压缩空间吧,另外,这两项中都是不定长度的项目的。
//总长。。。0x2c
struct head
magic[4];&&&//RAS
&&&//当前文件的处理基础
MASK标志。
&//以下长24.
&&&//目录项的个数。
&&&//路径项目的个数。
&&//目录项的大小。
&&&//路径项目的大小。
&DWORD unK
总长是2CH个字节,其中大多数都是UNKOWN,其他的先不管有什么用了……,那个KEY是整个文件解码的关键,其他的区的数据都要使用这个KEY作为起始条件来进行解码。
文件项和目录项部分都是不定长的,因为有文件名的部分是不定长的。所以以下的结构没有包含那些部分。长度1和2一般来说都是相同,还没有发现不相同的,虽然理论上应该有不相同的存在的。这两项的关系还不确定。
struct entry
&&&//长度1
size2;&&&//长度2
ZERO;&&&//0,一般来说的。
&&&//文件所在目录项的编号。因为文件名部分没有目录。
ZERO2;&&&//0
U&&//3 alway.
&&&//D3 07
&BYTE& unKOWN[12];
//同上,不包含目录名的部分。
struct pathentry{
H&&&//谁知道。
Unknown[12];&&//I don't want to
know What is it
数据的解码流程:直接放MASM码……,老实说,其实我也根本没有全看明白。那个KEY就是之前head 项目中的key
,三个部分每个部分都要用这个来作为初始值进行运算。另外,i 也是每次都要从0开始运算的。(head部分的解压从第8
个字节开始运算,也就是说,跳过前面的magic和key
标志的部分开始解码。);号后的注释是我一边跟踪时一边写下的笔记,不喜欢看我?嗦就请无视吧。
&/$& 8B4424
mov eax,dword ptr
ss:[esp+C]&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
& |.& 83EC
08&&&&&&&&
85C0&&&&&&&&&&&
test eax,eax
53&&&&&&&&&&&&&
004016BA& |.&
55&&&&&&&&&&&&&
004016BB& |.&
56&&&&&&&&&&&&&
004016BC& |.&
57&&&&&&&&&&&&&
004016BD& |.& 75
08&&&&&&&&&&
jnz short RASMaker.
004016BF& |.& C74424 24
01000&mov dword ptr
ss:[esp+24],1&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& 当key = 0 时,初始化为1
mov eax,dword ptr
ss:[esp+20]&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& len 结束长度
004016CB& |.&
85C0&&&&&&&&&&&
test eax,eax
004016CD& |.& C74424 10
00000&mov dword ptr
ss:[esp+10],0&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& *sep+10 = 0 = i
7C&&&&&&&&&&
jle short RASMaker.
& |.& 8B6C24
mov ebp,dword ptr
ss:[esp+1C]&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& +1c = buff = 输入数据的起点。(这里输入输出在同一个地方)
004016DB& |.& EB
03&&&&&&&&&&
jmp short RASMaker.
004016DD& |&&
00&&&&&&&&
lea ecx,dword ptr
ds:[ecx]&&&&&??这个操作有用的吗?
loop start
/mov eax,dword ptr
ss:[esp+10]&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& esp+10 -& eax i
33D2&&&&&&&&&&&
edx,edx&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& edx = 0
ecx,5&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
004016EB& |.&
F7F1&&&&&&&&&&&
ecx&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& eax / ecx -& eax edx(余数)
004016ED& |.& 895424
|mov dword ptr
ss:[esp+14],edx&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& esp+14 存放余数
66:60&&&&&&&&&&
|pushaw&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& 这里压了4个DWORD进去 esp 74 -& 64
& |.& 8B4C24
|mov ecx,dword ptr
ss:[esp+24]&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& esp+24 = esp + 14 = 余数
& |.& 8B5C24
|mov ebx,dword ptr
ss:[esp+2C]&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& esp+2c = esp + 1c = buff
004016FB& |.& 035C24
|add ebx,dword ptr
ss:[esp+20]&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& esp+20 = esp + 10 = buff[i]
004016FF& |.&
8A03&&&&&&&&&&&
|mov al,byte ptr
ds:[ebx]&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& inbuff[i]
到这里为止其实就做了这一个操作而已。
D2C0&&&&&&&&&&&
al,cl&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& 94循环左移余数位 (0-4)
8803&&&&&&&&&&&
|mov byte ptr
ds:[ebx],al&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& 存回去?缓冲
66:61&&&&&&&&&&
|popaw&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& 再弹回来 abcd
其他的都没有什么用。
& |.& 8B4C24
|mov ecx,dword ptr
ss:[esp+24]&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& ESP24 = key
0040170B& |.& B8
FB4321B9&&&&
|mov eax,B92143FB
F7E9&&&&&&&&&&&
ecx&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& ax * cx -&ax dx
03D1&&&&&&&&&&&
edx,ecx&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& edx + ecx -& edx
& |.& 69C9
AB000000&& |imul
ecx,ecx,0AB&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& ecx = ecx * ab
0040171A& |.& C1FA
07&&&&&&&&
edx,7&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& edx && 7
0040171D& |.&
8BC2&&&&&&&&&&&
eax,edx&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& eax = edx
0040171F& |.& C1E8
1F&&&&&&&&
eax,1F&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& eax = 0 or 1
03C2&&&&&&&&&&&
eax,edx&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& +0 or 1
& |.& 69C0
3D760000&& |imul
eax,eax,763D&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
0040172A& |.&
2BC8&&&&&&&&&&&
ecx,eax&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& ecx -= eax
0040172C& |.&
8BD1&&&&&&&&&&&
edx,ecx&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& edx = ecx
0040172E& |.& 8B4C24
|mov ecx,dword ptr
ss:[esp+10]&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
8AC1&&&&&&&&&&&
al,cl&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
03&&&&&&&&&&
al,3&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
06&&&&&&&&&&
bl,6&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
F6EB&&&&&&&&&&&
bl&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& ax = al * bl
0040173A& |.&
320429&&&&&&&&&
|xor al,byte ptr
ds:[ecx+ebp]&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& xor 原本之前处理过的那个字节。
0040173D& |.&
02C2&&&&&&&&&&&
al,dl&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
al = (i + 3) * 6 xor 原本处理产生的数(ecx = i)
dl = 前面一堆的操作产生的数的最底位。edx
0040173F& |.&
880429&&&&&&&&&
|mov byte ptr
ds:[ecx+ebp],al&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& 最后的结果也只要最后一位
处理过后存回去,就是最后的结果。
& |.& 8B4424
|mov eax,dword ptr
ss:[esp+20]&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& esp+20 这个是 len
41&&&&&&&&&&&&&
ecx&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
3BC8&&&&&&&&&&&
ecx,eax&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& where( i & len)
& |.& 895424
|mov dword ptr
ss:[esp+24],edx&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;& 新的key, = edx里的数了。
0040174D& |.& 894C24
|mov dword ptr
ss:[esp+10],ecx&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
8D&&&&&&&&&&
RASMaker.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
5F&&&&&&&&&&&&&
5E&&&&&&&&&&&&&
5D&&&&&&&&&&&&&
5B&&&&&&&&&&&&&
& |.& 83C4
08&&&&&&&&
0040175A& \.&
C3&&&&&&&&&&&&&
简单的说,先是把原来的数(以BYTE为单位)和i(一个从0开始的数)除以5得到的余数进行循环左移操作。(循环左移,没有找到相对应的C代码呢,还真是个奇怪的运算。)
之后把KEY和一个叫做 B92143FB 的进行这样子和那样子怎么说都说不清的事后,再和 (i +3) * 6 xor
上面产生的那个奇怪的数进行加法操作。
最后只取最底位的结果,写回去作为结果的值。之后之前运算出的结果变成新的KEY,再计算下一个……。
不知道这个运算公式有多正确,而且其中的 pushaw 和
popaw 两个操作完全是花指令,完全是为了扰乱进程而加进去的,实际上的代码我完全去掉了这两个指令也得到了相同的结果。代码的后面我注明了实际的指代是什么来的。而那个怎么都说不清的运算我也不知是否真的是必要的……,还是只是为了扰乱运算才加进去了……。实在是,弄得人太累了……。
插件下载:
请到我的MO空间下载,本插件整合在 ripfilec 0.06版中一起发布了。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

参考资料

 

随机推荐