【文章标题】: Hide Files and Folders V2.1 算法分析 
【文章作者】: [DCG]PeerLessSoul
【作者邮箱】: PeerLessSoul@Gmail.com
【作者主页】: http://114989149.qzone.qq.com
【作者QQ号】: 114989149
【软件名称】: Hide Files and Folders V2.1 
【软件大小】: 737K
【下载地址】: www.download.com
【保护方式】: 注册码验证
【使用工具】: Peid,Ollyice,dede
【作者声明】: 本人小菜,请大侠们不要见笑……
-------------------------------------------------------------------------------------------------
Peid开始查壳……Borland Delphi 6.0 - 7.0 直接进入软件观看注册错误信息提示……窗口提示错误!
使用 dede载入程序分析……参看过程……找到UEnterReg单元,然后看右边有个按钮单击事件……双击这个事件……
然后记录下开始的地址段!我这里是004A10F1,dede可以关了~进入ollyice,载入主程序文件然后,ctrl+g 输入刚才找到哪个地址!然后下断……F9运行程序……点击注册,程序被断下,但是我们还没有输入任何伪码!被断在这里!
-------------------------------------------------------------------------------------------------
004A10F0  /$  55            push    ebp                          ;我们就被断在这里……往下看!
004A10F1  |.  8BEC          mov     ebp, esp
004A10F3  |.  6A 00         push    0
004A10F5  |.  53            push    ebx
004A10F6  |.  56            push    esi
004A10F7  |.  8BF2          mov     esi, edx
004A10F9  |.  8BD8          mov     ebx, eax
004A10FB  |.  33C0          xor     eax, eax
004A10FD  |.  55            push    ebp
004A10FE  |.  68 6F114A00   push    004A116F
004A1103  |.  64:FF30       push    dword ptr fs:[eax]
004A1106  |.  64:8920       mov     fs:[eax], esp
004A1109  |.  8D45 FC       lea     eax, [ebp-4]
004A110C  |.  8BCE          mov     ecx, esi
004A110E  |.  8BD3          mov     edx, ebx
004A1110  |.  E8 C3FEFFFF   call    004A0FD8
004A1115  |.  84C0          test    al, al
004A1117  |.  74 40         je      short 004A1159
004A1119  |.  8B45 FC       mov     eax, [ebp-4]
004A111C  |.  E8 0BF5FFFF   call    004A062C                    ;关键CAll,我们下断在这里!
004A1121  |.  84C0          test    al, al
004A1123  |.  74 1F         je      short 004A1144              ;关键je
004A1125  |.  8B45 FC       mov     eax, [ebp-4]
004A1128  |.  E8 6BF8FFFF   call    004A0998
004A112D  |.  6A 00         push    0                           ; /Arg1 = 00000000
004A112F  |.  66:8B0D 7C114>mov     cx, [4A117C]                ; |
004A1136  |.  B2 02         mov     dl, 2                       ; |
004A1138  |.  B8 88114A00   mov     eax, 004A1188               ; |ASCII "The registration code is correct.",CR," Thank you."
004A113D  |.  E8 8E10F9FF   call    004321D0                    ; \HFF.004321D0
004A1142  |.  EB 15         jmp     short 004A1159
004A1144  |>  6A 00         push    0                           ; /Arg1 = 00000000
004A1146  |.  66:8B0D 7C114>mov     cx, [4A117C]                ; |
004A114D  |.  B2 01         mov     dl, 1                       ; |
004A114F  |.  B8 C0114A00   mov     eax, 004A11C0               ; |ASCII "The registration code is incorrect."
004A1154  |.  E8 7710F9FF   call    004321D0                    ; \HFF.004321D0
004A1159  |>  33C0          xor     eax, eax
004A115B  |.  5A            pop     edx
004A115C  |.  59            pop     ecx
004A115D  |.  59            pop     ecx
004A115E  |.  64:8910       mov     fs:[eax], edx
004A1161  |.  68 76114A00   push    004A1176
004A1166  |>  8D45 FC       lea     eax, [ebp-4]
004A1169  |.  E8 2A35F6FF   call    00404698
004A116E  \.  C3            retn
----------------------------------------------------------------------------------------------------------------------------
发现我们被断早了~往下看……004A1138 有注册成功的字样……上面又有个je,应该是关键跳。我们就想让哪个Je不跳我们就能注册成功……
那就看这个je是如何实现的……往上走……有个Call这个就是关键Call!取消全部断点,在004A111C下断……然后F7进入……
----------------------------------------------------------------------------------------------------------------------------
004A062C  /$  55            push    ebp                         ;我们到这里……一下要慢慢走一下!注意观察Ollyice各个窗口的变化!
004A062D  |.  8BEC          mov     ebp, esp
004A062F  |.  83C4 F0       add     esp, -10
004A0632  |.  53            push    ebx
004A0633  |.  56            push    esi
004A0634  |.  57            push    edi
004A0635  |.  33D2          xor     edx, edx
004A0637  |.  8955 F4       mov     [ebp-C], edx
004A063A  |.  8955 F0       mov     [ebp-10], edx
004A063D  |.  8945 FC       mov     [ebp-4], eax
004A0640  |.  8B45 FC       mov     eax, [ebp-4]
004A0643  |.  E8 0045F6FF   call    00404B48
004A0648  |.  33C0          xor     eax, eax
004A064A  |.  55            push    ebp
004A064B  |.  68 35074A00   push    004A0735
004A0650  |.  64:FF30       push    dword ptr fs:[eax]
004A0653  |.  64:8920       mov     fs:[eax], esp
004A0656  |.  33DB          xor     ebx, ebx
004A0658  |.  E8 87F8FFFF   call    0049FEE4
004A065D  |.  8B45 FC       mov     eax, [ebp-4]
004A0660  |.  E8 F342F6FF   call    00404958
004A0665  |.  83F8 10       cmp     eax, 10                     ;  注册码长度同16比较!不同就失败
004A0668  |.  0F85 A4000000 jnz     004A0712
004A066E  |.  8D45 F4       lea     eax, [ebp-C]
004A0671  |.  50            push    eax
004A0672  |.  B9 08000000   mov     ecx, 8
004A0677  |.  BA 01000000   mov     edx, 1
004A067C  |.  8B45 FC       mov     eax, [ebp-4]
004A067F  |.  E8 3445F6FF   call    00404BB8
004A0684  |.  8D45 F0       lea     eax, [ebp-10]
004A0687  |.  50            push    eax
004A0688  |.  B9 08000000   mov     ecx, 8
004A068D  |.  BA 09000000   mov     edx, 9
004A0692  |.  8B45 FC       mov     eax, [ebp-4]
004A0695  |.  E8 1E45F6FF   call    00404BB8
004A069A  |.  8D55 F8       lea     edx, [ebp-8]
004A069D  |.  8B45 F4       mov     eax, [ebp-C]
004A06A0  |.  E8 BB2BF6FF   call    00403260
004A06A5  |.  837D F8 00    cmp     dword ptr [ebp-8], 0
004A06A9  |.  75 67         jnz     short 004A0712           ;004A06A0哪个Call计算前十位是否有字母,有这里jnz实现,注册失败!
004A06AB  |.  8D55 F8       lea     edx, [ebp-8]
004A06AE  |.  8B45 F0       mov     eax, [ebp-10]
004A06B1  |.  E8 AA2BF6FF   call    00403260                     
004A06B6  |.  837D F8 00    cmp     dword ptr [ebp-8], 0
004A06BA  |.  75 56         jnz     short 004A0712           ;004A06B1哪个Call计算后六位是否有字母,有这里jnz实现,注册失败!
004A06BC  |.  BE 30000000   mov     esi, 30
004A06C1  |>  33C0          /xor     eax, eax
004A06C3  |.  8945 F8       |mov     [ebp-8], eax
004A06C6  |.  8B45 FC       |mov     eax, [ebp-4]
004A06C9  |.  E8 8A42F6FF   |call    00404958
004A06CE  |.  85C0          |test    eax, eax
004A06D0  |.  7E 17         |jle     short 004A06E9
004A06D2  |.  BA 01000000   |mov     edx, 1
004A06D7  |>  8BCE          |/mov     ecx, esi
004A06D9  |.  8B7D FC       ||mov     edi, [ebp-4]
004A06DC  |.  3A4C17 FF     ||cmp     cl, [edi+edx-1]
004A06E0  |.  75 03         ||jnz     short 004A06E5
004A06E2  |.  FF45 F8       ||inc     dword ptr [ebp-8]
004A06E5  |>  42            ||inc     edx
004A06E6  |.  48            ||dec     eax
004A06E7  |.^ 75 EE         |\jnz     short 004A06D7
004A06E9  |>  837D F8 05    |cmp     dword ptr [ebp-8], 5
004A06ED  |.  7E 09         |jle     short 004A06F8
004A06EF  |.  C745 F8 FFFFF>|mov     dword ptr [ebp-8], -1
004A06F6  |.  EB 06         |jmp     short 004A06FE
004A06F8  |>  46            |inc     esi
004A06F9  |.  83FE 3A       |cmp     esi, 3A
004A06FC  |.^ 75 C3         \jnz     short 004A06C1
004A06FE  |>  837D F8 00    cmp     dword ptr [ebp-8], 0
004A0702  |.  7C 0E         jl      short 004A0712
004A0704  |.  8B45 FC       mov     eax, [ebp-4]
004A0707  |.  E8 B0FDFFFF   call    004A04BC                    ;  这个Call也是比较可疑我们进去……
004A070C  |.  84C0          test    al, al
004A070E  |.  74 02         je      short 004A0712              
004A0710  |.  B3 01         mov     bl, 1
004A0712  |>  33C0          xor     eax, eax
004A0714  |.  5A            pop     edx
004A0715  |.  59            pop     ecx
004A0716  |.  59            pop     ecx
004A0717  |.  64:8910       mov     fs:[eax], edx
004A071A  |.  68 3C074A00   push    004A073C
004A071F  |>  8D45 F0       lea     eax, [ebp-10]
004A0722  |.  BA 02000000   mov     edx, 2
004A0727  |.  E8 903FF6FF   call    004046BC
004A072C  |.  8D45 FC       lea     eax, [ebp-4]
004A072F  |.  E8 643FF6FF   call    00404698
004A0734  \.  C3            retn

