【破文标题】申请加入OCN之二--FilesafeV7.0企业版算法分析
【破文作者】pentacle[PYG]
【作者邮箱】
【作者主页】www.chinapyg.cn
【破解工具】OD汉化第二版、Peid、calc
【破解平台】XP_SP2
【软件名称】FilesafeV7.0企业版
【软件大小】2.2M
【原版下载】网上无企业版下载。所以在这儿发一个分析也应该没关系啦。
【保护方式】注册码
【破解过程】1、查壳
UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo
轻松搞定
2、注册算法分析
用OD载入脱完壳的软件。
F9运行,弹出试用提示窗口(限50次及运行60分钟)
不管了。分析注册码是我的任务。因为已经分析过了。所以我直入主题。
假注册码:ABCAEFGHD1234Q678AV1
点确定,断在00405050
00405050   .  6A FF         PUSH -1                                  ;  HOHO。我在这儿下断了。开始我们的算法分析之旅吧
00405052   .  68 E0EC4700   PUSH 1FileSaf.0047ECE0                   ;  入口地址; SE handler installation
00405057   .  64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
0040505D   .  50            PUSH EAX
0040505E   .  64:8925 00000>MOV DWORD PTR FS:[0],ESP
00405065   .  83EC 10       SUB ESP,10
00405068   .  55            PUSH EBP
00405069   .  8BE9          MOV EBP,ECX
0040506B   .  E8 804C0100   CALL 1FileSaf.00419CF0                   ;  取机器码(硬盘芯片ID)
00405070   .  50            PUSH EAX
00405071   .  8D4C24 0C     LEA ECX,DWORD PTR SS:[ESP+C]
00405075   .  E8 BEA60500   CALL 1FileSaf.0045F738
0040507A   .  A1 14834A00   MOV EAX,DWORD PTR DS:[4A8314]
0040507F   .  C74424 1C 000>MOV DWORD PTR SS:[ESP+1C],0
00405087   .  894424 04     MOV DWORD PTR SS:[ESP+4],EAX
0040508B   .  8D4C24 04     LEA ECX,DWORD PTR SS:[ESP+4]
0040508F   .  C64424 1C 01  MOV BYTE PTR SS:[ESP+1C],1
00405094   .  51            PUSH ECX
00405095   .  68 4A040000   PUSH 44A
0040509A   .  8BCD          MOV ECX,EBP
0040509C   .  E8 AF9A0500   CALL 1FileSaf.0045EB50
004050A1   .  8BC8          MOV ECX,EAX
004050A3   .  E8 2C760500   CALL 1FileSaf.0045C6D4                   ;  读取假注册码
004050A8   .  8B5424 04     MOV EDX,DWORD PTR SS:[ESP+4]
004050AC   .  8B4424 08     MOV EAX,DWORD PTR SS:[ESP+8]
004050B0   .  52            PUSH EDX
004050B1   .  50            PUSH EAX
004050B2   .  E8 99390100   CALL 1FileSaf.00418A50                   ;  算法CALL,跟进去
004050B7   .  83C4 08       ADD ESP,8
004050BA   .  84C0          TEST AL,AL                               ;  测试标志位
004050BC   .  0F84 C7000000 JE 1FileSaf.00405189                     ;  不跳就是注册成功


