• 标 题:大名鼎鼎II v2.02 Build808
  • 作 者:BurSH
  • 时 间:2003年8月30日 03:03
  • 链 接:http://bbs.pediy.com

[软件名称]:大名鼎鼎II v2.02 Build808
[软件介绍]     
    大名鼎鼎名片管理系统是专为中国人量身定做一款个人信息管理类软件,其
功能及易用性堪称目前市面上同类软件之首。大名鼎鼎独特的姓氏拼音、自定义
无限级分类功能,可以轻而易举的实现名片的闪电查找。考虑到商务人士的需求,
大名鼎鼎还专门为商业用户设计了信封打印、邮件群发功能,并且,其名片打印
功能已经授权北京汉王科技公司"名片通6.0"系统使用。大名鼎鼎还为广大用户设
计了多重个性化设置功能:头像显示功能可以兼容QQ头像图片;照片显示模式和
虚拟名片可以更加形象的显示名片信息;大字体功能更加方便老年朋友使用。
[软件下载]http://www.Snksoft.com

[破解人]    BurSH (于2003.8.30)
[所属组织]  FCG-BCG-CCG-DFCG-YCG
[破解工具]  OllDbg 1.09c,W32Dasm 10,PE-Scan 3.0

/////////////////////////////
//     软件的注册算法      //
/////////////////////////////
软件用ASPACK加壳,PE-Scan 3.0脱去,用OllDbg跟踪来到这里...........
0054D464  /.  55            PUSH EBP
0054D465  |.  8BEC          MOV EBP,ESP
0054D467  |.  33C9          XOR ECX,ECX
0054D469  |.  51            PUSH ECX
0054D46A  |.  51            PUSH ECX
0054D46B  |.  51            PUSH ECX
0054D46C  |.  51            PUSH ECX
0054D46D  |.  51            PUSH ECX
0054D46E  |.  53            PUSH EBX
0054D46F  |.  8BD8          MOV EBX,EAX
0054D471  |.  33C0          XOR EAX,EAX
0054D473  |.  55            PUSH EBP
0054D474  |.  68 79D55400   PUSH UN_THINK.0054D579
0054D479  |.  64:FF30       PUSH DWORD PTR FS:[EAX]
0054D47C  |.  64:8920       MOV DWORD PTR FS:[EAX],ESP
0054D47F  |.  8D55 FC       LEA EDX,DWORD PTR SS:[EBP-4]
0054D482  |.  8B83 20030000 MOV EAX,DWORD PTR DS:[EBX+320]
0054D488  |.  E8 D3F4F3FF   CALL UN_THINK.0048C960                   ;  读取软件序列号
0054D48D  |.  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]
0054D490  |.  B8 90D55400   MOV EAX,UN_THINK.0054D590                ;  ASCII "Softkey"
0054D495  |.  E8 DA6E0500   CALL UN_THINK.005A4374
0054D49A  |.  8D55 F8       LEA EDX,DWORD PTR SS:[EBP-8]
0054D49D  |.  8B83 1C030000 MOV EAX,DWORD PTR DS:[EBX+31C]
0054D4A3  |.  E8 B8F4F3FF   CALL UN_THINK.0048C960                   ;  读取软件注册码
0054D4A8  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
0054D4AB  |.  B8 A0D55400   MOV EAX,UN_THINK.0054D5A0                ;  ASCII "Regkey"
0054D4B0  |.  E8 BF6E0500   CALL UN_THINK.005A4374
0054D4B5  |.  E8 0E690500   CALL UN_THINK.005A3DC8                   ;  算法Call!F7跟入!!!
0054D4BA  |.  8BD0          MOV EDX,EAX
0054D4BC  |.  80F2 01       XOR DL,1
0054D4BF  |.  A1 68766100   MOV EAX,DWORD PTR DS:[617668]
0054D4C4  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]
0054D4C6  |.  8B80 F4030000 MOV EAX,DWORD PTR DS:[EAX+3F4]
0054D4CC  |.  E8 5F20F5FF   CALL UN_THINK.0049F530
0054D4D1  |.  E8 F2680500   CALL UN_THINK.005A3DC8                   ;  同样的算法Call,算两次?
0054D4D6  |.  84C0          TEST AL,AL
0054D4D8  |.  74 42         JE SHORT UN_THINK.0054D51C               ;  注册码正确就不跳
0054D4DA  |.  8D55 F0       LEA EDX,DWORD PTR SS:[EBP-10]
0054D4DD  |.  A1 387A6100   MOV EAX,DWORD PTR DS:[617A38]
0054D4E2  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]
0054D4E4  |.  E8 5B14F6FF   CALL UN_THINK.004AE944
0054D4E9  |.  FF75 F0       PUSH DWORD PTR SS:[EBP-10]
0054D4EC  |.  68 B0D55400   PUSH UN_THINK.0054D5B0                   
0054D4F1  |.  A1 5C7E6100   MOV EAX,DWORD PTR DS:[617E5C]
0054D4F6  |.  FF70 10       PUSH DWORD PTR DS:[EAX+10]