-----------------------------------------------------------------------------------------------------------------------------
我们进入004A04BC 这个Call,到这里!f8慢慢走一遍……
004A04BC  /$  55            push    ebp
004A04BD  |.  8BEC          mov     ebp, esp
004A04BF  |.  B9 06000000   mov     ecx, 6
004A04C4  |>  6A 00         /push    0
004A04C6  |.  6A 00         |push    0
004A04C8  |.  49            |dec     ecx
004A04C9  |.^ 75 F9         \jnz     short 004A04C4
004A04CB  |.  53            push    ebx
004A04CC  |.  56            push    esi
004A04CD  |.  8BD8          mov     ebx, eax
004A04CF  |.  33C0          xor     eax, eax
004A04D1  |.  55            push    ebp
004A04D2  |.  68 1A064A00   push    004A061A
004A04D7  |.  64:FF30       push    dword ptr fs:[eax]
004A04DA  |.  64:8920       mov     fs:[eax], esp
004A04DD  |.  8D45 FC       lea     eax, [ebp-4]
004A04E0  |.  8A13          mov     dl, [ebx]
004A04E2  |.  E8 9943F6FF   call    00404880
004A04E7  |.  8B45 FC       mov     eax, [ebp-4]
004A04EA  |.  E8 BD89F6FF   call    00408EAC
004A04EF  |.  8BF0          mov     esi, eax
004A04F1  |.  8D45 F8       lea     eax, [ebp-8]
004A04F4  |.  8A53 01       mov     dl, [ebx+1]          ;  取出第2位
004A04F7  |.  E8 8443F6FF   call    00404880
004A04FC  |.  8B45 F8       mov     eax, [ebp-8]
004A04FF  |.  E8 A889F6FF   call    00408EAC
004A0504  |.  03F0          add     esi, eax             ;  第1位+第2位
004A0506  |.  8D45 F4       lea     eax, [ebp-C]
004A0509  |.  8A53 02       mov     dl, [ebx+2]           ;取出第3位
004A050C  |.  E8 6F43F6FF   call    00404880
004A0511  |.  8B45 F4       mov     eax, [ebp-C]
004A0514  |.  E8 9389F6FF   call    00408EAC
004A0519  |.  03F0          add     esi, eax             ;  上面的再加上第3位
004A051B  |.  8D45 F0       lea     eax, [ebp-10]
004A051E  |.  8A53 03       mov     dl, [ebx+3]          ;取出第4位
004A0521  |.  E8 5A43F6FF   call    00404880
004A0526  |.  8B45 F0       mov     eax, [ebp-10]
004A0529  |.  E8 7E89F6FF   call    00408EAC
004A052E  |.  03F0          add     esi, eax             ;  上面+第4位
004A0530  |.  A1 9C164B00   mov     eax, [4B169C]
004A0535  |.  3B30          cmp     esi, [eax]           ;  上面结果同16比较
004A0537      0F85 BA000000 jnz     004A05F7             ;  不等于22就跳走!注册失败!
004A053D  |.  8D45 EC       lea     eax, [ebp-14]
004A0540  |.  8A53 04       mov     dl, [ebx+4]          ;  取第5位
004A0543  |.  E8 3843F6FF   call    00404880
004A0548  |.  8B45 EC       mov     eax, [ebp-14]
004A054B  |.  E8 5C89F6FF   call    00408EAC
004A0550  |.  8BF0          mov     esi, eax
004A0552  |.  8D45 E8       lea     eax, [ebp-18]
004A0555  |.  8A53 07       mov     dl, [ebx+7]          ;  取第8位
004A0558  |.  E8 2343F6FF   call    00404880
004A055D  |.  8B45 E8       mov     eax, [ebp-18]  
004A0560  |.  E8 4789F6FF   call    00408EAC
004A0565  |.  03F0          add     esi, eax             ; 第5位+第8位
004A0567  |.  8D45 E4       lea     eax, [ebp-1C]
004A056A  |.  8A53 0A       mov     dl, [ebx+A]          ;  取第11位
004A056D  |.  E8 0E43F6FF   call    00404880
004A0572  |.  8B45 E4       mov     eax, [ebp-1C]
004A0575  |.  E8 3289F6FF   call    00408EAC
004A057A  |.  03F0          add     esi, eax             ;结果+第11位上值
004A057C  |.  8D45 E0       lea     eax, [ebp-20]
004A057F  |.  8A53 0D       mov     dl, [ebx+D]          ;  取第14位
004A0582  |.  E8 F942F6FF   call    00404880
004A0587  |.  8B45 E0       mov     eax, [ebp-20]
004A058A  |.  E8 1D89F6FF   call    00408EAC
004A058F  |.  03F0          add     esi, eax             ;再加上第14位上的值
004A0591  |.  A1 D4164B00   mov     eax, [4B16D4]
004A0596  |.  3B30          cmp     esi, [eax]           ;  这里第5,8,11,14位相加的最终结果……同1E比较!
004A0598      75 5D         jnz     short 004A05F7       ;类似前面如果结果不是1e就跳走……注册就失败了……
004A059A  |.  8D45 DC       lea     eax, [ebp-24]
004A059D  |.  8A53 06       mov     dl, [ebx+6]          ;取第7位
004A05A0  |.  E8 DB42F6FF   call    00404880
004A05A5  |.  8B45 DC       mov     eax, [ebp-24]
004A05A8  |.  E8 FF88F6FF   call    00408EAC
004A05AD  |.  8BF0          mov     esi, eax
004A05AF  |.  8D45 D8       lea     eax, [ebp-28]
004A05B2  |.  8A53 09       mov     dl, [ebx+9]          ;取第10位
004A05B5  |.  E8 C642F6FF   call    00404880
004A05BA  |.  8B45 D8       mov     eax, [ebp-28]
004A05BD  |.  E8 EA88F6FF   call    00408EAC
004A05C2  |.  03F0          add     esi, eax             ;第7位+第10位的
004A05C4  |.  8D45 D4       lea     eax, [ebp-2C]
004A05C7  |.  8A53 0C       mov     dl, [ebx+C]          ;取第13位
004A05CA  |.  E8 B142F6FF   call    00404880
004A05CF  |.  8B45 D4       mov     eax, [ebp-2C]
004A05D2  |.  E8 D588F6FF   call    00408EAC             ;上面结果再加上第13位上的值
004A05D7  |.  03F0          add     esi, eax
004A05D9  |.  8D45 D0       lea     eax, [ebp-30]
004A05DC  |.  8A53 0F       mov     dl, [ebx+F]           ;取第16位
004A05DF  |.  E8 9C42F6FF   call    00404880
004A05E4  |.  8B45 D0       mov     eax, [ebp-30]
004A05E7  |.  E8 C088F6FF   call    00408EAC
004A05EC  |.  03F0          add     esi, eax              ;上面结果再加上第16位上的值
004A05EE  |.  A1 B4134B00   mov     eax, [4B13B4]
004A05F3  |.  3B30          cmp     esi, [eax]           ;  这里第7,10,13,16位上的值总共加起来同8比较
004A05F5  |.  74 04         je      short 004A05FB       ;类似前面如果结果不是8就跳走……注册就失败了……
004A05F7  |>  33C0          xor     eax, eax
004A05F9  |.  EB 02         jmp     short 004A05FD
004A05FB  |>  B0 01         mov     al, 1
004A05FD  |>  8BD8          mov     ebx, eax
004A05FF  |.  33C0          xor     eax, eax
004A0601  |.  5A            pop     edx
004A0602  |.  59            pop     ecx
004A0603  |.  59            pop     ecx
004A0604  |.  64:8910       mov     fs:[eax], edx
004A0607  |.  68 21064A00   push    004A0621
004A060C  |>  8D45 D0       lea     eax, [ebp-30]
004A060F  |.  BA 0C000000   mov     edx, 0C
004A0614  |.  E8 A340F6FF   call    004046BC
004A0619  \.  C3            retn
----------------------------------------------------------------------------------------------------------------------------
到这里应该算完了……感觉很讲不清楚……要自己走几遍……才能理解
我们总结一下算法!
1。注册码必须是16位长!不能包含任何非数字字符!
2。我们帮注册码按顺序写成X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,X12,X13,X14,X15,X16
那么就要满足这样的条件
22=X1+X2+X3+X4
30=X5+X8+X11+X14
8=X7+X10+X13+X16