• 标 题:敏思硬盘卫士1.0 (网络版客户端)的注册分析(简单级) (7千字)
  • 作 者:6767[BCG]
  • 时 间:2001-8-21 13:38:02
  • 链 接:http://bbs.pediy.com

敏思硬盘卫士1.0 (网络版客户端)的注册分析(简单级)
by Fpc[CCG] & 6767[BCG]        @2001/08

tools: sI, WdaSm
level: 1/5

主要功能:硬盘保护,访问限制,个人空间,文档中心,病毒防范,远程管理
作者主页:http://www.globalmediastar.com/



  有人要这个,所以追一下了。因为是一机一号,没办法,只有作出注册机或破解版,好在这个简单,能作注册机。

:004A6866 8B45F4                  mov eax, dword ptr [ebp-0C]                <- 硬件号
:004A6869 8D4DF8                  lea ecx, dword ptr [ebp-08]                <- 注册码存放位置
:004A686C 66BA1300                mov dx, 0013                <- 参与运算
:004A6870 E8A3F8FFFF              call 004A6118                <- 生成注册码

:004A6875 8B55F8                  mov edx, dword ptr [ebp-08]        <- 真码
:004A6878 58                      pop eax                <- 假码
:004A6879 E836D7F5FF              call 00403FB4                <- 比较了
:004A687E 7423                    je 004A68A3

:004A6880 6A30                    push 00000030

* Possible StringData Ref from Code Obj ->" 敏思硬盘卫士"
                                  |
:004A6882 6814694A00              push 004A6914

* Possible StringData Ref from Code Obj ->"输入的注册码无效,请重新输入。"
                                  |
:004A6887 6824694A00              push 004A6924
:004A688C 6A00                    push 00000000

* Reference To: user32.MessageBoxA, Ord:0000h
                                  |
:004A688E E85509F6FF              Call 004071E8



  显然在:004A6870 call 004A6118是关键追进去看它是怎么算的:

* Referenced by a CALL at Addresses:
|:004A66B4  , :004A6870  , :004CF984  , :004CFFA4  , :004D04B4 
|:004D07C0  , :004D0B98  , :004D0DBC  , :004D108F  , :004D17C0 
|:004D2728 
|
:004A6118 55                      push ebp
:004A6119 8BEC                    mov ebp, esp

... ...

:004A6125 8BDA                    mov ebx, edx                <- ebx=0x13
:004A6127 8945FC                  mov dword ptr [ebp-04], eax

... ...

:004A6140 8D55F4                  lea edx, dword ptr [ebp-0C]        <- 存放的位置
:004A6143 8B45FC                  mov eax, dword ptr [ebp-04]        <- 硬件号
:004A6146 E88524F6FF              call 004085D0                <- 硬件号中的字母小写转大写,请看

>>>>>>

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00408604(C)
|
    :004085F1 8A02                    mov al, byte ptr [edx]
    :004085F3 3C61                    cmp al, 61
    :004085F5 7206                    jb 004085FD
    :004085F7 3C7A                    cmp al, 7A
    :004085F9 7702                    ja 004085FD
    :004085FB 2C20                    sub al, 20                      <- 这一句

    * Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
    |:004085F5(C), :004085F9(C)
    |
    :004085FD 8806                    mov byte ptr [esi], al
    :004085FF 42                      inc edx
    :00408600 46                      inc esi
    :00408601 4B                      dec ebx
    :00408602 85DB                    test ebx, ebx
    :00408604 75EB                    jne 004085F1

<<<<<<


:004A614B 8B45F4                  mov eax, dword ptr [ebp-0C]                <- 硬件号(已转换为大写)
:004A614E 8D4DF8                  lea ecx, dword ptr [ebp-08]
:004A6151 0FB7D3                  movzx edx, bx

:004A6154 E8037AFEFF              call 0048DB5C                <- 这个的作用是将硬件号的各位置加上一个数
                                    <- 规则是:奇数位置加0x14,偶数位置加0x13