根进CALL UN_THINK.005A3DC8后,我们来到:
005A3DD8  |.  33C0          XOR EAX,EAX
005A3DDA  |.  55            PUSH EBP
005A3DDB  |.  68 0C3F5A00   PUSH UN_THINK.005A3F0C
005A3DE0  |.  64:FF30       PUSH DWORD PTR FS:[EAX]
005A3DE3  |.  64:8920       MOV DWORD PTR FS:[EAX],ESP
005A3DE6  |.  8D4D FC       LEA ECX,DWORD PTR SS:[EBP-4]
005A3DE9  |.  33D2          XOR EDX,EDX
005A3DEB  |.  B8 243F5A00   MOV EAX,UN_THINK.005A3F24                ;  ASCII "Coname"
005A3DF0  |.  E8 EB040000   CALL UN_THINK.005A42E0                   ;  读取单位名
005A3DF5  |.  8D45 FC       LEA EAX,DWORD PTR SS:[EBP-4]             ;  地址放入EAX
005A3DF8  |.  50            PUSH EAX
005A3DF9  |.  8D4D F8       LEA ECX,DWORD PTR SS:[EBP-8]
005A3DFC  |.  33D2          XOR EDX,EDX
005A3DFE  |.  B8 343F5A00   MOV EAX,UN_THINK.005A3F34                ;  ASCII "Username"
005A3E03  |.  E8 D8040000   CALL UN_THINK.005A42E0                   ;  读取用户姓名
005A3E08  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
005A3E0B  |.  58            POP EAX
005A3E0C  |.  E8 E312E6FF   CALL UN_THINK.004050F4                   ;  将单位名和用户名姓名连起来作为用户信息!
005A3E11  |.  837D FC 00    CMP DWORD PTR SS:[EBP-4],0               ;  用户名信息是否为空?
005A3E15  |.  75 07         JNZ SHORT UN_THINK.005A3E1E
005A3E17  |.  33DB          XOR EBX,EBX                              ;  注意,EBX=0是注册失败的标志!
005A3E19  |.  E9 A9000000   JMP UN_THINK.005A3EC7
005A3E1E  |>  8D4D EC       LEA ECX,DWORD PTR SS:[EBP-14]
005A3E21  |.  33D2          XOR EDX,EDX
005A3E23  |.  B8 243F5A00   MOV EAX,UN_THINK.005A3F24                ;  ASCII "Coname"
005A3E28  |.  E8 B3040000   CALL UN_THINK.005A42E0                   ;  再次读取单位名
005A3E2D  |.  8D45 EC       LEA EAX,DWORD PTR SS:[EBP-14]
005A3E30  |.  50            PUSH EAX
005A3E31  |.  8D4D E8       LEA ECX,DWORD PTR SS:[EBP-18]
005A3E34  |.  33D2          XOR EDX,EDX
005A3E36  |.  B8 343F5A00   MOV EAX,UN_THINK.005A3F34                ;  ASCII "Username"
005A3E3B  |.  E8 A0040000   CALL UN_THINK.005A42E0                   ;  读取用户姓名
005A3E40  |.  8B55 E8       MOV EDX,DWORD PTR SS:[EBP-18]
005A3E43  |.  58            POP EAX                                  ;  EAX=用户名
005A3E44  |.  E8 AB12E6FF   CALL UN_THINK.004050F4                   ;  将单位名和用户名姓名连起来作为用户信息!
005A3E49  |.  8B55 EC       MOV EDX,DWORD PTR SS:[EBP-14]
005A3E4C  |.  8D45 F0       LEA EAX,DWORD PTR SS:[EBP-10]
005A3E4F  |.  E8 A018E6FF   CALL UN_THINK.004056F4
005A3E54  |.  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]            ;  EAX=用户信息
005A3E57  |.  E8 68FEFFFF   CALL UN_THINK.005A3CC4                   ;  关键Call,通过用户信息计算出用户代码,F7跟入!
>>>>>>>>>>>>>>>>>>>>>>>
    005A3CC4  /$  55            PUSH EBP                             ;  F7进入后,我们来到这里
    005A3CC5  |.  8BEC          MOV EBP,ESP
    005A3CC7  |.  83C4 EC       ADD ESP,-14
    005A3CCA  |.  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX
    005A3CCD  |.  8D45 FC       LEA EAX,DWORD PTR SS:[EBP-4]
    005A3CD0  |.  E8 4B1DE6FF   CALL UN_THINK.00405A20
    005A3CD5  |.  33C0          XOR EAX,EAX
    005A3CD7  |.  55            PUSH EBP
    005A3CD8  |.  68 4F3D5A00   PUSH UN_THINK.    005A3D4F
    005A3CDD  |.  64:FF30       PUSH DWORD PTR FS:[EAX]
    005A3CE0  |.  64:8920       MOV DWORD PTR FS:[EAX],ESP
    005A3CE3  |.  C745 F0 00000>MOV DWORD PTR SS:[EBP-10],40000000
    005A3CEA  |.  C745 F4 311A7>MOV DWORD PTR SS:[EBP-C],41731A31
    005A3CF1  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
    005A3CF4  |.  33D2          XOR EDX,EDX
    005A3CF6  |.  E8 311BE6FF   CALL UN_THINK.0040582C
    005A3CFB  |.  74 34         JE SHORT UN_THINK.    005A3D31
    005A3CFD  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
    005A3D00  |.  E8 0F1AE6FF   CALL UN_THINK.00405714
    005A3D05  |.  85C0          TEST EAX,EAX                          ;  输入的参数是否为空?
    005A3D07  |.  7E 30         JLE SHORT UN_THINK.    005A3D39
    005A3D09  |.  BA 01000000   MOV EDX,1
    005A3D0E  |>  8B4D FC       /MOV ECX,DWORD PTR SS:[EBP-4]
    005A3D11  |.  66:8B4C51 FE  |MOV CX,WORD PTR DS:[ECX+EDX*2-2]     ;  取出一位用户名的unicode值,写KG的时候要注意它是先读取低位在读取高位!
    005A3D16  |.  66:81F1 2802  |XOR CX,228                           ;  异或228H
    005A3D1B  |.  0FB7C9        |MOVZX ECX,CX
    005A3D1E  |.  894D EC       |MOV DWORD PTR SS:[EBP-14],ECX
    005A3D21  |.  DB45 EC       |FILD DWORD PTR SS:[EBP-14]           ;  结果的十进制转换成浮点数放入ST(0)
    005A3D24  |.  DC45 F0       |FADD QWORD PTR SS:[EBP-10]           ;  与EBP-10相加(EBP-10的初始值是20030228)
    005A3D27  |.  DD5D F0       |FSTP QWORD PTR SS:[EBP-10]
    005A3D2A  |.  9B            |WAIT
    005A3D2B  |.  42            |INC EDX
    005A3D2C  |.  48            |DEC EAX
    005A3D2D  |.^ 75 DF         JNZ SHORT UN_THINK.    005A3D0E
    005A3D2F  |.  EB 08         JMP SHORT UN_THINK.    005A3D39
    005A3D31  |>  33C0          XOR EAX,EAX
    005A3D33  |.  8945 F0       MOV DWORD PTR SS:[EBP-10],EAX
    005A3D36  |.  8945 F4       MOV DWORD PTR SS:[EBP-C],EAX
    005A3D39  |>  33C0          XOR EAX,EAX
    005A3D3B  |.  5A            POP EDX
    005A3D3C  |.  59            POP ECX
    005A3D3D  |.  59            POP ECX
    005A3D3E  |.  64:8910       MOV DWORD PTR FS:[EAX],EDX
    005A3D41  |.  68 563D5A00   PUSH UN_THINK.    005A3D56
    005A3D46  |>  8D45 FC       LEA EAX,DWORD PTR SS:[EBP-4]
    005A3D49  |.  E8 1218E6FF   CALL UN_THINK.00405560
    005A3D4E  .  C3            RETN
    005A3D4F   .^ E9 6809E6FF   JMP UN_THINK.004046BC
    005A3D54   .^ EB F0         JMP SHORT UN_THINK.    005A3D46
    005A3D56   .  DD45 F0       FLD QWORD PTR SS:[EBP-10]             ;  ESP-10中的浮点数装入到st(0),结果为用户名代码,就是这个Call的返回值.
    005A3D59   .  8BE5          MOV ESP,EBP
    005A3D5B   .  5D            POP EBP
    005A3D5C   .  C3            RETN
             
 ▲小结:这个Call的算法可以用下面这段VB代码表示:
 Function GetSN_temp(InputData As String) As Double
 On Error GoTo errrr:
 Dim Data() As Long
 Dim Data_len As Long, i As Long
 Dim temp As String, char As String
 Data_len = Len(InputData)
 ReDim Data(Data_len) As Long
 For i = 1 To Data_len
 char = Mid(InputData, i, 1)
 Data(i) = Asc(StrConv(char, vbUnicode))'这行代码是错误的,正确应该是读取unicode码,俺也不知如何作,请各位高手帮忙:(
 If Data(i) < 0 Then
 temp = Trim(Hex(Data(i)))
 temp = Mid(temp, 7, 2) & Mid(temp, 5, 2) '先读取低位在读取高位
 Data(i) = Val("&H" & temp)
 If Data(i) < 0 Then
 Data(i) = 65536 + Val("&H" & temp)
 End If
 End If
 Next i
 GetSN_temp = 20030228
 For i = 1 To Data_len
 GetSN_temp = GetSN_temp + (Data(i) Xor 552)
 Next i
 errrr:
 End Function            
             
                                                                <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<             
    
    
                                                  
