【破文标题】**CHM 3.50 注册流程及算法分析(续) 【破文作者】Ptero 【破解工具】FI,OllyDbg,Dede,IDA,MD5工具 【注册方式】序列号+KeyFile 【保护方式】花指令,自校检,进程检测,API断点检测 【加壳方式】UPX v0.94-1.90 【加密算法】MD5+AES-256(Rijndael)+ZLib+RC4 【软件限制】功能限制 【破解声明】初学Crack,只是感兴趣,没有其它目的。失误之处敬请诸位大侠赐教!
----------------------------------------------------
【破解分析】
有关该软件中的AES-256(Rijndael)和ZLib算法的分析,请参见拙作《****CHM 3.50 注册流程及算法分析》。
本文主要分析该软件中采用的作者自定义算法和RC4算法。 因为因为本文算法较少,再加上我也是初涉密码学,所以尽可能写详细一点,自己分析起来方便,大家看着也方便,呵呵。
在继续闯关之前,先简单介绍一下RC4算法:
RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ron Rivest在1987年设计的密钥长度可变的流加密算法簇。之所以称其为簇,是由于其核心部分的S-Box长度可为任意,但一般为256字节。该算法的速度可以达到DES加密的10倍左右。 在开始的7年中该算法享有专利,直到1994年,有人匿名发布了它的源码,此后它就不再是一个商业秘密了。 RC4属于对称算法中的序列密码,按字节逐个对明文加密。
(以下代码均用类C语言描述)
先看S-Box的初始化,共分为2步:
1. 线性填充S-Box(S[i])。代码如下:
for(i=0;i<256;i++) S[i]=i;
2. 根据密钥(K[i])扰乱S-Box。代码如下:
for(i=j=0;i<256;i++) { j=(j+S[i]+K[i])%256; 交换S[i]和S[j]; }
RC4的加密/解密也很简单,也分为2步:
1. 产生随机字节k,代码如下:
i=j=0; while(明文未结束) { i=(i+1)%256; j=(j+s[i])%256; 交换S[i]和S[j]; t=(S[i]+S[j])%256; k=S[t]; }
2. 将字节k与明文异或。
因为是异或运算,所以加密/解密算法相同。
下面言归正传,继续闯关。
++++++++++++++++++++++++++++++++++++++++ 第11关:检测KeyFile黑名单 ++++++++++++++++++++++++++++++++++++++++
话说Ptero闯过10关后,发现程序注册菜单消失,自以为注册成功,正沾沾自喜中,忽又发现被程序作者骗了,制作出的chm还是显示未注册版本。 于是又打开OD、Dede、IDA等等,继续分析,终于找到了隐藏的11关入口:
00503DF3 8D95 58FEFFFF lea edx, [ebp-1A8] 00503DF9 8B45 F0 mov eax, [ebp-10] ; KeyFile文件名 00503DFC E8 0763FCFF call ****CHM.004CA108 ; 计算KeyFile文件的MD5值 00503E01 8B85 58FEFFFF mov eax, [ebp-1A8] ; MD5值 00503E07 8B55 EC mov edx, [ebp-14] 00503E0A E8 25B5FCFF call ****CHM.004CF334 00503E0F 84C0 test al, al 00503E11 0F84 3F010000 je ****CHM.00503F56 ; 这里跳的话的Game Over啦
004CF334这个Call,读取了3个MD5值,与KeyFile的MD5比较。估计是检测流传出去的KeyFile的黑名单吧。如果相等的话,嘿嘿,就删除KeyFile,删除注册信息。 我自己构造了一个KeyFile,肯定不在黑名单里啦。所以直接pass,呵呵。
之后来到这里:
00503FBC 8B85 64FDFFFF mov eax, [ebp-29C] ; 用户名 00503FC2 8B4D F0 mov ecx, [ebp-10] ; KeyFile文件名 00503FC5 5A pop edx 00503FC6 E8 BD65FDFF call ****CHM.004DA588 ; 解密KeyFile,详细算法参见第7、8、9关 00503FCB 8B85 70FDFFFF mov eax, [ebp-290] 00503FD1 50 push eax ; KeyFile解密后的字串 00503FD2 8D85 58FDFFFF lea eax, [ebp-2A8] 00503FD8 8D95 F3FEFFFF lea edx, [ebp-10D] 00503FDE E8 390FF0FF call ****CHM.00404F1C ; System.@LStrFromString(String;String;ShortString;ShortString); 00503FE3 8B85 58FDFFFF mov eax, [ebp-2A8] ; 加密后的注册码 00503FE9 8D95 5CFDFFFF lea edx, [ebp-2A4] 00503FEF E8 2C24F3FF call ****CHM.00436420 ; 解密 00503FF4 8B85 5CFDFFFF mov eax, [ebp-2A4] ; 注册码 00503FFA 50 push eax 00503FFB 8D85 50FDFFFF lea eax, [ebp-2B0] 00504001 8D95 8EFEFFFF lea edx, [ebp-172] 00504007 E8 100FF0FF call ****CHM.00404F1C ; System.@LStrFromString(String;String;ShortString;ShortString); 0050400C 8B85 50FDFFFF mov eax, [ebp-2B0] ; 加密后的用户名 00504012 8D95 54FDFFFF lea edx, [ebp-2AC] 00504018 E8 0324F3FF call ****CHM.00436420 ; 解密 0050401D 8B95 54FDFFFF mov edx, [ebp-2AC] ; 用户名 00504023 59 pop ecx ; 注册码 00504024 58 pop eax ; KeyFile解密后的字串 00504025 E8 1667FDFF call ****CHM.004DA740 ; 12、13关 0050402A 84C0 test al, al 0050402C 74 10 je short ****CHM.0050403E 0050402E EB 06 jmp short ****CHM.00504036
004DA740就是关键Call啦,F7跟进:
++++++++++++++++++++++++++++++++++++++++ 第12关:KeyFile的压缩变换 ++++++++++++++++++++++++++++++++++++++++
取KeyFile的第110位,记为a,并转换成数字:
004DA7E2 8D45 D8 lea eax, [ebp-28] 004DA7E5 50 push eax 004DA7E6 B9 01000000 mov ecx, 1 004DA7EB BA 6E000000 mov edx, 6E 004DA7F0 8B45 FC mov eax, [ebp-4] ; KeyFile解密后的字串 004DA7F3 E8 FCA9F2FF call ****CHM.004051F4 ; System.@LStrCopy; 004DA7F8 8B45 D8 mov eax, [ebp-28] 004DA7FB E8 E0F6F2FF call ****CHM.00409EE0 ; SysUtils.StrToInt(AnsiString):Integer; 004DA800 8BD8 mov ebx, eax 004DA802 EB 04 jmp short ****CHM.004DA808
1 2 3 4 5 下一页 |