Menu

【笔记】《仙剑奇侠传4》SMP音乐解密部分研究(附源代码) » MaYaFei’s StuDio

0 Comment

仙剑5先前卖了一段工夫。,简直所有些人器都先前创造出现了。,由于这术语的追逐自然啦涣散。,通常我有更多的自由地工夫。,不计研讨生的录取入学不计,近亲也研讨了一下uedbet体育SMP的解密,把它贴起来作为研究笔记与大师分享。。其余的,SMP解密器先前在互联网网络上停止。,因而最好的想解密音乐的先生去另本人网站下载。,这时的宾格是剖析SMP证件的解密规律。。

进入学科,应用WiHEX检查SMP证件,查找证件头识别符RST和CPK证件坚固性,往下看,简直没明文。,终结地在OD上。旧规则与CreateFileW分裂,在游玩顺序中使被安排好证件句柄时坐下

将顺序领空返乡到790C8F。,F8一向沿路而行。,790CD8790CEE读取证件头。,并认可证件识别符为0x1A545 352(即RST)。:

00790CD5  |> 8D5E 08       lea     ebx, dword ptr ESI+8]
00790CD8  |.  68 80000000   push    80
00790CDD  |.  53            push    ebx
00790CDE  |.  50            push    eax
00790CDF  |.  E8 FC090000   call    
00790CE4  |.  8B03          mov     eax, dword ptr [EBX]
00790CE6  |.  83C4 0C       add     esp, 0C
00790CE9  |.  3D 5253541A   cmp     eax, 1A545352
00790CEE  |.  74 38         je      short 00790D28

与下降到790d28,取证件的0x10偏移的dWord值。,与向左提议到5位。,计算本人值,并应用此值作为把缓冲液加入显得庞大持续读取证件。

00790D28  |> 8B56 18       mov     edx, dword ptr ESI+18]
00790D2B  |.  8B86 AC001000 mov     eax, dword ptr ESI+1000AC]
00790D31  |.  C1E2 05       shl     edx, 5
00790D34  |.  8D9E 88000000 lea     ebx, dword ptr ESI+88]
00790D3A  |.  52            push    edx                    ;  dwSize: ESI + 8] << 5
00790D3B  |.  53            push    ebx                    ;  把缓冲液加入
00790D3C  |.  50            push    eax                    ;  hFile
00790D3D  |.  E8 9E090000   call    
00790D42  |.  83C4 0C       add     esp, 0C
00790D45  |.  84C0          test    al, al
00790D47  |.  75 38         jnz     short 00790D81

其次是键入。,由于辨向方才读取的使满意的指导者称为堆栈转让。 0x7919D0。

00790D81  |> 68 00001000   push    100000
00790D86  |.  53            push    ebx
00790D87  |.  E8 440C0000   call    007919D0

F7跟进呼叫,791B8F-791C5D很整数的的现实影响是MEMCPY。,模仿两组0x1000显得庞大的履历。,与有两个呼叫。,履历窗口尾随并类似的并发展转让被解密D。

00791C63  |.  8D8C24 800000>lea     ecx, dword ptr [esp+80]
00791C6A  |.  8D9424 800100>lea     edx, dword ptr [esp+180]
00791C71  |.  51            push    ecx                     ;  pPasswd
00791C72  |.  68 00040000   push    400                     ;  dwSize
00791C77  |.  52            push    edx                     ;  PDATA
00791C78  |.  E8 23FCFFFF   call    
00791C7D  |.  8D8424 8C0000>lea     eax, dword ptr [esp+8C]
00791C84  |.  8D8C24 901100>lea     ecx, dword ptr [esp+1190]
00791C8B  |.  50            push    eax                     ;  pPasswd
00791C8C  |.  68 00040000   push    400                     ;  dwSize
00791C91  |.  51            push    ecx                     ;  PDATA
00791C92  |.  E8 09FCFFFF   call    

尾随此解密转让并停止指定遗传密电码剖析。,另一句话。,在我开端在前,我用IDA来剖析炮击。,先前决定了某一集合函数。。在创始:

007918C1  |.  DF6C24 04     fild    qword ptr [esp+4]                ;  dwSize
007918C5  |.  56            push    esi
007918C6  |.  57            push    edi
007918C7  |.  8B7C24 18     mov     edi, dword ptr [esp+18]
007918CB  |.  83EC 08       sub     esp, 8
007918CE  |.  D83D 6C298400 fdivr   dword ptr [84296C]
007918D4  |.  8B37          mov     esi, dword ptr [EDI]
007918D6  |.  D805 68298400 fadd    dword ptr [842968]
007918DC  |.  DD1C24        fstp    qword ptr [科特雷耳电集尘器]
007918DF  |.  E8 4930EEFF   call    
007918E4  |.  83C4 08       add     esp, 8
007918E7  |.  E8 302BEEFF   call    <_ftol>
007918EC  |.  69C0 B979379E imul    eax, eax, 9E3779B9
007918F2  |.  85C0          test    eax, eax
007918F4  |.  894424 0C     mov     dword ptr [esp+C], eax
007918F8  |.  0F84 BA000000 je      007919B8

