• 标 题:CPUCOOL 5.1000注册码分析 (6千字)
  • 作 者:夜月
  • 时 间:2001-1-19 10:50:42
  • 链 接:http://bbs.pediy.com

文章名称:CPUCOOL 5.1000注册码分析
作者:夜月
e_mail:luoyi.ly@yeah.net
oicq:36606500
目的:帮助和我一样的初学者们。
软件名称:CPUCOOL
软件简介:一个CPU降温软件,也可以定时优化内存。具体的效果怎么样,我也不太清楚。(呵呵...没用温度计
     量过...)。
保护分析:这个软件在你输入注册码的时候会进行一次判断。如果你就只找到这一处判断的话,还不能注册成功。
     另一个检测点说实在的,我也找了好久,主要原因有兴趣的朋友用W32dasm分析一下就知道了----
     虽然所有的对话框中的字符串,都能够在反汇编后找到,可是,它们的附近一个有用的跳转都没有,
     后来,找了好久用了bpm,全局flag,注册表监视,反正能想的招我都想了,才找到了第二个检测点。
     还是有点运气的成分在里面的。它判断注册码的算法在反汇编后唯一的特点就是一个“%d”,两处检测
     点的字符串参考(w32dasm内)都有这个“%d”。两个检测点找到了以后分析就是很简单的事了,不过
     这个软件的算法,需要一点浮点指令的知识。我以前没看过浮点指令的介绍,哪位大虾能e_mail给小弟
     一份的话,小弟感激不尽!不过,这里的两个浮点指令都比较简单,我看着它们的形式也就猜出意思了
     所以,如果你现在也不懂浮点指令的话,没关系的,猜吧!好了,废话少说,下面我们切入正题:
                            教程正文
    输入注册码,用trw2000的万能中断hmemcpy+pmodule一会儿还找不出关键的跳转,我是用bpm的方法找
    到了下面的这一处:
* Possible StringData Ref from Data Obj ->"%d"
                                  |
:00414039 687C854600              push 0046857C
:0041403E 50                      push eax
:0041403F E80C2C0200              call 00436C50
:00414044 8B4C2414                mov ecx, dword ptr [esp+14]
:00414048 BF83000000              mov edi, 00000083
:0041404D 8BC1                    mov eax, ecx  <------eax中保存了你输入的注册码(16进制)
:0041404F 83C40C                  add esp, 0000000C
:00414052 99                      cdq
:00414053 F7FF                    idiv edi
:00414055 85D2                    test edx, edx
:00414057 0F85C2000000            jne 0041411F  <-----注册码要是83H的整数倍

:0041405D B83DCB883E              mov eax, 3E88CB3D
:00414062 F7E9                    imul ecx
:00414064 C1FA05                  sar edx, 05
:00414067 8BC2                    mov eax, edx
:00414069 C1E81F                  shr eax, 1F
:0041406C 03D0                    add edx, eax
:0041406E 3BD7                    cmp edx, edi
:00414070 0F8EA9000000            jle 0041411F  <-----这一段是变相对注册码的大小进行判断

:00414076 81F980470100            cmp ecx, 00014780  <------14780H是一个不能使用的号码!
:0041407C 7467                    je 004140E5

:0041407E 8BC1                    mov eax, ecx
:00414080 B97F000000              mov ecx, 0000007F
:00414085 99                      cdq
:00414086 F7F9                    idiv ecx  <------注册码不能是7FH的整数倍
:00414088 85D2                    test edx, edx
:0041408A 7459                    je 004140E5
:0041408C 8D542468                lea edx, dword ptr [esp+68]
:00414090 B9DC8D4700              mov ecx, 00478DDC
:00414095 52                      push edx
     这里就是我说的第一处判断了。详细的分析,我已经写在旁边,相信有一点汇编基础的朋友就能够很轻
     松的看懂了。不过在那个变相判断注册码大小的地方,我还编了一个小程序算出来注册码必须大于
     252*131=33012。有兴趣的朋友可以验证一下。
     经过了这个“卡子”我们可以得出注册码必须要是131大于251的整数倍,而且,还不能被7FH整除,当
     然,还得排除一个作者已知的CRACK号码。下面,我们来到第二个检测点:
* Possible StringData Ref from Data Obj ->" %d"
                                  |
:00421FA0 6864974600              push 00469764
:00421FA5 50                      push eax
:00421FA6 E8A54C0100              call 00436C50
:00421FAB 8B442424                mov eax, dword ptr [esp+24]
:00421FAF 83C40C                  add esp, 0000000C
:00421FB2 99                      cdq
:00421FB3 F73DA88D4700            idiv dword ptr [00478DA8]      [478DA8]=1A19H=6681
:00421FB9 8BE8                    mov ebp, eax
:00421FBB 99                      cdq
:00421FBC 33C2                    xor eax, edx
:00421FBE 896C2418                mov dword ptr [esp+18], ebp
:00421FC2 2BC2                    sub eax, edx
:00421FC4 83E001                  and eax, 00000001
:00421FC7 33C2                    xor eax, edx
:00421FC9 2BC2                    sub eax, edx
:00421FCB 742D                    je 00421FFA      上面一连串的位运算就是看是否是6681的奇数倍 
:00421FCD DB442418                fild dword ptr [esp+18]  <----我猜应该是操作数被LOAD
:00421FD1 32DB                    xor bl, bl
:00421FD3 D9FA                    fsqrt          <----我猜应该是开方的意思
:00421FD5 E8464B0100              call 00436B20
:00421FDA 8BF0                    mov esi, eax
:00421FDC B903000000              mov ecx, 00000003
:00421FE1 46                      inc esi
:00421FE2 3BF1                    cmp esi, ecx
:00421FE4 7E14                    jle 00421FFA
:00421FE6 8BC5                    mov eax, ebp
:00421FE8 99                      cdq
:00421FE9 F7F9                    idiv ecx
:00421FEB 85D2                    test edx, edx
:00421FED 7409                    je 00421FF8 
:00421FEF 83C102                  add ecx, 00000002
:00421FF2 3BCE                    cmp ecx, esi
:00421FF4 7CF0                    jl 00421FE6
:00421FF6 EB02                    jmp 00421FFA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00421FED(C)
|
:00421FF8 B301                    mov bl, 01

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00421FCB(C), :00421FE4(C), :00421FF6(U)
|
:00421FFA 84DB                    test bl, bl
:00421FFC 7512                    jne 00422010
:00421FFE 6A20                    push 00000020
:00422000 8D4C2418                lea ecx, dword ptr [esp+18]
:00422004 E8B0D80200              call 0044F8B9
:00422009 68DC8D4700              push 00478DDC
:0042200E EB1E                    jmp 0042202E
    上面这段代码很简单吧?呵呵...我的注释也就加的不多了。下面我就把注册码应该满足的条件列出来:
        假设输入的数字为N。则其必须满足:(用C语言的运算符表示)
    1.(N%131)=0,(N/131)>251;
    2. (N%6681)=0.
    3. 设N/6681=M.则M必须为奇数。
    4. 设INT(SQRT(M))=K,则:K>2且从3到K+1所有的奇数都不能被M整除。
    这就是我总结出来的CPUCOOL的注册码应该满足的规律,如有疏漏,尽请执教!