跟入CALL 00418A50
00418A50  /$  64:A1 0000000>MOV EAX,DWORD PTR FS:[0]                 ;  这个CALL完成了注册码整个校验过程
00418A56  |.  6A FF         PUSH -1
00418A58  |.  68 880E4800   PUSH 1FileSaf.00480E88
00418A5D  |.  50            PUSH EAX
00418A5E  |.  64:8925 00000>MOV DWORD PTR FS:[0],ESP
00418A65  |.  83EC 10       SUB ESP,10
00418A68  |.  56            PUSH ESI
00418A69  |.  8B7424 24     MOV ESI,DWORD PTR SS:[ESP+24]
00418A6D  |.  803E 00       CMP BYTE PTR DS:[ESI],0
00418A70  |.  0F84 21010000 JE 1FileSaf.00418B97
00418A76  |.  8B4C24 28     MOV ECX,DWORD PTR SS:[ESP+28]
00418A7A  |.  8039 00       CMP BYTE PTR DS:[ECX],0
00418A7D  |.  0F84 14010000 JE 1FileSaf.00418B97
00418A83  |.  A1 14834A00   MOV EAX,DWORD PTR DS:[4A8314]
00418A88  |.  53            PUSH EBX
00418A89  |.  894424 08     MOV DWORD PTR SS:[ESP+8],EAX
00418A8D  |.  C74424 20 000>MOV DWORD PTR SS:[ESP+20],0
00418A95  |.  894424 2C     MOV DWORD PTR SS:[ESP+2C],EAX
00418A99  |.  8D4424 14     LEA EAX,DWORD PTR SS:[ESP+14]
00418A9D  |.  8D5424 2C     LEA EDX,DWORD PTR SS:[ESP+2C]
00418AA1  |.  50            PUSH EAX
00418AA2  |.  8D4424 0C     LEA EAX,DWORD PTR SS:[ESP+C]
00418AA6  |.  52            PUSH EDX
00418AA7  |.  50            PUSH EAX
00418AA8  |.  51            PUSH ECX
00418AA9  |.  C64424 30 01  MOV BYTE PTR SS:[ESP+30],1
00418AAE  |.  E8 3D050000   CALL 1FileSaf.00418FF0                   ;  关键CALL。分析对象
00418AB3  |.  83C4 10       ADD ESP,10
00418AB6  |.  8D4C24 28     LEA ECX,DWORD PTR SS:[ESP+28]
00418ABA  |.  56            PUSH ESI
00418ABB  |.  E8 786C0400   CALL 1FileSaf.0045F738
00418AC0  |.  8D4C24 08     LEA ECX,DWORD PTR SS:[ESP+8]
00418AC4  |.  C64424 20 02  MOV BYTE PTR SS:[ESP+20],2
00418AC9  |.  E8 1E710400   CALL 1FileSaf.0045FBEC
00418ACE  |.  8D4C24 2C     LEA ECX,DWORD PTR SS:[ESP+2C]
00418AD2  |.  E8 15710400   CALL 1FileSaf.0045FBEC
00418AD7  |.  8D4C24 28     LEA ECX,DWORD PTR SS:[ESP+28]
00418ADB  |.  E8 0C710400   CALL 1FileSaf.0045FBEC
00418AE0  |.  8D4C24 10     LEA ECX,DWORD PTR SS:[ESP+10]
00418AE4  |.  6A 05         PUSH 5
00418AE6  |.  51            PUSH ECX
00418AE7  |.  8D4C24 30     LEA ECX,DWORD PTR SS:[ESP+30]
00418AEB  |.  E8 A5F00300   CALL 1FileSaf.00457B95                   ;  取机器码前5位
00418AF0  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]
00418AF2  |.  8B5424 08     MOV EDX,DWORD PTR SS:[ESP+8]
00418AF6  |.  50            PUSH EAX
00418AF7  |.  52            PUSH EDX
00418AF8  |.  C64424 28 03  MOV BYTE PTR SS:[ESP+28],3
00418AFD  |.  E8 8E030000   CALL 1FileSaf.00418E90                   ;  对比机器码前5位
00418B02  |.  83C4 08       ADD ESP,8
00418B05  |.  84C0          TEST AL,AL
00418B07      74 3C         JE SHORT 1FileSaf.00418B45               ;  此处不能跳~~
00418B09      8D4424 0C     LEA EAX,DWORD PTR SS:[ESP+C]
00418B0D  |.  6A 05         PUSH 5
00418B0F  |.  50            PUSH EAX
00418B10  |.  8D4C24 30     LEA ECX,DWORD PTR SS:[ESP+30]
00418B14  |.  E8 00F00300   CALL 1FileSaf.00457B19                   ;  取机器码后5位
00418B19  |.  8B00          MOV EAX,DWORD PTR DS:[EAX]
00418B1B      8B4C24 2C     MOV ECX,DWORD PTR SS:[ESP+2C]
00418B1F  |.  50            PUSH EAX
00418B20  |.  51            PUSH ECX
00418B21  |.  C64424 28 04  MOV BYTE PTR SS:[ESP+28],4
00418B26  |.  E8 65030000   CALL 1FileSaf.00418E90                   ;  对比机器码后5位
00418B2B  |.  83C4 08       ADD ESP,8
00418B2E  |.  8D4C24 0C     LEA ECX,DWORD PTR SS:[ESP+C]
00418B32  |.  84C0          TEST AL,AL                               ;  AL值要为1
00418B34  |.  0F94C3        SETE BL
00418B37  |.  C64424 20 03  MOV BYTE PTR SS:[ESP+20],3
00418B3C  |.  E8 896B0400   CALL 1FileSaf.0045F6CA
00418B41  |.  84DB          TEST BL,BL                               ;  BL=0下面才能跳
00418B43  |.  74 02         JE SHORT 1FileSaf.00418B47               ;  此处必须跳~~~
00418B45  |>  B3 01         MOV BL,1
00418B47  |>  8D4C24 10     LEA ECX,DWORD PTR SS:[ESP+10]
00418B4B  |.  C64424 20 02  MOV BYTE PTR SS:[ESP+20],2
00418B50  |.  E8 756B0400   CALL 1FileSaf.0045F6CA
00418B55  |.  84DB          TEST BL,BL                               ;  测试BL的值
00418B57  |.  5B            POP EBX
00418B58  |.  75 10         JNZ SHORT 1FileSaf.00418B6A              ;  此处不能跳~~~
00418B5A  |.  8B4424 10     MOV EAX,DWORD PTR SS:[ESP+10]            ;  将SS:[ESP+10]处的值赋给EAX,即E00
00418B5E  |.  F6C4 E0       TEST AH,0E0                              ;  关键CALL3计算在此用上了~~AH必须=0E0
00418B61      75 07         JNZ SHORT 1FileSaf.00418B6A              ;  不能跳~~~
00418B63  |.  A9 E0000000   TEST EAX,0E0                             ;  JBE 低于或等于跳转,也就是EAX必须等于00000E00
00418B68  |.  76 3F         JBE SHORT 1FileSaf.00418BA9              ;  必须跳,跳向成功了
00418B6A  |>  8D4C24 24     LEA ECX,DWORD PTR SS:[ESP+24]
00418B6E  |.  C64424 1C 01  MOV BYTE PTR SS:[ESP+1C],1
00418B73  |.  E8 526B0400   CALL 1FileSaf.0045F6CA
00418B78  |.  8D4C24 28     LEA ECX,DWORD PTR SS:[ESP+28]
00418B7C  |.  C64424 1C 00  MOV BYTE PTR SS:[ESP+1C],0
00418B81  |.  E8 446B0400   CALL 1FileSaf.0045F6CA
00418B86  |.  8D4C24 04     LEA ECX,DWORD PTR SS:[ESP+4]
00418B8A  |.  C74424 1C FFF>MOV DWORD PTR SS:[ESP+1C],-1
00418B92  |.  E8 336B0400   CALL 1FileSaf.0045F6CA
00418B97  |>  32C0          XOR AL,AL
00418B99  |.  5E            POP ESI
00418B9A  |.  8B4C24 10     MOV ECX,DWORD PTR SS:[ESP+10]
00418B9E  |.  64:890D 00000>MOV DWORD PTR FS:[0],ECX
00418BA5  |.  83C4 1C       ADD ESP,1C
00418BA8  |.  C3            RETN
00418BA9  |>  83E0 1F       AND EAX,1F
00418BAC  |.  8D4C24 24     LEA ECX,DWORD PTR SS:[ESP+24]
00418BB0  |.  A3 B0CA4A00   MOV DWORD PTR DS:[4ACAB0],EAX
00418BB5  |.  C605 48744A00>MOV BYTE PTR DS:[4A7448],0
00418BBC  |.  C64424 1C 01  MOV BYTE PTR SS:[ESP+1C],1
00418BC1  |.  E8 046B0400   CALL 1FileSaf.0045F6CA
00418BC6  |.  8D4C24 28     LEA ECX,DWORD PTR SS:[ESP+28]
00418BCA  |.  C64424 1C 00  MOV BYTE PTR SS:[ESP+1C],0
00418BCF  |.  E8 F66A0400   CALL 1FileSaf.0045F6CA
00418BD4  |.  8D4C24 04     LEA ECX,DWORD PTR SS:[ESP+4]
00418BD8  |.  C74424 1C FFF>MOV DWORD PTR SS:[ESP+1C],-1
00418BE0  |.  E8 E56A0400   CALL 1FileSaf.0045F6CA
00418BE5  |.  8B4C24 14     MOV ECX,DWORD PTR SS:[ESP+14]
00418BE9  |.  B0 01         MOV AL,1
00418BEB  |.  5E            POP ESI
00418BEC  |.  64:890D 00000>MOV DWORD PTR FS:[0],ECX
00418BF3  |.  83C4 1C       ADD ESP,1C
00418BF6  \.  C3            RETN