很手感很复杂。,按栈将DWWSIZE除号52,再加6和舍入。,乘以0x9E379B9,看一眼它即使等同0。,即使等同0,与做成圆拱形下本人整数的解密迅速移动。。
整数的解密迅速移动的算法自然啦复杂。,剖析单纯是活计。,这时没精细的的剖析方式。,铅质玻璃我所写的PASCAL解密指定遗传密电码。:
(注:竟,XXTEA是编密电码的。,键入是下面的源指定遗传密电码。

type
   arrIndex = array of DWORD;
   pIndex = ^arrIndex;

//-----------------------------------------------------------
// Original:
//     Pal4.exe_0x7918A0 | arg_1: 把缓冲液加入, arg_2: dwSize, arg_3: pPasswd
// New:
//     arrIndex : 辨向要解密的履历阻塞的指导者
//     dwSize : 解密履历阻塞规模
//     arrPwd : 解密密电码(明确为不变的事物)
//-----------------------------------------------------------
procedure CPK_Decode(dwSize: DWORD; arrIndex: P-提及)
const
   arrPwd : array [0..13] of DWORD =
            ($706D6156, $2E657269, $204A2E43, $53207461,
             $7374666F, $20726174, $68636554, $6F6C6F6E,
             $28207967, $6E616853, $69614867, $6F432029,
             $4C202C2E, $00006474
            );//str: "Vampire.C.J at Softstar Technology (上海) Co., Ltd"
var
   tmpNum_A, tmpNum_B, tmpNum_C, tmpNum_D             : DWORD;
   tmpNum_E                                           : DWORD;
   dwLoop                                             : DWORD;
begin
   tmpNum_A := 议员席(52) / dwSize + 6) * $9E3779B9;
   tmpNum_D := arrIndex^[0];
   while tmpNum_A <> 0 do
   begin
      tmpNum_B := (tmpNum_A shr 2) and 3;
      dwLoop := dwSize - 1;
      while (dwLoop > 0) do
      begin
         tmpNum_C := arrIndex^[dwLoop-1];
         tmpNum_E := (tmpNum_D * 4) xor (tmpNum_C shr 5);
         tmpNum_E := tmpNum_E + ((tmpNum_D shr $3) xor (tmpNum_C shl $4));
         tmpNum_D := arrIndex^[dwLoop] - (tmpNum_E xor ((tmpNum_A xor tmpNum_D) + (arrPwd[(dwLoop and $3) xor tmpNum_B] xor tmpNum_C)));
         arrIndex^[dwLoop] := tmpNum_D;
         dwLoop := dwLoop - 1;
      end;
      tmpNum_D := arrIndex^[0] - ((((tmpNum_D * 4) xor (arrIndex^[dwSize-1] shr $5)) + ((tmpNum_D shr $3) xor (arrIndex^[dwSize-1] shl $4))) xor (((arrPwd[(dwLoop and $3) xor tmpNum_B]) xor arrIndex^[dwSize - 1]) + (tmpNum_A xor tmpNum_D)));
      arrIndex^[0] := tmpNum_D;
      tmpNum_A := tmpNum_A + $61C88647;
   end;
end;

解密后,俯瞰履历。,发展该使成比例解密是提及书信。,这不是音乐履历。,持续剖析。791DAA791EA0的效能是模仿解密提及书信BAC。。模仿提及书信的内存游览断点,F9手感,7915A3破损,不费力地看出这是第本人DWORD整数的自然啦。。
从子顺序返乡后,输出下面的790A80的转让。,这时找到的是CRC32试验。,试验的奏效称为参量堆栈,下本人是参量栈。,照着可以看出仙剑4的CPK提及书信查找是经过查找crc32效验值停止的,自然,提及书信射中靶子第本人DWORD是CRC32认可值。。更多剖析使知晓,CRC32试验值是FI的试验值。。

从子顺序返乡,持续剖析,在791217个片刻转让StFielePosix。,偏移量是提及书信的四个一组之物dWord值。。
如今先前转让了StIfFielPosibe,下一步,它麝香很快读取证件。,最接近的BP ReadFile,F9手感,说明后俯瞰堆栈。,ByTSeLead仅为提及书信的第五和六度音程岁DWORD值。。
这时有两个公正地的值?后续剖析可以发汗现实上CPK外面使成比例证件用LZO紧缩过了,第五dWord现实上是紧缩的显得庞大。,六度音程是紧缩前的规模。。

返乡顺序领空,往下看,发展7909EE再次转让下面提到的解密转让。。F4看过来的参量。,发展DWSIGH是ByTestReAD4。履历窗口尾随,F8最接近的经过呼叫俯瞰。,we的所有格形式可以主教权限解密的履历是we的所有格形式怀有某种意图或目的的音乐履历。。

本文次要议论SMP音乐证件的解密成绩。,照着,不再精细的撰文提及书信。。着陆方才的剖析,解密的设想如今先前很光滑的了。,由于在SMP证件中最好的本人证件。,照着,we的所有格形式只需求解密提及书信并读取第一组i,与读取履历并对其停止解密。。

用SMP证件解密DELPHI7工程源指定遗传密电码:

发表评论

电子邮件地址不会被公开。 必填项已用*标注