>>>>>>

    * Referenced by a CALL at Addresses:
    |:0048E5BF  , :004A6154  , :004C40F3  , :004C410D  , :004C4127 
    |
    :0048DB5C 55                      push ebp
    :0048DB5D 8BEC                    mov ebp, esp
    :0048DB5F 83C4EC                  add esp, FFFFFFEC
    :0048DB62 53                      push ebx
    :0048DB63 56                      push esi
    :0048DB64 57                      push edi
    :0048DB65 33DB                    xor ebx, ebx
    :0048DB67 895DEC                  mov dword ptr [ebp-14], ebx
    :0048DB6A 894DF4                  mov dword ptr [ebp-0C], ecx
    :0048DB6D 8955F8                  mov dword ptr [ebp-08], edx    <- [ebp-8]=0x13
    :0048DB70 8945FC                  mov dword ptr [ebp-04], eax

    ... ...
    
    :0048DB91 8B45F8                  mov eax, dword ptr [ebp-08]
    :0048DB94 40                      inc eax
    :0048DB95 8945F0                  mov dword ptr [ebp-10], eax    <- [ebp-10]=0x14

    ... ...

    :0048DBA6 BE01000000              mov esi, 00000001

    * Referenced by a (U)nconditional or (C)onditional Jump at Address:
    |:0048DBDB(C)
    |
    :0048DBAB 8B45FC                  mov eax, dword ptr [ebp-04]
    :0048DBAE 33DB                    xor ebx, ebx
    :0048DBB0 8A5C30FF                mov bl, byte ptr [eax+esi-01]
    :0048DBB4 F7C601000000            test esi, 00000001                <- 相当于对2取模
    :0048DBBA 7505                    jne 0048DBC1            <- 在奇数位置上则向下跳
    
    :0048DBBC 035DF8                  add ebx, dword ptr [ebp-08]    <- bl+=0x13
    :0048DBBF EB03                    jmp 0048DBC4

    * Referenced by a (U)nconditional or (C)onditional Jump at Address:
    |:0048DBBA(C)
    |
    :0048DBC1 035DF0                  add ebx, dword ptr [ebp-10]    <- bl+=0x14

    * Referenced by a (U)nconditional or (C)onditional Jump at Address:
    |:0048DBBF(U)
    |
    :0048DBC4 8D45EC                  lea eax, dword ptr [ebp-14]
    :0048DBC7 8BD3                    mov edx, ebx
    :0048DBC9 E8FE61F7FF              call 00403DCC            <- 这两个Call只是在内存中拷贝
    :0048DBCE 8B55EC                  mov edx, dword ptr [ebp-14]
    :0048DBD1 8B45F4                  mov eax, dword ptr [ebp-0C]
    :0048DBD4 E8E3A9F7FF              call 004085BC
    :0048DBD9 46                      inc esi
    :0048DBDA 4F                      dec edi
    :0048DBDB 75CE                    jne 0048DBAB            <- 未完成则处理下一字符

    ... ...

    :0048DC08 C3                      ret

<<<<<<


:004A6159 8BD6                    mov edx, esi
:004A615B 8B45F8                  mov eax, dword ptr [ebp-08]
:004A615E E889010000              call 004A62EC                <- 这个是对字符串的运算,求出一个和,再打印成无符号数,就是注册码

>>>>>>

    :004A6317 BB611E0000              mov ebx, 00001E61            <- 初始化:ebx=7777

    ... ...

    :004A632A B801000000              mov eax, 00000001            <- i=1

    * Referenced by a (U)nconditional or (C)onditional Jump at Address:
    |:004A6340(C)
    |
    :004A632F 8B4DFC                  mov ecx, dword ptr [ebp-04]
    :004A6332 0FB64C01FF              movzx ecx, byte ptr [ecx+eax-01]    <- ecx=Code[i]
    :004A6337 03C8                    add ecx, eax                <- ecx+=i (这里i从一开始)
    :004A6339 0FAFCB                  imul ecx, ebx                <- ecx*=ebx
    :004A633C 8BD9                    mov ebx, ecx                <- ebx=ecx
    :004A633E 40                      inc eax                        <- i++
    :004A633F 4A                      dec edx
    :004A6340 75ED                    jne 004A632F                <- 未处理完则继续

    * Referenced by a (U)nconditional or (C)onditional Jump at Address:
    |:004A6328(C)
    |
    :004A6342 8B45F8                  mov eax, dword ptr [ebp-08]        <- 打印的目标地址
    :004A6345 50                      push eax
    :004A6346 895DF0                  mov dword ptr [ebp-10], ebx        <- 保存结果
    :004A6349 C645F400                mov [ebp-0C], 00
    :004A634D 8D55F0                  lea edx, dword ptr [ebp-10]
    :004A6350 33C9                    xor ecx, ecx

    * Possible StringData Ref from Code Obj ->"%.10u"            <- 很明确
                                  |
    :004A6352 B888634A00              mov eax, 004A6388
    :004A6357 E85036F6FF              call 004099AC            <- 打印字符串

<<<<<<

... ...

:004A6189 5D                      pop ebp
:004A618A C3                      ret                    <- 注册码生成完毕,则返回

  注册信息在:
REGEDIT4

[HKEY_CURRENT_USER\Software\MediaStar\HddGuard]
"RegCode"="Your SN is here"

  结束。