接下来我们跟进分析CALL 00418FF0                  
00418FF0  /$  83EC 08       SUB ESP,8                                ;  这段的功能是校验注册是否正确,及计算注册码中间值
00418FF3  |.  56            PUSH ESI
00418FF4  |.  8B7424 10     MOV ESI,DWORD PTR SS:[ESP+10]
00418FF8  |.  57            PUSH EDI
00418FF9  |.  803E 00       CMP BYTE PTR DS:[ESI],0                  ;  注册码为空?不为空就跳
00418FFC  |.  75 08         JNZ SHORT 1FileSaf.00419006
00418FFE  |.  5F            POP EDI
00418FFF  |.  32C0          XOR AL,AL
00419001  |.  5E            POP ESI
00419002  |.  83C4 08       ADD ESP,8
00419005  |.  C3            RETN
00419006  |>  33D2          XOR EDX,EDX                              ;  清空EDX
00419008  |.  33C9          XOR ECX,ECX                              ;  清空ECX
0041900A  |.  33C0          XOR EAX,EAX                              ;  清空EAX
0041900C  |>  0FBE3C30      /MOVSX EDI,BYTE PTR DS:[EAX+ESI]         ;  取注册码1-4位ASCII值之和放入ECX
00419010  |.  03CF          |ADD ECX,EDI
00419012  |.  40            |INC EAX
00419013  |.  83F8 04       |CMP EAX,4
00419016  |.^ 7C F4         \JL SHORT 1FileSaf.0041900C
00419018  |.  81E1 01000080 AND ECX,80000001                         ;  ECX=ECX AND 80000001h
0041901E  |.  79 05         JNS SHORT 1FileSaf.00419025              ;  ECX的值为正吗?为正就跳
00419020  |.  49            DEC ECX
00419021  |.  83C9 FE       OR ECX,FFFFFFFE
00419024  |.  41            INC ECX
00419025  |>  83F9 01       CMP ECX,1                                ;  ECX与1比较,不等?就跳
00419028  |.  75 05         JNZ SHORT 1FileSaf.0041902F
0041902A  |.  BA 10000000   MOV EDX,10
0041902F  |>  B8 04000000   MOV EAX,4                                ;  EAX赋值4
00419034  |.  33C9          XOR ECX,ECX
00419036  |>  0FBE3C30      /MOVSX EDI,BYTE PTR DS:[EAX+ESI]         ;  取注册码5-9位ASCII值之和放入ECX
0041903A  |.  03CF          |ADD ECX,EDI
0041903C  |.  40            |INC EAX
0041903D  |.  83F8 09       |CMP EAX,9
00419040  |.^ 7C F4         \JL SHORT 1FileSaf.00419036
00419042  |.  81E1 01000080 AND ECX,80000001
00419048  |.  79 05         JNS SHORT 1FileSaf.0041904F
0041904A  |.  49            DEC ECX
0041904B  |.  83C9 FE       OR ECX,FFFFFFFE
0041904E  |.  41            INC ECX
0041904F  |>  83F9 01       CMP ECX,1
00419052  |.  75 03         JNZ SHORT 1FileSaf.00419057
00419054  |.  83C2 08       ADD EDX,8
00419057  |>  B8 09000000   MOV EAX,9
0041905C  |.  33C9          XOR ECX,ECX
0041905E  |>  0FBE3C30      /MOVSX EDI,BYTE PTR DS:[EAX+ESI]         ;  取注册码10-14位ASCII值之和放入ECX
00419062  |.  03CF          |ADD ECX,EDI
00419064  |.  40            |INC EAX
00419065  |.  83F8 0E       |CMP EAX,0E
00419068  |.^ 7C F4         \JL SHORT 1FileSaf.0041905E
0041906A  |.  81E1 01000080 AND ECX,80000001
00419070  |.  79 05         JNS SHORT 1FileSaf.00419077
00419072  |.  49            DEC ECX
00419073  |.  83C9 FE       OR ECX,FFFFFFFE
00419076  |.  41            INC ECX
00419077  |>  83F9 01       CMP ECX,1
0041907A  |.  75 03         JNZ SHORT 1FileSaf.0041907F
0041907C  |.  83C2 04       ADD EDX,4
0041907F  |>  B8 0E000000   MOV EAX,0E
00419084  |.  33C9          XOR ECX,ECX
00419086  |>  0FBE3C30      /MOVSX EDI,BYTE PTR DS:[EAX+ESI]         ;  取注册码15-18位ASCII值之和放入ECX
0041908A  |.  03CF          |ADD ECX,EDI
0041908C  |.  40            |INC EAX
0041908D  |.  83F8 12       |CMP EAX,12
00419090  |.^ 7C F4         \JL SHORT 1FileSaf.00419086
00419092  |.  81E1 01000080 AND ECX,80000001
00419098  |.  79 05         JNS SHORT 1FileSaf.0041909F
0041909A  |.  49            DEC ECX
0041909B  |.  83C9 FE       OR ECX,FFFFFFFE
0041909E  |.  41            INC ECX
0041909F  |>  83F9 01       CMP ECX,1
004190A2  |.  75 03         JNZ SHORT 1FileSaf.004190A7
004190A4  |.  83C2 02       ADD EDX,2
004190A7  |>  0FBE46 11     MOVSX EAX,BYTE PTR DS:[ESI+11]           ;  取注册码第18位
004190AB  |.  0FBE4E 0D     MOVSX ECX,BYTE PTR DS:[ESI+D]            ;  取注册码第14位
004190AF  |.  03C1          ADD EAX,ECX                              ;  EAX=EAX+ECX
004190B1  |.  0FBE4E 03     MOVSX ECX,BYTE PTR DS:[ESI+3]            ;  取注册码第4位
004190B5  |.  03C1          ADD EAX,ECX                              ;  EAX=EAX+ECX
004190B7  |.  0FBE4E 08     MOVSX ECX,BYTE PTR DS:[ESI+8]            ;  取注册码第9位
004190BB  |.  03C1          ADD EAX,ECX                              ;  EAX=EAX+ECX
004190BD  |.  25 01000080   AND EAX,80000001
004190C2  |.  79 05         JNS SHORT 1FileSaf.004190C9
004190C4  |.  48            DEC EAX
004190C5  |.  83C8 FE       OR EAX,FFFFFFFE
004190C8  |.  40            INC EAX
004190C9  |>  83F8 01       CMP EAX,1
004190CC  |.  75 01         JNZ SHORT 1FileSaf.004190CF
004190CE  |.  42            INC EDX                                  ;  EDX=EDX+1
004190CF  |>  8A92 F8744A00 MOV DL,BYTE PTR DS:[EDX+4A74F8]          ;  查表2(对比注册码第19位)
004190D5  |.  8A46 12       MOV AL,BYTE PTR DS:[ESI+12]              ;  取注册码第19位
004190D8  |.  3AD0          CMP DL,AL
004190DA  |.  74 08         JE SHORT 1FileSaf.004190E4
004190DC  |.  5F            POP EDI
004190DD  |.  32C0          XOR AL,AL
004190DF  |.  5E            POP ESI
004190E0  |.  83C4 08       ADD ESP,8
004190E3  |.  C3            RETN
004190E4  |>  0FBE7E 13     MOVSX EDI,BYTE PTR DS:[ESI+13]           ;  取注册码第20位
004190E8  |.  83EF 40       SUB EDI,40
004190EB  |.  79 03         JNS SHORT 1FileSaf.004190F0              ;  相当于EDI-40<0就不跳~~
004190ED  |.  83C7 2B       ADD EDI,2B                               ;  EDI=EDI+2B(后面参与计算)
004190F0  |>  8BC6          MOV EAX,ESI
004190F2  |.  53            PUSH EBX
004190F3  |.  6A 20         PUSH 20
004190F5  |.  C64424 17 00  MOV BYTE PTR SS:[ESP+17],0
004190FA  |.  66:8B08       MOV CX,WORD PTR DS:[EAX]
004190FD  |.  66:894C24 10  MOV WORD PTR SS:[ESP+10],CX
00419102  |.  8D4C24 10     LEA ECX,DWORD PTR SS:[ESP+10]
00419106  |.  8A50 02       MOV DL,BYTE PTR DS:[EAX+2]               ;  取注册码第3位
00419109  |.  8B46 09       MOV EAX,DWORD PTR DS:[ESI+9]             ;  取注册码第10-12位(4321)入EAX
0041910C  |.  51            PUSH ECX
0041910D  |.  885424 16     MOV BYTE PTR SS:[ESP+16],DL
00419111  |.  894424 17     MOV DWORD PTR SS:[ESP+17],EAX
00419115  |.  E8 C6FDFFFF   CALL 1FileSaf.00418EE0                   ;  关键算法CALL1,主要是出计算用的中间值1
0041911A  |.  33D2          XOR EDX,EDX                              ;  清空EDX
0041911C  |.  6A 20         PUSH 20                                  ;  关键:出前5位对比用的数值,看下面
0041911E  |.  F7F7          DIV EDI                                  ;  EAX=EAX/EDI(得出后的值用于计算机器码前5位中间值2)
00419120  |.  8B56 04       MOV EDX,DWORD PTR DS:[ESI+4]             ;  取注册码的13~16位(8765)入EDX
00419123  |.  895424 18     MOV DWORD PTR SS:[ESP+18],EDX
00419127  |.  8BD8          MOV EBX,EAX
00419129  |.  8D46 0E       LEA EAX,DWORD PTR DS:[ESI+E]             ;  取注册码后6位
0041912C  |.  66:8B4E 0E    MOV CX,WORD PTR DS:[ESI+E]
00419130  |.  66:894C24 1C  MOV WORD PTR SS:[ESP+1C],CX
00419135  |.  8A50 02       MOV DL,BYTE PTR DS:[EAX+2]
00419138  |.  8D4424 18     LEA EAX,DWORD PTR SS:[ESP+18]
0041913C  |.  50            PUSH EAX
0041913D  |.  885424 22     MOV BYTE PTR SS:[ESP+22],DL
00419141  |.  E8 9AFDFFFF   CALL 1FileSaf.00418EE0
00419146  |.  33D2          XOR EDX,EDX
00419148  |.  53            PUSH EBX
00419149  |.  F7F7          DIV EDI                                  ;  EAX=EAX/EDI  (得出后的值用于计算机器码后5位中间值2)
0041914B  |.  8BF8          MOV EDI,EAX
0041914D  |.  E8 DEFDFFFF   CALL 1FileSaf.00418F30                   ;  关键算法CALL2~~通过计算中间值2出对比机器码前5位的~~~
00419152  |.  8B4C24 30     MOV ECX,DWORD PTR SS:[ESP+30]
00419156  |.  83C4 14       ADD ESP,14
00419159  |.  50            PUSH EAX
0041915A  |.  E8 F4660400   CALL 1FileSaf.0045F853
0041915F  |.  57            PUSH EDI
00419160  |.  E8 CBFDFFFF   CALL 1FileSaf.00418F30                   ;  关键算法CALL2~~通过计算中间值2出对比机器码后5位的~~
00419165  |.  8B4C24 24     MOV ECX,DWORD PTR SS:[ESP+24]
00419169  |.  83C4 04       ADD ESP,4
0041916C  |.  50            PUSH EAX
0041916D  |.  E8 E1660400   CALL 1FileSaf.0045F853
00419172  |.  8A56 08       MOV DL,BYTE PTR DS:[ESI+8]               ;  取注册码第9位放入DL
00419175  |.  8A4E 03       MOV CL,BYTE PTR DS:[ESI+3]               ;  取注册码第4位放入CL
00419178  |.  8A46 0D       MOV AL,BYTE PTR DS:[ESI+D]               ;  取注册码第14位放入AL
0041917B  |.  885424 19     MOV BYTE PTR SS:[ESP+19],DL
0041917F  |.  884C24 18     MOV BYTE PTR SS:[ESP+18],CL
00419183  |.  8A4E 11       MOV CL,BYTE PTR DS:[ESI+11]              ;  取注册码第18位放入CL
00419186  |.  8D5424 18     LEA EDX,DWORD PTR SS:[ESP+18]
0041918A  |.  6A 14         PUSH 14
0041918C  |.  52            PUSH EDX
0041918D  |.  884424 22     MOV BYTE PTR SS:[ESP+22],AL
00419191  |.  884C24 23     MOV BYTE PTR SS:[ESP+23],CL
00419195  |.  E8 46FDFFFF   CALL 1FileSaf.00418EE0                   ;  关键算法CALL1,通过4、9、14、18这4位计算
0041919A  |.  8B4C24 2C     MOV ECX,DWORD PTR SS:[ESP+2C]
0041919E  |.  83C4 08       ADD ESP,8
004191A1  |.  5B            POP EBX
004191A2  |.  8901          MOV DWORD PTR DS:[ECX],EAX
004191A4  |.  5F            POP EDI
004191A5  |.  B0 01         MOV AL,1
004191A7  |.  5E            POP ESI
004191A8  |.  83C4 08       ADD ESP,8
004191AB  \.  C3            RETN