005A3E5C  |.  D80D 403F5A00 FMUL DWORD PTR DS:[5A3F40]               ;  ST(0)=用户代码*10
005A3E62  |.  DB7D DC       FSTP TBYTE PTR SS:[EBP-24]               ;  弹出到ESP-24
005A3E65  |.  9B            WAIT
005A3E66  |.  8D4D D4       LEA ECX,DWORD PTR SS:[EBP-2C]
005A3E69  |.  33D2          XOR EDX,EDX
005A3E6B  |.  B8 4C3F5A00   MOV EAX,UN_THINK.005A3F4C                ;  ASCII "Softkey"
005A3E70  |.  E8 6B040000   CALL UN_THINK.005A42E0
005A3E75  |.  8B55 D4       MOV EDX,DWORD PTR SS:[EBP-2C]            ;  EDX=序列号
005A3E78  |.  8D45 D8       LEA EAX,DWORD PTR SS:[EBP-28]
005A3E7B  |.  E8 7418E6FF   CALL UN_THINK.004056F4
005A3E80  |.  8B45 D8       MOV EAX,DWORD PTR SS:[EBP-28]            ;  EAX=序列号
005A3E83  |.  E8 3CFEFFFF   CALL UN_THINK.005A3CC4                   ;  根据序列号算出一数字,与计算用户名代码的算法相同,看上面的分析,结果设为SN_TEMP1
005A3E88  |.  DB6D DC       FLD TBYTE PTR SS:[EBP-24]                ;  ST(1)=SN_TEMP1
005A3E8B  |.  DEC1          FADDP ST(1),ST                           ;  ST(0)=ST(0)+ST(1)
005A3E8D  |.  83C4 F8       ADD ESP,-8                               ; /
005A3E90  |.  DD1C24        FSTP QWORD PTR SS:[ESP]                  ; |将ST(0)弹出到ESP,作为下面这个Call的参数
005A3E93  |.  9B            WAIT                                     ; |
005A3E94  |.  E8 C7FEFFFF   CALL UN_THINK.005A3D60                   ; 关键Call,F7跟入!
>>>>>>>>>>>>>>>>>>>>>>>
    005A3D60  /$  55            PUSH EBP                              ; F7跟入后我们来到这里 
    005A3D61  |.  8BEC          MOV EBP,ESP
    005A3D63  |.  83C4 F0       ADD ESP,-10
    005A3D66  |.  DD45 08       FLD QWORD PTR SS:[EBP+8]              ;  前面计算得的值装入ST(0)
    005A3D69  |.  D81D B43D5A00 FCOMP DWORD PTR DS:[5A3DB4]           ;  与1比较
    005A3D6F  |.  DFE0          FSTSW AX
    005A3D71  |.  9E            SAHF
    005A3D72  |.  73 0C         JNB SHORT UN_THINK.    005A3D80       ;  大于等于1就跳
    005A3D74  |.  33C0          XOR EAX,EAX
    005A3D76  |.  8945 08       MOV DWORD PTR SS:[EBP+8],EAX
    005A3D79  |.  C745 0C 0000F>MOV DWORD PTR SS:[EBP+C],3FF00000
    005A3D80  |>  DD45 08       FLD QWORD PTR SS:[EBP+8]              ;  再次前面计算得的值装入ST(0)
    005A3D83  |.  D80D B83D5A00 FMUL DWORD PTR DS:[5A3DB8]            ;  * 75
    005A3D89  |.  DB2D BC3D5A00 FLD TBYTE PTR DS:[5A3DBC]             ;  将pi装入到ST(0)
    005A3D8F  |.  DEF9          FDIVP ST(1),ST                        ;  除以pi
    005A3D91  |.  E8 5EEFE5FF   CALL UN_THINK.00402CF4                ;  进去后看到,是将st(0)以整数保存到ESP,EAX
    005A3D96  |.  05 E4000000   ADD EAX,0E4                           ;  再将结果加上E4H,结果就是注册码!^0^
    005A3D9B  |.  83D2 00       ADC EDX,0
    005A3D9E  |.  8945 F0       MOV DWORD PTR SS:[EBP-10],EAX         ;  EBP-10=EAX
    005A3DA1  |.  8955 F4       MOV DWORD PTR SS:[EBP-C],EDX
    005A3DA4  |.  DF6D F0       FILD QWORD PTR SS:[EBP-10]
    005A3DA7  |.  DD5D F8       FSTP QWORD PTR SS:[EBP-8]
    005A3DAA  |.  9B            WAIT
    005A3DAB  |.  DD45 F8       FLD QWORD PTR SS:[EBP-8]              ;  装入到ST(0)
    005A3DAE  |.  8BE5          MOV ESP,EBP
    005A3DB0  |.  5D            POP EBP
    005A3DB1  .  C2 0800       RETN 8
    
   
                                                     <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                                                     
