是拿RWHF来开刀的=。=
我追了两个版本,一个是RW的体验版,另一个就是HF了。
对比两个版本,压缩算法其实是一样的,只是细节的地方有点变更。
基本可以确定压缩算法是Lzss
Reallive的压缩也是类似的算法,Lz77的吧。(我记得)
第一次接触Lzss,感觉还是很简单的。
但要玩更高级的加密,可能又只有去啃书了orz
对于Lzss的讲解我得感谢这位
http://book.51cto.com/art/200903/112934.htm
废话不多说
下面提供相关的结果
扔在这里,万一哪天要汉化Siglus开发的游戏我还能用上。
Siglus本身的汉化很简单,字符串都是Unicode,自己改改再Push回去就ok了。
对SiglusEngine的VMcode的解析看来是很困难的了,
系统函数在exe里有详细记录(坐等有人哪天能做出xclannad一样的神物)
撤回前言,那基本不可能,对于Siglus的图形,我实现了基本+PixelShader
剩下的需要VMcode解析和VM变量的解析。
这坑我不会做的,本来我逆向的能力就很差,没事就别找坑跳了orz
==============================================================
最后多嘴几句,提取的时候进行先进行xor解密,然后再解压。
我追了两个版本,一个是RW的体验版,另一个就是HF了。
对比两个版本,压缩算法其实是一样的,只是细节的地方有点变更。
基本可以确定压缩算法是Lzss
Reallive的压缩也是类似的算法,Lz77的吧。(我记得)
第一次接触Lzss,感觉还是很简单的。
但要玩更高级的加密,可能又只有去啃书了orz
对于Lzss的讲解我得感谢这位
http://book.51cto.com/art/200903/112934.htm
废话不多说
下面提供相关的结果
005D8250 /$ 55 PUSH EBP
005D8251 |. 8BEC MOV EBP,ESP
005D8253 |. 83EC 10 SUB ESP,10
005D8256 |. 85C0 TEST EAX,EAX
005D8258 |. 75 06 JNZ SHORT SiglusEn.005D8260
005D825A |> 33C0 XOR EAX,EAX
005D825C |. 8BE5 MOV ESP,EBP
005D825E |. 5D POP EBP
005D825F |. C3 RETN
005D8260 |> 8D48 04 LEA ECX,DWORD PTR DS:[EAX+4] ;ecx = 编码后的Size?
005D8263 |. 8B01 MOV EAX,DWORD PTR DS:[ECX] ;eax = size2
005D8265 |. 83C1 04 ADD ECX,4 ;ecx = datablock?
005D8268 |. 85C0 TEST EAX,EAX ;size = 0,就跳过
005D826A |. 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX
005D826D |. 894D F4 MOV DWORD PTR SS:[EBP-C],ECX
005D8270 |.^74 E8 JE SHORT SiglusEn.005D825A
005D8272 |. 85D2 TEST EDX,EDX ;edx = AllocSave
005D8274 |. 74 5B JE SHORT SiglusEn.005D82D1
005D8276 |. 53 PUSH EBX
005D8277 |. 56 PUSH ESI
005D8278 |. 03C2 ADD EAX,EDX ;eax = AllocSaveEndPos
005D827A |. 57 PUSH EDI
005D827B |. 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX
005D827E |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
005D8281 |. FC CLD
005D8282 |. 8B75 F4 MOV ESI,DWORD PTR SS:[EBP-C] ;Data
005D8285 |. 8B7D F8 MOV EDI,DWORD PTR SS:[EBP-8]
005D8288 |. 33D2 XOR EDX,EDX
005D828A |> 3B7D FC /CMP EDI,DWORD PTR SS:[EBP-4]
005D828D |. 74 3C |JE SHORT SiglusEn.005D82CB ;是否完成
005D828F |. 8A16 |MOV DL,BYTE PTR DS:[ESI] ;DecodeFlag
005D8291 |. 46 |INC ESI
005D8292 |. B6 08 |MOV DH,8
005D8294 |> 3B7D FC |/CMP EDI,DWORD PTR SS:[EBP-4]
005D8297 |. 74 32 ||JE SHORT SiglusEn.005D82CB
005D8299 |. F6C2 01 ||TEST DL,1
005D829C |. 74 09 ||JE SHORT SiglusEn.005D82A7
005D829E |. 66:A5 ||MOVS WORD PTR ES:[EDI],WORD PTR DS:[ES>
005D82A0 |. A4 ||MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ES>
005D82A1 |. C607 FF ||MOV BYTE PTR DS:[EDI],0FF ;注意这个字节
005D82A4 |. 47 ||INC EDI
005D82A5 |. EB 1C ||JMP SHORT SiglusEn.005D82C3
005D82A7 |> 33C0 ||XOR EAX,EAX
005D82A9 |. 66:AD ||LODS WORD PTR DS:[ESI]
005D82AB |. 8BC8 ||MOV ECX,EAX
005D82AD |. C1E8 04 ||SHR EAX,4 ;eax /= 16;
005D82B0 |. C1E0 02 ||SHL EAX,2 ;eax *= 4
005D82B3 |. 83E1 0F ||AND ECX,0F ;ecx = ecx & 0x0F
005D82B6 |. 83C1 01 ||ADD ECX,1 ;ecx ++; 重复次数+1
005D82B9 |. 8BDE ||MOV EBX,ESI
005D82BB |. 8BF7 ||MOV ESI,EDI
005D82BD |. 2BF0 ||SUB ESI,EAX
005D82BF |. F3:A5 ||REP MOVS DWORD PTR ES:[EDI],DWORD PTR >
005D82C1 |. 8BF3 ||MOV ESI,EBX ;还原esi
005D82C3 |> D0EA ||SHR DL,1
005D82C5 |. FECE ||DEC DH ;Control?
005D82C7 |.^75 CB |\JNZ SHORT SiglusEn.005D8294
005D82C9 |.^EB BF \JMP SHORT SiglusEn.005D828A
005D82CB |> 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
005D82CE |. 5F POP EDI
005D82CF |. 5E POP ESI
005D82D0 |. 5B POP EBX
005D82D1 |> 8BE5 MOV ESP,EBP
005D82D3 |. 5D POP EBP
005D82D4 \. C3 RETN
扔在这里,万一哪天要汉化Siglus开发的游戏我还能用上。
Siglus本身的汉化很简单,字符串都是Unicode,自己改改再Push回去就ok了。
对SiglusEngine的VMcode的解析看来是很困难的了,
系统函数在exe里有详细记录(坐等有人哪天能做出xclannad一样的神物)
撤回前言,那基本不可能,对于Siglus的图形,我实现了基本+PixelShader
剩下的需要VMcode解析和VM变量的解析。
这坑我不会做的,本来我逆向的能力就很差,没事就别找坑跳了orz
==============================================================
char* FilePointer = saveMemFile;
DWORD i = 0;
//1st : Xor Decode
while(FilePointer++ <= FileEnd)
{
FilePointer ^= SiglusXorTable[i++%256];
}
最后多嘴几句,提取的时候进行先进行xor解密,然后再解压。