我们接下来看看CALL 00418EE0              
00418EE0  /$  56            PUSH ESI
00418EE1  |.  8B7424 0C     MOV ESI,DWORD PTR SS:[ESP+C]
00418EE5  |.  33C0          XOR EAX,EAX
00418EE7  |.  85F6          TEST ESI,ESI                             ;  取注册码第4、9、14、18位
00418EE9  |.  7E 3D         JLE SHORT 1FileSaf.00418F28              ;  小于或等于就转移
00418EEB  |.  57            PUSH EDI                                 ;  这是第20位注册码计算出来的值
00418EEC  |.  8B7C24 0C     MOV EDI,DWORD PTR SS:[ESP+C]             ;  ABC1234(注册码1~3+10~13位)EFGH678(注册码5~8+15~17位)
00418EF0  |>  8A0F          /MOV CL,BYTE PTR DS:[EDI]                ;  逐位赋值给CL
00418EF2  |.  33D2          |XOR EDX,EDX                             ;  清空EDX值
00418EF4  |>  3A8A F8744A00 |/CMP CL,BYTE PTR DS:[EDX+4A74F8]        ;  用EDX做计数器查表2取字符
00418EFA  |.  74 06         ||JE SHORT 1FileSaf.00418F02             ;  查到字符。跳
00418EFC  |.  42            ||INC EDX                                ;  EDX=EDX+1
00418EFD  |.  83FA 20       ||CMP EDX,20                             ;  看计数是不是超出32个字符了。表中只有32个字符
00418F00  |.^ 72 F2         |\JB SHORT 1FileSaf.00418EF4
00418F02  |>  83FE 05       |CMP ESI,5                               ;  比较ESI的值
00418F05  |.  7C 07         |JL SHORT 1FileSaf.00418F0E              ;  小于。跳,只有到第6次才会跳
00418F07  |.  C1E0 05       |SHL EAX,5                               ;  EAX左移5位相当于*32
00418F0A  |.  03C2          |ADD EAX,EDX                             ;  EAX=EAX+EDX
00418F0C  |.  EB 11         |JMP SHORT 1FileSaf.00418F1F
00418F0E  |>  B9 05000000   |MOV ECX,5                               ;  ECX=5
00418F13  |.  2BCE          |SUB ECX,ESI                             ;  ECX=ECX-ESI
00418F15  |.  D3EA          |SHR EDX,CL                              ;  EDX右移CL位,即右移3位。相当于除以8
00418F17  |.  8BCE          |MOV ECX,ESI                             ;  ECX=ESI
00418F19  |.  D3E0          |SHL EAX,CL                              ;  EAX左移CL位,即左移2位。相当于*4
00418F1B  |.  03D0          |ADD EDX,EAX                             ;  EDX=EDX+EAX
00418F1D  |.  8BC2          |MOV EAX,EDX                             ;  将EDX的值赋给EAX
00418F1F  |>  83EE 05       |SUB ESI,5                               ;  ESI=ESI-5
00418F22  |.  47            |INC EDI                                 ;  EDI=EDI+1
00418F23  |.  85F6          |TEST ESI,ESI
00418F25  |.^ 7F C9         \JG SHORT 1FileSaf.00418EF0              ;  大于0就跳,即计算完成就退出循环
00418F27  |.  5F            POP EDI
00418F28  |>  5E            POP ESI
00418F29  \.  C3            RETN