005A3E99  |.  83C4 F4       ADD ESP,-0C
005A3E9C  |.  DB3C24        FSTP TBYTE PTR SS:[ESP]                  ; |将正确注册码弹出到ESP
005A3E9F  |.  9B            WAIT                                     ; |
005A3EA0  |.  8D45 F4       LEA EAX,DWORD PTR SS:[EBP-C]             ; |
005A3EA3  |.  E8 4C7FE6FF   CALL UN_THINK.0040BDF4                   ; 将正确注册码转换为字符型
005A3EA8  |.  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]
005A3EAB  |.  50            PUSH EAX
005A3EAC  |.  8D4D D0       LEA ECX,DWORD PTR SS:[EBP-30]
005A3EAF  |.  33D2          XOR EDX,EDX
005A3EB1  |.  B8 5C3F5A00   MOV EAX,UN_THINK.005A3F5C                ;  ASCII "Regkey"
005A3EB6  |.  E8 25040000   CALL UN_THINK.005A42E0                   ;  读取我们输入的注册码
005A3EBB  |.  8B55 D0       MOV EDX,DWORD PTR SS:[EBP-30]            ;  EDX=我们输入的注册码
005A3EBE  |.  58            POP EAX                                  ;  EAX=正确注册码
005A3EBF  |.  E8 7413E6FF   CALL UN_THINK.00405238                   ;  比较!
005A3EC4  |.  0F94C3        SETE BL                                  ;  相等,则BL置1!
005A3EC7  |>  33C0          XOR EAX,EAX
005A3EC9  |.  5A            POP EDX
005A3ECA  |.  59            POP ECX
005A3ECB  |.  59            POP ECX
005A3ECC  |.  64:8910       MOV DWORD PTR FS:[EAX],EDX
005A3ECF  |.  68 133F5A00   PUSH UN_THINK.005A3F13
005A3ED4  |>  8D45 D0       LEA EAX,DWORD PTR SS:[EBP-30]
005A3ED7  |.  BA 02000000   MOV EDX,2
005A3EDC  |.  E8 5F0FE6FF   CALL UN_THINK.00404E40
005A3EE1  |.  8D45 D8       LEA EAX,DWORD PTR SS:[EBP-28]
005A3EE4  |.  E8 7716E6FF   CALL UN_THINK.00405560
005A3EE9  |.  8D45 E8       LEA EAX,DWORD PTR SS:[EBP-18]
005A3EEC  |.  BA 02000000   MOV EDX,2
005A3EF1  |.  E8 4A0FE6FF   CALL UN_THINK.00404E40
005A3EF6  |.  8D45 F0       LEA EAX,DWORD PTR SS:[EBP-10]
005A3EF9  |.  E8 6216E6FF   CALL UN_THINK.00405560
005A3EFE  |.  8D45 F4       LEA EAX,DWORD PTR SS:[EBP-C]
005A3F01  |.  BA 03000000   MOV EDX,3
005A3F06  |.  E8 350FE6FF   CALL UN_THINK.00404E40
005A3F0B  .  C3            RETN
005A3F0C   .^ E9 AB07E6FF   JMP UN_THINK.004046BC
005A3F11   .^ EB C1         JMP SHORT UN_THINK.005A3ED4
005A3F13   .  8BC3          MOV EAX,EBX                              ;  将注册标志放入到EAX!
005A3F15   .  5B            POP EBX
005A3F16   .  8BE5          MOV ESP,EBP
005A3F18   .  5D            POP EBP
005A3F19   .  C3            RETN


