• 标 题:非明码软件的入门教学--现给算法的入门者(高手末入) (6千字)
  • 作 者:PowerBoy
  • 时 间:2002-7-24 21:37:19
  • 链 接:http://bbs.pediy.com

非明码软件的入门教学
破解软件:CalcVoice计算器
破解人:PowerBoy

下载地址:电力系统网,“软件下载乐园”
软件介绍:该软件是一个语音计算器,可以进行二进制、十进制、八进制、十六进制的转换和三角函数的
计算,注册保护为软件自生成一个序列号,然后根据序列号算出注册码。(每台机器序列号都不相同)
并且有30次限制所以有2种选择:一种是暴力破解,另外一种是分析出算法写成注册机。
*************************************************************************************************************************
1.爆破
首先用language侦测发现是用aspack加的壳。选择用CASPR脱壳(效果好)。
运行软件弹出要求注册的对话框随便输入注册码弹出:

"对不起!您的注册码不正确,请与作者联系! "

接下来用w32dsam反汇编查找“串式参考”
发现此句,用左键双击来到程序中。
向上查找发现是由00476AE0(C)跳转来得(用右键双击)
查看程序发现如果00476AE0不跳转就可以来到:

"恭喜您,注册成功!谢谢您支持本软件,请保存好序列?

因此将3BC2757OB201改为
      ××7470××  je
      ××9090××  nop  成功!!!!!!!!!!!!!!!
*************************************************************************************************************************
2.算法分析
因为该软件是非明码比较,这就要求破解者要有一定的算法破解基础了。废话不说了开始!

下断点:BPX HMEMCPY 按F12共N次来到下面...........
这时就要用F10了,并且要求要成用D和?命令查看个寄存器的数值,(要有宁可错杀一千不放过一个的态度才行啊!)

:00476AA3 55                      push ebp
:00476AA4 687D6B4700              push 00476B7D
:00476AA9 64FF30                  push dword ptr fs:[eax]
:00476AAC 648920                  mov dword ptr fs:[eax], esp
:00476AAF 8D55FC                  lea edx, dword ptr [ebp-04]
:00476AB2 8B8634040000            mov eax, dword ptr [esi+00000434]
:00476AB8 E87FFFFBFF              call 00436A3C
:00476ABD 8B45FC                  mov eax, dword ptr [ebp-04]
:00476AC0 83CAFF                  or edx, FFFFFFFF
:00476AC3 E8C41CF9FF              call 0040878C-------------------->经过此CALL后,我们输入的SN变成十六进制,并保存倒EAX中;
:00476AC8 35630AB302              xor eax, 02B30A63---------------->EAX=EAX XOR 0x2B30A63
:00476ACD 35C5AC3703              xor eax, 0337ACC5---------------->EAX=EAX XOR 0x337ACC5
:00476AD2 8B15489D4700            mov edx, dword ptr [00479D48]---->EDX=0x13215B=1253723
:00476AD8 81F2630AB302            xor edx, 02B30A63---------------->EDX=EDX XOR 0x2B30A63//这时EDX的值就是机器码MN;
:00476ADE 3BC2                    cmp eax, edx--------------------->比较EAX和EDX
:00476AE0 7570                    jne 00476B52*********************关键跳转,不相等则跳,跳则死
:00476AE2 B201                    mov dl, 01
:00476AE4 A174CC4600              mov eax, dword ptr [0046CC74]
:00476AE9 E88662FFFF              call 0046CD74
:00476AEE 8BD8                    mov ebx, eax
:00476AF0 BA02000080              mov edx, 80000002
:00476AF5 8BC3                    mov eax, ebx
:00476AF7 E81863FFFF              call 0046CE14
:00476AFC 33C9                    xor ecx, ecx

* Possible StringData Ref from Code Obj ->"\Software\Microsoft\Active Setup\Installed "
                                        ->"Components"
                                  |
:00476AFE BA946B4700              mov edx, 00476B94
:00476B03 8BC3                    mov eax, ebx
:00476B05 E86E63FFFF              call 0046CE78

* Possible StringData Ref from Code Obj ->"1.0"
                                  |
:00476B0A B9D46B4700              mov ecx, 00476BD4

* Possible StringData Ref from Code Obj ->"Version"
                                  |
:00476B0F BAE06B4700              mov edx, 00476BE0
:00476B14 8BC3                    mov eax, ebx
:00476B16 E8F964FFFF              call 0046D014
:00476B1B 8BC3                    mov eax, ebx
:00476B1D E836CAF8FF              call 00403558
:00476B22 6A00                    push 00000000
:00476B24 668B0DE86B4700          mov cx, word ptr [00476BE8]
:00476B2B B202                    mov dl, 02

* Possible StringData Ref from Code Obj ->"恭喜您,注册成功!谢谢您支持本软件,请保存好序列?
                                        ->"庞胱⒉崧?便于作者为您提供服务! "
                                        ->"  联系邮箱:JRYCL@163.COM"
                                  |
:00476B2D B8F46B4700              mov eax, 00476BF4
:00476B32 E85999FBFF              call 00430490
:00476B37 33D2                    xor edx, edx
:00476B39 8B8618040000            mov eax, dword ptr [esi+00000418]
:00476B3F E818FEFBFF              call 0043695C
:00476B44 A18C9C4700              mov eax, dword ptr [00479C8C]
:00476B49 C6802D02000001          mov byte ptr [eax+0000022D], 01
:00476B50 EB15                    jmp 00476B67

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00476AE0(C)
|
:00476B52 6A00                    push 00000000
:00476B54 668B0DE86B4700          mov cx, word ptr [00476BE8]
:00476B5B B201                    mov dl, 01

* Possible StringData Ref from Code Obj ->"对不起!您的注册码不正确,请与作者联系! "
                                        ->"联系邮箱:JRYCL@163.COM"
                                  |
:00476B5D B8646C4700              mov eax, 00476C64
:00476B62 E82999FBFF              call 00430490

*******************************************************************************************************************
算法整理:
这是典型的非明码比较的注册码形式;
1.:00476ADE处比较EAX和EDX.如果相等就注册成功,不相等则注册失败;
  我们来看:EAX中保存着我们输入的假SN变成十六进制形式在经过与常数XOR计算所得的数值,而EDX中保存着MN的十六进制形式;
  如果想注册成功就要使EAX等于EDX;

2.好既然这样我们就令:EAX=EDX;然后,逆推;
(这里我们要知道一些必要的知识即:A XOR B = C 等价于 A XOR C = B 或 B XOR C = A);
如果知道这些就简单了啊!
用MN先与常数0x2B30A63异或,在与常数0x337ACC5异或;
最后,将所得的数变成十进制就是正确的注册码了啊!
例如:
MN=44051256
44051256=0x2A02B38
0x2A02B38 XOR 0x2B30A63 = 0x13215B
0x13215B XOR 0x337ACC5 = 0x3248D9E
0x3248D9E=52727198
SN=52727198
输入52727198显示成功!!!!!!!!
*********************************************************************************************************************
另外这个软件有个缺陷
如果在[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components]
建立主键"Version"="1.0"
那么就不用注册就可以成功了啊!
*********************************************************************************************************************