接下来再看CALL 00418F30                  
00418F30  /$  8B4C24 04     MOV ECX,DWORD PTR SS:[ESP+4]
00418F34  |.  56            PUSH ESI
00418F35  |.  8BC1          MOV EAX,ECX                              ;  将ECX赋给EAX
00418F37  |.  BE 24000000   MOV ESI,24                               ;  将0x24赋给ESI
00418F3C  |.  99            CDQ                                      ;  EDX清零
00418F3D  |.  F7FE          IDIV ESI                                 ;  EAX=EAX/ESI 余数放入EDX
00418F3F  |.  C605 99CB4A00>MOV BYTE PTR DS:[4ACB99],0
00418F46  |.  8A82 D0744A00 MOV AL,BYTE PTR DS:[EDX+4A74D0]          ;  通过EDX的值查码表1取码作为对比码第5位
00418F4C  |.  A2 98CB4A00   MOV BYTE PTR DS:[4ACB98],AL
00418F51  |.  B8 398EE338   MOV EAX,38E38E39
00418F56  |.  F7E9          IMUL ECX                                 ;  EAX*ECX 低位放EAX  高位放EDX
00418F58  |.  C1FA 03       SAR EDX,3                                ;  EDX右移3位,相当于/8
00418F5B  |.  8BCA          MOV ECX,EDX                              ;  EDX放入ECX
00418F5D  |.  C1E9 1F       SHR ECX,1F                               ;  ECX右移1F位,相当于/0x80000000
00418F60  |.  03D1          ADD EDX,ECX                              ;  EDX=EDX+ECX
00418F62  |.  8BCA          MOV ECX,EDX                              ;  将EDX的值赋给ECX
00418F64  |.  8BC1          MOV EAX,ECX                              ;  将ECX的值赋给EAX
00418F66  |.  99            CDQ                                      ;  EDX清零
00418F67  |.  F7FE          IDIV ESI                                 ;  EAX=EAX/24 余数放入EDX
00418F69  |.  B8 398EE338   MOV EAX,38E38E39
00418F6E  |.  8A92 D0744A00 MOV DL,BYTE PTR DS:[EDX+4A74D0]          ;  通过EDX的值查码表1取码作为对比码第4位
00418F74  |.  8815 97CB4A00 MOV BYTE PTR DS:[4ACB97],DL
00418F7A  |.  F7E9          IMUL ECX                                 ;  EAX*ECX 低位放EAX  高位放EDX
00418F7C  |.  C1FA 03       SAR EDX,3
00418F7F  |.  8BC2          MOV EAX,EDX                              ;  EAX=EDX
00418F81  |.  C1E8 1F       SHR EAX,1F
00418F84  |.  03D0          ADD EDX,EAX                              ;  EDX=EDX+EAX
00418F86  |.  8BCA          MOV ECX,EDX                              ;  ECX=EDX
00418F88  |.  8BC1          MOV EAX,ECX                              ;  EAX=ECX
00418F8A  |.  99            CDQ                                      ;  EDX清零
00418F8B  |.  F7FE          IDIV ESI                                 ;  EAX=EAX/24 余数放入EDX
00418F8D  |.  B8 398EE338   MOV EAX,38E38E39
00418F92  |.  8A92 D0744A00 MOV DL,BYTE PTR DS:[EDX+4A74D0]          ;  通过EDX的值查码表1取码作为对比码第3位
00418F98  |.  8815 96CB4A00 MOV BYTE PTR DS:[4ACB96],DL
00418F9E  |.  F7E9          IMUL ECX                                 ;  EAX*ECX 低位放EAX  高位放EDX
00418FA0  |.  C1FA 03       SAR EDX,3
00418FA3  |.  8BC2          MOV EAX,EDX
00418FA5  |.  C1E8 1F       SHR EAX,1F
00418FA8  |.  03D0          ADD EDX,EAX
00418FAA  |.  8BCA          MOV ECX,EDX
00418FAC  |.  8BC1          MOV EAX,ECX
00418FAE  |.  99            CDQ                                      ;  EDX清零
00418FAF  |.  F7FE          IDIV ESI                                 ;  EAX=EAX/24 余数放入EDX
00418FB1  |.  B8 398EE338   MOV EAX,38E38E39
00418FB6  |.  8A92 D0744A00 MOV DL,BYTE PTR DS:[EDX+4A74D0]          ;  通过EDX的值查码表1取码作为对比码第2位
00418FBC  |.  8815 95CB4A00 MOV BYTE PTR DS:[4ACB95],DL
00418FC2  |.  F7E9          IMUL ECX                                 ;  EAX*ECX 低位放EAX  高位放EDX
00418FC4  |.  8BC2          MOV EAX,EDX                              ;  将EDX的值赋给EAX
00418FC6  |.  C1F8 03       SAR EAX,3                                ;  EAX右移3位
00418FC9  |.  8BC8          MOV ECX,EAX                              ;  将EAX的值赋给ECX
00418FCB  |.  C1E9 1F       SHR ECX,1F                               ;  ECX右移1F位
00418FCE  |.  03C1          ADD EAX,ECX                              ;  EAX=EAX+ECX
00418FD0  |.  8BCE          MOV ECX,ESI                              ;  将ESI的值赋给ECX
00418FD2  |.  99            CDQ                                      ;  EDX清零
00418FD3  |.  F7F9          IDIV ECX                                 ;  EAX=EAX/ECX 余数放入EDX
00418FD5  |.  B8 94CB4A00   MOV EAX,1FileSaf.004ACB94                ;  ASCII "BVN7X"
00418FDA  |.  5E            POP ESI
00418FDB  |.  8A92 D0744A00 MOV DL,BYTE PTR DS:[EDX+4A74D0]          ;  通过EDX的值查码表1取码作为对比码第1位
00418FE1  |.  8815 94CB4A00 MOV BYTE PTR DS:[4ACB94],DL
00418FE7  \.  C3            RETN