/////////////////////////////
//      有关软件的暗桩     //
/////////////////////////////
别以为上面这些就完乐,软件还有一个暗桩(多谢LJWBH提醒^^),大家不要晕,Let's go on...........
虽然正确注册乐软件,但过了一段时间后,软件就会突然弹出一个窗口,提示:
"您正在使用的是非法注册版本,请您正确注册《大名鼎鼎》软件,否则数据库将在近期内被锁定。"
:(((((((((((((((((
好可恶!这时候要我们的W32DASM上场乐~~好久不见,hehe:P
反编译软件后,找到这段提示非法注册的话,请从下往上看……
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00602E19(C)
|
:00602E14 6A00                    push 00000000
:00602E16 6A00                    push 00000000
:00602E18 49                      dec ecx
:00602E19 75F9                    jne 00602E14
:00602E1B 51                      push ecx
:00602E1C 53                      push ebx
:00602E1D 56                      push esi
:00602E1E 57                      push edi
:00602E1F 8945FC                  mov dword ptr [ebp-04], eax
:00602E22 33C0                    xor eaxeax
:00602E24 55                      push ebp
:00602E25 6802326000              push 00603202
:00602E2A 64FF30                  push dword ptr fs:[eax]
:00602E2D 648920                  mov dword ptr fs:[eax], esp
:00602E30 E8930FFAFF              call 005A3DC8                  //注册码判断
:00602E35 84C0                    test alal 
:00602E37 7470                    je 00602EA9                    //如何未注册就跳走不进行下一步的判断了

………………
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00602E4E(C)
|
:00602E5B E82030FAFF              call 005A5E80
:00602E60 EB1A                    jmp 00602E7C
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00602E51(C)
|
:00602E62 E8AD30FAFF              call 005A5F14
:00602E67 EB13                    jmp 00602E7C
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00602E54(C)
|
:00602E69 E8B631FAFF              call 005A6024
:00602E6E EB0C                    jmp 00602E7C
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00602E57(C)
|
:00602E70 E86732FAFF              call 005A60DC
:00602E75 EB05                    jmp 00602E7C
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00602E59(U)
|
:00602E77 E83433FAFF              call 005A61B0
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00602E60(U), :00602E67(U), :00602E6E(U), :00602E75(U)               //分别从5个Call跳过来
|
:00602E7C 84C0                    test alal
:00602E7E 7529                    jne 00602EA9                        //我们发现这里可以跳过下面的信息
:00602E80 8B45FC                  mov eaxdword ptr [ebp-04]
:00602E83 8B80F8040000            mov eaxdword ptr [eax+000004F8]
:00602E89 BA60EA0000              mov edx, 0000EA60
:00602E8E E8A9FBE3FF              call 00442A3C
* Possible StringData Ref from Data Obj ->"您正在使用的是非法注册版本,请您正确注册《大名"
                                        ->"鼎鼎》软件,否则数据库将在近期内被锁定。"
                                  |
:00602E93 B918326000              mov ecx, 00603218
:00602E98 B201                    mov dl, 01
* Possible StringData Ref from Data Obj ->""
                                  |
:00602E9A A1988C4000              mov eaxdword ptr [00408C98]
:00602E9F E88CB6E0FF              call 0040E530
:00602EA4 E80F19E0FF              call 004047B8
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00602E37(C), :00602E7E(C)
|
:00602EA9 8D4DF4                  lea ecxdword ptr [ebp-0C]
:00602EAC 33D2                    xor edxedx
* Possible StringData Ref from Data Obj ->"Remindsoundfile"
                                  |
:00602EAE B878326000              mov eax, 00603278
:00602EB3 E82814FAFF              call 005A42E0
:00602EB8 8B45F4                  mov eaxdword ptr [ebp-0C]
:00602EBB E8A078E0FF              call 0040A760
:00602EC0 84C0                    test alal
:00602EC2 7508                    jne 00602ECC
:00602EC4 8D45F4                  lea eaxdword ptr [ebp-0C]
:00602EC7 E8501FE0FF              call 00404E1C

换用OllDbg,下断点bp 602E14,软件启动过了一会儿就会被拦住
00602E1B   .  51            PUSH ECX
00602E1C   .  53            PUSH EBX
00602E1D   .  56            PUSH ESI
00602E1E   .  57            PUSH EDI
00602E1F   .  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX
00602E22   .  33C0          XOR EAX,EAX
00602E24   .  55            PUSH EBP
00602E25   .  68 02326000   PUSH UN_THINK.00603202
00602E2A   .  64:FF30       PUSH DWORD PTR FS:[EAX]
00602E2D   .  64:8920       MOV DWORD PTR FS:[EAX],ESP
00602E30   .  E8 930FFAFF   CALL UN_THINK.005A3DC8                   ;  注册码判断
00602E35   .  84C0          TEST AL,AL
00602E37   .  74 70         JE SHORT UN_THINK.00602EA9               ;  如何未注册就跳走,不进行下一步的判断了
00602E39   .  E8 06FEDFFF   CALL UN_THINK.00402C44
00602E3E   .  BA 05000000   MOV EDX,5
00602E43   .  B8 01000000   MOV EAX,1
00602E48   .  E8 BB21E3FF   CALL UN_THINK.00435008                   ;  随机生成1-5中一个整数,放入EAX  
00602E4D   .  48            DEC EAX                                  ;  这里可以自己改EAX的值,选择进入下面的一个Call
00602E4E   .  74 0B         JE SHORT UN_THINK.00602E5B
00602E50   .  48            DEC EAX
00602E51   .  74 0F         JE SHORT UN_THINK.00602E62
00602E53   .  48            DEC EAX
00602E54   .  74 13         JE SHORT UN_THINK.00602E69
00602E56   .  48            DEC EAX
00602E57   .  74 17         JE SHORT UN_THINK.00602E70
00602E59   .  EB 1C         JMP SHORT UN_THINK.00602E77
00602E5B   >  E8 2030FAFF   CALL UN_THINK.005A5E80                   ;  设为Call_1,F7跟入
00602E60   .  EB 1A         JMP SHORT UN_THINK.00602E7C
00602E62   >  E8 AD30FAFF   CALL UN_THINK.005A5F14                   ;  设为Call_2,F7跟入 
00602E67   .  EB 13         JMP SHORT UN_THINK.00602E7C
00602E69   >  E8 B631FAFF   CALL UN_THINK.005A6024                   ;  设为Call_3,F7跟入
00602E6E   .  EB 0C         JMP SHORT UN_THINK.00602E7C
00602E70   >  E8 6732FAFF   CALL UN_THINK.005A60DC                   ;  设为Call_4,F7跟入
00602E75   .  EB 05         JMP SHORT UN_THINK.00602E7C
00602E77   >  E8 3433FAFF   CALL UN_THINK.005A61B0                   ;  设为Call_5,F7跟入
00602E7C   >  84C0          TEST AL,AL
00602E7E   .  75 29         JNZ SHORT UN_THINK.00602EA9 

我们分别进入这5个Call看看
☆☆☆☆☆☆☆☆☆Call_1☆☆☆☆☆☆☆☆☆
005A5E80   $  55            PUSH EBP
005A5E81   .  8BEC          MOV EBP,ESP
005A5E83   .  83C4 EC       ADD ESP,-14
005A5E86   .  53            PUSH EBX
005A5E87   .  56            PUSH ESI
005A5E88   .  57            PUSH EDI
005A5E89   .  33C0          XOR EAX,EAX
005A5E8B   .  55            PUSH EBP
005A5E8C   .  68 E95E5A00   PUSH UN_THINK.005A5EE9
005A5E91   .  64:FF30       PUSH DWORD PTR FS:[EAX]
005A5E94   .  64:8920       MOV DWORD PTR FS:[EAX],ESP
005A5E97   .  6A 00         PUSH 0
005A5E99   .  6A 02         PUSH 2
005A5E9B   .  6A 00         PUSH 0
005A5E9D   .  6A 00         PUSH 0
005A5E9F   .  B8 085F5A00   MOV EAX,UN_THINK.005A5F08                ;  ASCII "Softkey"
005A5EA4   .  E8 3FE6FFFF   CALL UN_THINK.005A44E8                   ;  读取序列号
005A5EA9   .  D835 105F5A00 FDIV DWORD PTR DS:[5A5F10]               ;  除以2
005A5EAF   .  E8 40CEE5FF   CALL UN_THINK.00402CF4                   ;  将结果弹出到ESP
005A5EB4   .  E8 4B01E6FF   CALL UN_THINK.00406004                   ;  F7跟入看看
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
     00406004  /$  52            PUSH EDX                                 ;  F7跟入后,我们来到这里
     00406005  |.  50            PUSH EAX
     00406006  |.  8B4424 10     MOV EAX,DWORD PTR SS:[ESP+10]            ;  干扰代码
     0040600A  |.  F72424        MUL DWORD PTR SS:[ESP]                   ;  干扰……
     0040600D  |.  89C1          MOV ECX,EAX                              ;  干扰……
     0040600F  |.  8B4424 04     MOV EAX,DWORD PTR SS:[ESP+4]             ;  ……
     00406013  |.  F76424 0C     MUL DWORD PTR SS:[ESP+C]                 ;  ……
     00406017  |.  01C1          ADD ECX,EAX                              ;  ……
     00406019  |.  8B0424        MOV EAX,DWORD PTR SS:[ESP]               ;  将除以2后的序列号放到EAX
     0040601C  |.  F76424 0C     MUL DWORD PTR SS:[ESP+C]                 ;  EAX=EAX*2
     00406020  |.  01CA          ADD EDX,ECX                              ;  ……
     00406022  |.  59            POP ECX                                  ;  设EAX为temp1
     00406023  |.  59            POP ECX
     00406024  .  C2 0800       RETN 8
                                  
                                                                       <<<<<<<<<<<<<<<<<<<<<<<

005A5EB9   .  8945 F8       MOV DWORD PTR SS:[EBP-8],EAX
005A5EBC   .  8955 FC       MOV DWORD PTR SS:[EBP-4],EDX
005A5EBF   .  DF6D F8       FILD QWORD PTR SS:[EBP-8]               
005A5EC2   .  DB7D EC       FSTP TBYTE PTR SS:[EBP-14]               ;  将temp1转移到EBP-14
005A5EC5   .  9B            WAIT
005A5EC6   .  6A 00         PUSH 0
005A5EC8   .  6A 00         PUSH 0
005A5ECA   .  B8 085F5A00   MOV EAX,UN_THINK.005A5F08                ;  ASCII "Softkey"
005A5ECF   .  E8 14E6FFFF   CALL UN_THINK.005A44E8                   ;  读取软件序列号到ST(0) 
005A5ED4   .  DB6D EC       FLD TBYTE PTR SS:[EBP-14]                ;  ST(0)=EBP-14, ST(1)=软件序列号
005A5ED7   .  DED9          FCOMPP                                   ;  比较!
005A5ED9   .  DFE0          FSTSW AX     
005A5EDB   .  9E            SAHF
005A5EDC   .  0F94C3        SETE BL                                  ;  相等BL就置1!
005A5EDF   .  33C0          XOR EAX,EAX
005A5EE1   .  5A            POP EDX
005A5EE2   .  59            POP ECX
005A5EE3   .  59            POP ECX
005A5EE4   .  64:8910       MOV DWORD PTR FS:[EAX],EDX
005A5EE7   .  EB 0C         JMP SHORT UN_THINK.005A5EF5
005A5EE9   .^ E9 1AE5E5FF   JMP UN_THINK.00404408
005A5EEE   .  33DB          XOR EBX,EBX
005A5EF0   .  E8 3FE9E5FF   CALL UN_THINK.00404834
005A5EF5   >  8BC3          MOV EAX,EBX                              ;  EAX=EBX
005A5EF7   .  5F            POP EDI
005A5EF8   .  5E            POP ESI
005A5EF9   .  5B            POP EBX
005A5EFA   .  8BE5          MOV ESP,EBP
005A5EFC   .  5D            POP EBP
005A5EFD   .  C3            RETN
▲小结:这段代码就是为了检测,(软件序列号÷2)×2是否等于软件序列号.想想,什么时候才会成立?对,当序列号是偶数的时候!
☆☆☆☆☆☆☆☆☆Call_2☆☆☆☆☆☆☆☆☆
     005A5F14   $  55            PUSH EBP                                 ; F7跟入后我们来到了这里
     005A5F15   .  8BEC          MOV EBP,ESP
     005A5F17   .  33C9          XOR ECX,ECX
     005A5F19   .  51            PUSH ECX
     …………
     005A5F3E   .  8D45 FC       LEA EAX,DWORD PTR SS:[EBP-4]
     005A5F41   .  50            PUSH EAX
     005A5F42   .  8D4D F0       LEA ECX,DWORD PTR SS:[EBP-10]
     005A5F45   .  33D2          XOR EDX,EDX
     005A5F47   .  B8 1C605A00   MOV EAX,UN_THINK.005A601C                ;  ASCII "Softkey"
     005A5F4C   .  E8 8FE3FFFF   CALL UN_THINK.005A42E0
     005A5F51   .  8B45 F0       MOV EAX,DWORD PTR SS:[EBP-10]
     005A5F54   .  B9 04000000   MOV ECX,4
     005A5F59   .  BA 01000000   MOV EDX,1
     005A5F5E   .  E8 E9F3E5FF   CALL UN_THINK.0040534C                   ;  取软件序列号前四位
     005A5F63   .  8D45 F8       LEA EAX,DWORD PTR SS:[EBP-8]
     005A5F66   .  50            PUSH EAX
     005A5F67   .  8D4D EC       LEA ECX,DWORD PTR SS:[EBP-14]
     005A5F6A   .  33D2          XOR EDX,EDX
     005A5F6C   .  B8 1C605A00   MOV EAX,UN_THINK.005A601C                ;  ASCII "Softkey"
     005A5F71   .  E8 6AE3FFFF   CALL UN_THINK.005A42E0
     005A5F76   .  8B45 EC       MOV EAX,DWORD PTR SS:[EBP-14]
     005A5F79   .  B9 02000000   MOV ECX,2
     005A5F7E   .  BA 05000000   MOV EDX,5
     005A5F83   .  E8 C4F3E5FF   CALL UN_THINK.0040534C                   ;  取序列号第5、6位
     005A5F88   .  8D45 F4       LEA EAX,DWORD PTR SS:[EBP-C]
     005A5F8B   .  50            PUSH EAX
     005A5F8C   .  8D4D E8       LEA ECX,DWORD PTR SS:[EBP-18]
     005A5F8F   .  33D2          XOR EDX,EDX
     005A5F91   .  B8 1C605A00   MOV EAX,UN_THINK.005A601C                ;  ASCII "Softkey"
     005A5F96   .  E8 45E3FFFF   CALL UN_THINK.005A42E0
     005A5F9B   .  8B45 E8       MOV EAX,DWORD PTR SS:[EBP-18]
     005A5F9E   .  B9 02000000   MOV ECX,2
     005A5FA3   .  BA 07000000   MOV EDX,7
     005A5FA8   .  E8 9FF3E5FF   CALL UN_THINK.0040534C                   ;  取序列号第7、8位
     005A5FAD   .  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]
     005A5FB0   .  E8 FB42E6FF   CALL UN_THINK.0040A2B0                   ;  序列号第7、8位转换为数值型放入EAX
     005A5FB5   .  50            PUSH EAX
     005A5FB6   .  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]
     005A5FB9   .  E8 F242E6FF   CALL UN_THINK.0040A2B0                   ;  序列号第5、6位转换为数值型放入EAX
     005A5FBE   .  50            PUSH EAX
     005A5FBF   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
     005A5FC2   .  E8 E942E6FF   CALL UN_THINK.0040A2B0                   ;  序列号前四位转换为数值型放入EAX
     005A5FC7   .  5A            POP EDX
     005A5FC8   .  59            POP ECX
     005A5FC9   .  E8 B663E6FF   CALL UN_THINK.0040C384                   ;  这里好像用了类似SEH的东西?进行检测如何不符合某种条件就出错跑飞掉,要Shift+F9才能继续走下去.咱们F7跟入看看...
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
     0040C384  /$  53            PUSH EBX
     0040C385  |.  56            PUSH ESI
     0040C386  |.  57            PUSH EDI
     0040C387  |.  83C4 F8       ADD ESP,-8
     0040C38A  |.  8BF9          MOV EDI,ECX
     0040C38C  |.  8BF2          MOV ESI,EDX
     0040C38E  |.  8BD8          MOV EBX,EAX
     0040C390  |.  54            PUSH ESP                                 ; /Arg1 = 009FFB78
     0040C391  |.  8BCF          MOV ECX,EDI                              ; |
     0040C393  |.  8BD6          MOV EDX,ESI                              ; |
     0040C395  |.  8BC3          MOV EAX,EBX                              ; |
     0040C397  |.  E8 20FFFFFF   CALL UN_THINK.0040C2BC                   ; 关键,F7跟入!
     0040C39C  |.  84C0          TEST AL,AL
     0040C39E  |.  75 0A         JNZ SHORT UN_THINK.0040C3AA              ;  如果这里跳走就没事了
     0040C3A0  |.  A1 D47A6100   MOV EAX,DWORD PTR DS:[617AD4]
     0040C3A5  |.  E8 1ED5FFFF   CALL UN_THINK.004098C8                   ;  就是这个Call引起了错误
     0040C3AA  |>  DD0424        FLD QWORD PTR SS:[ESP]
     0040C3AD  |.  59            POP ECX
     0040C3AE  |.  5A            POP EDX
     0040C3AF  |.  5F            POP EDI
     0040C3B0  |.  5E            POP ESI
     0040C3B1  |.  5B            POP EBX
     0040C3B2  .  C3            RETN

     0040C2BC  /$  55            PUSH EBP                                 ;跟入40C397    CALL UN_THINK.0040C2BC   我们来到这里
     0040C2BD  |.  8BEC          MOV EBP,ESP
     0040C2BF  |.  83C4 F8       ADD ESP,-8
     0040C2C2  |.  53            PUSH EBX
     0040C2C3  |.  56            PUSH ESI
     0040C2C4  |.  57            PUSH EDI
     0040C2C5  |.  8BD9          MOV EBX,ECX
     0040C2C7  |.  8BFA          MOV EDI,EDX
     0040C2C9  |.  66:8945 FE    MOV WORD PTR SS:[EBP-2],AX
     0040C2CD  |.  C645 FD 00    MOV BYTE PTR SS:[EBP-3],0                ;  ESP-3=0
     0040C2D1  |.  66:8B45 FE    MOV AX,WORD PTR SS:[EBP-2]               ;  AX=EBP-2=软件序列号的前四位
     0040C2D5  |.  E8 A6FFFFFF   CALL UN_THINK.     0040C280
     0040C2DA  |.  83E0 7F       AND EAX,7F
     0040C2DD  |.  8D0440        LEA EAX,DWORD PTR DS:[EAX+EAX*2]
     0040C2E0  |.  8D34C5 046160>LEA ESI,DWORD PTR DS:[EAX*8+606104]      ;  ESI指向的是一张表
     0040C2E7  |.  66:837D FE 01 CMP WORD PTR SS:[EBP-2],1                ;  序列号的前四位大于1?
     0040C2EC  |.  0F82 86000000 JB UN_THINK.     0040C378                     ;  是则继续
     0040C2F2  |.  66:817D FE 0F>CMP WORD PTR SS:[EBP-2],270F             ;  序列号的前四位小于270FH(9999)?
     0040C2F8  |.  77 7E         JA SHORT UN_THINK.0040C378               ;  不是则继续
     0040C2FA  |.  66:83FF 01    CMP DI,1                                 ;  第5,6位大于等于1?
     0040C2FE  |.  72 78         JB SHORT UN_THINK.0040C378               ;  是则继续
     0040C300  |.  66:83FF 0C    CMP DI,0C                                ;  第5,6位小于等于12?
     0040C304  |.  77 72         JA SHORT UN_THINK.0040C378               ;  不是则继续
     0040C306  |.  66:83FB 01    CMP BX,1                                 ;  第7,8位大于等于1?
     0040C30A  |.  72 6C         JB SHORT UN_THINK.0040C378               ;  是则继续
     0040C30C  |.  0FB7C7        MOVZX EAX,DI                             ;  EAX=第5、6位
     0040C30F  |.  66:3B5C46 FE  CMP BX,WORD PTR DS:[ESI+EAX*2-2]         ;  注意这里很有意思哦!第7,8位与ESI处的表向比较,如果第5、6位为1则比较第7,8位是否小于1FH(31),如果……看出来了吗?其实第5,6位代表月份,第7,8位代表日期!
     0040C314  |.  77 62         JA SHORT UN_THINK.0040C378               ;  不是则继续
     0040C316  |.  0FB7C7        MOVZX EAX,DI
     0040C319  |.  48            DEC EAX
     0040C31A  |.  85C0          TEST EAX,EAX
     0040C31C  |.  7E 0E         JLE SHORT UN_THINK.0040C32C
     0040C31E  |.  B9 01000000   MOV ECX,1
     0040C323  |>  66:035C4E FE  /ADD BX,WORD PTR DS:[ESI+ECX*2-2]
     
     …………
     
     0040C371  |.  DD18          FSTP QWORD PTR DS:[EAX]
     0040C373  |.  9B            WAIT
     0040C374  |.  C645 FD 01    MOV BYTE PTR SS:[EBP-3],1
     0040C378  |>  8A45 FD       MOV AL,BYTE PTR SS:[EBP-3]               ;  不能到这里!(ESP-3=0)
     0040C37B  |.  5F            POP EDI          
     0040C37C  |.  5E            POP ESI
     0040C37D  |.  5B            POP EBX
     0040C37E  |.  59            POP ECX
     0040C37F  |.  59            POP ECX
     0040C380  |.  5D            POP EBP
     0040C381  .  C2 0400       RETN 4
                                                                     
                                                                     <<<<<<<<<<<<<<<<<<<<<<<<<
                                                                     
     005A5FCE   .  DDD8          FSTP ST
     005A5FD0   .  B3 01         MOV BL,1                                 ;  如果能正常走过上面那个Call,BL就置为1!
     005A5FD2   .  33C0          XOR EAX,EAX
     005A5FD4   .  5A            POP EDX
     005A5FD5   .  59            POP ECX
     005A5FD6   .  59            POP ECX
     005A5FD7   .  64:8910       MOV DWORD PTR FS:[EAX],EDX
     …………
     005A600A   .  8BC3          MOV EAX,EBX
     005A600C   .  5F            POP EDI
     005A600D   .  5E            POP ESI
     005A600E   .  5B            POP EBX
     005A600F   .  8BE5          MOV ESP,EBP
     005A6011   .  5D            POP EBP
     005A6012   .  C3            RETN
     
▲小结:这段代码就是为了检测,软件序列号前8位是否为日期格式.第1-4位代表年份,5-6位代表月份,8-9位代表日期,并且要注意到大月、小月、闰月的问题.如果嫌麻烦的话,干脆就让第8-9位总小于等于28就行了;-)
☆☆☆☆☆☆☆☆☆Call_3☆☆☆☆☆☆☆☆☆
005A6024   $  55            PUSH EBP                                 ; F7跟入我们在这里
005A6025   .  8BEC          MOV EBP,ESP
…………
005A6047   .  64:8920       MOV DWORD PTR FS:[EAX],ESP
005A604A   .  8D4D FC       LEA ECX,DWORD PTR SS:[EBP-4]
005A604D   .  33D2          XOR EDX,EDX
005A604F   .  B8 D4605A00   MOV EAX,UN_THINK.005A60D4                ;  ASCII "Softkey"
005A6054   .  E8 87E2FFFF   CALL UN_THINK.005A42E0                   ;