【文章标题】: 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