OK。终于把算法分析完成了。
给一组注册码。如果不幸中了你的机器。可别怪我啊。。HOHO。开个玩笑
机器码:03HYGBVN7X
注册码:ABCAEFGHD1234Q678AV1

PS:这个软件在注册码的设计上下了很大的功夫啊。很可惜,在我的机器上还是未能通过。因为偶的机器码是WD-WMAM9442732627326,但“-”

作者却未考虑进去。看来只能爆破了。

关于使用次数:
1、注册表中   HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\IE4\Setup 
KEYFSTIMES DWORD值  其中的数据为可用次数~
2、C:\WINDOWS\system32\keyfs.sys
此文件中的数值为可用次数~~

要清楚的话二个地方都必须清除。


------------------------------------------------------------------------
【破解总结】
这个软件是一好友要求帮忙的。不过偶到现在还没有帮成忙啊。终于完成算法分析了。注册机还没来的及写。
现在总结一下吧。稍候写注册机去。

【算法总结】
取机器码前5位=1、2、3、10、11、12、13位经过CALL1及CALL2计算后查表得到的值
取机器码后5位=5、6、7、8、15、16、17位经过CALL1及CALL2计算后查表得到的值
注册码第4、9、14、18位经CALL1计算后的值必须为E00
第1-4位、5-9位、10-14位、15-18位经过计算后查表2的值须与第19位相同
第20位用于计算前5位、后5位对比值。
啊~~~~
你们看了之后不要说烦啊~~
------------------------------------------------------------------------
【版权声明】本文纯属技术交流, 转载请注明作者信息并保持文章的完整, 谢谢!