冒险解谜游戏中文网 ChinaAVG
标题:
孤岛余生 The Island - Castaway 资源文件分析
[打印本页]
作者:
vvvvvv
时间:
2010-10-12 21:22
标题:
孤岛余生 The Island - Castaway 资源文件分析
这个游戏蛮有意思的,看了下,资源文件是程序目录下的 localisation.lbm 。文件最后8字节是两个校验,随便改一下文件里面的字串内容会通不过校验。
5 [! i: L2 F" S+ X) ^
. X0 u9 v6 L2 v. Q/ p4 R
最后8字节其中前面四个是普通的32位校验和,就是把除了最后8字节的所有字节sum总和。后四个字节是32位校验平方和,也就是最后8字节前面所有字节每个平方后总和。
0 z- l+ E; Z/ ^% ]0 Y5 ^
同时产生验证两个校验,有点变态。。。
- O3 U0 D) h5 S; I
" r ~* h0 i: A3 i! z/ K( P
用OD下在ReadFile上,1.0版本的Island.exe的0061EBE3处,程序首次就会读取localisation.lbm,读两次,第一次B000h个,第二次读剩下的。
0 ]7 D7 h5 v3 G f
0061EBD7 |. 6A 00 push 0 ; /pOverlapped = NULL
0061EBD9 |. 50 push eax ; |pBytesRead
0061EBDA |. 8B03 mov eax, dword ptr [ebx] ; |
0061EBDC |. FF75 10 push dword ptr [ebp+10] ; |BytesToRead
0061EBDF |. 51 push ecx ; |Buffer
0061EBE0 |. FF3430 push dword ptr [eax+esi] ; |hFile
0061EBE3 |. FF15 80326300 call dword ptr [<&kernel32.ReadFile>] ; \ReadFile
复制代码
0 G ]- `) }4 v0 L: T! A
下面就是校验代码了,patch程序的话把005A4FF4处的 jnz 改 jmp 就可以无视校验,不想改程序那就自己算校验和。。。下面程序里005A4F84到005A4FB8的循环就是算校验的,
, o! k1 F" t" _& p! B# Z
出循环后ebx是校验和,[esp+14]是“校验平方和”。005A4FEA处的repe cmps进行比较,结果sete al 。
* g& g: x2 Y* q; }$ f9 M% z6 W9 G- M
005A4F84 |> /8B4424 10 /mov eax, dword ptr [esp+10] ; CheckSum(32bit)
005A4F88 >|. |8A0C06 |mov cl, byte ptr [esi+eax]
005A4F8B |. |8BC1 |mov eax, ecx
005A4F8D |. |25 FF000000 |and eax, 0FF
005A4F92 |. |99 |cdq
005A4F93 |. |03D8 |add ebx, eax
005A4F95 |. |13EA |adc ebp, edx
005A4F97 |. |8AC1 |mov al, cl
005A4F99 |. |F6E9 |imul cl
005A4F9B |. |8B4C24 14 |mov ecx, dword ptr [esp+14]
005A4F9F |. |25 FF000000 |and eax, 0FF
005A4FA4 |. |99 |cdq
005A4FA5 |. |03C8 |add ecx, eax
005A4FA7 |. |8B4424 18 |mov eax, dword ptr [esp+18]
005A4FAB |. |13C2 |adc eax, edx
005A4FAD |. |46 |inc esi
005A4FAE |. |3BF7 |cmp esi, edi
005A4FB0 |. |894C24 14 |mov dword ptr [esp+14], ecx
005A4FB4 |. |894424 18 |mov dword ptr [esp+18], eax
005A4FB8 |.^\7C CA \jl short 005A4F84
005A4FBA |> 8B4C24 18 mov ecx, dword ptr [esp+18]
005A4FBE |. 8B5424 14 mov edx, dword ptr [esp+14]
005A4FC2 |. 6A 01 push 1
005A4FC4 |. 6A 00 push 0
005A4FC6 |. 51 push ecx
005A4FC7 |. 52 push edx
005A4FC8 |. E8 73260700 call 00617640
005A4FCD |. 03C3 add eax, ebx
005A4FCF |. 13D5 adc edx, ebp
005A4FD1 |. 895424 18 mov dword ptr [esp+18], edx
005A4FD5 |. 8B5424 10 mov edx, dword ptr [esp+10]
005A4FD9 |. 03FA add edi, edx
005A4FDB |. 894424 14 mov dword ptr [esp+14], eax
005A4FDF |. 33C0 xor eax, eax
005A4FE1 |. B9 02000000 mov ecx, 2
005A4FE6 |. 8D7424 14 lea esi, dword ptr [esp+14]
005A4FEA |. F3:A7 repe cmps dword ptr es:[edi], dword p>
005A4FEC |. 5F pop edi
005A4FED |. 0F94C0 sete al
005A4FF0 |. 84C0 test al, al
005A4FF2 |. 5D pop ebp
005A4FF3 |. 5B pop ebx
005A4FF4 75 07 jnz short 005A4FFD ; 校验
005A4FF6 |> 33C0 xor eax, eax
005A4FF8 |. 5E pop esi
005A4FF9 |. 83C4 0C add esp, 0C
005A4FFC |. C3 retn
005A4FFD |> 33C0 xor eax, eax
005A4FFF |. 8A02 mov al, byte ptr [edx] ; 文件头?
复制代码
+ x3 T- t2 s% m; `. \. d
2 M$ T* T0 I1 m0 N' ?
自己写代码算的话,可以把上面循环简化下,好像下面。。。假定pBuf指向内存中的文件头,nSize是文件长度
xor ebx,ebx
xor ebp,ebp
mov esi,pBuf
mov edi,pBuf
add edi,nSize
sub edi,8
.while esi < edi
movzx eax,byte ptr[esi]
add ebx,eax
mov ecx,eax
mul ecx
and eax,0ffh
add ebp,eax
inc esi
.endw
复制代码
4 |3 y1 M$ D0 k5 X% O0 F4 j4 D& J# D
出来ebx、ebp就是结果。
% [+ P7 [) r9 o9 [0 a
/ m1 X3 `6 L* j4 F7 a4 Y7 @
代码005A4FFF后面就是解析文件了,每个字符串前的字节是字串长度,再前面的0意义不明。改LocalString后面的字串就行,不过汉字还是要做字库的,游戏用的DX8。
作者:
vvvvvv
时间:
2010-10-12 21:26
忘了“校验平方和”平方后只取字节值,其余丢弃,也就是要and 0ff
作者:
naptid
时间:
2010-10-12 22:30
如果在这基础上能做个打包机就好了……另外不知字库资源图在哪里?
作者:
shane007
时间:
2010-10-13 07:52
楼主能否留个qq以备联系?
作者:
vvvvvv
时间:
2010-10-17 19:14
做打包工具好花时间。。。如下,使用看说明文件
8 {/ \: `$ H, e9 G* d O
[attach]17632[/attach]
作者:
shane007
时间:
2010-10-17 19:37
vvvvvv, 你好,是否愿意为AVG汉化贡献一份力量?
1 p5 x+ g, j0 h6 y
有一些AVG的汉化需要你的帮助。能否留下qq?
作者:
vvvvvv
时间:
2010-10-17 20:05
楼上版主看短消息
作者:
bmwmj
时间:
2010-11-8 12:31
字库应该在data.grp文件里
. e/ u1 A$ f$ \. E) {/ R
没找到能解开这个grp的工具
作者:
shane007
时间:
2010-11-8 12:42
这个游戏应该不属于解迷类的吧
作者:
bmwmj
时间:
2010-11-8 12:51
还算是这类吧,动作解谜,挺好玩的,主要是最近老看找图游戏有点头晕了
欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/)
Powered by Discuz! X3.2