最近自己的系统总是有些小问题,因为自己学习、研究软件程序逆向的需要,要定期格式化系统。这次犯懒了,就到网上谷歌一下系统优化方面的软件,嘿!一大堆!就用这个吧!“系统优化大师V2007”,可运行使用却需要注册,不注册一些功能会被禁止使用。这个问题对于自己好像不是难事,立刻拿出工具,三下五除二找到注册码,成功注册!顺利的完成了系统的清理、优化工作。等手上的工作都结束后,有点时间,又想起了那个系统优化大师V2007,忍不住想探究一下程序的注册算法是如何进行的,于是就有了下面的算法分析。
软件简介
系统优化大师被评为2005年中国10个最优秀共享软件之一。软件全方位、高效、安全地提高你的系统性能,使用简单,傻瓜式操作,可能迅速达到系统优化目的。包括桌面优化、菜单优化、网络优化、软件优化、系统优化以及禁用设置、选择设置、更改设置等一系列个性化优化及设置选项。它还可以进行高速的注册表清理及高速的硬盘垃圾文件清理,清理全面、安全、不影响任何运行性能。
原程序本身加的是ASP2.12压缩壳,黑防多次谈过此类压缩壳的脱法,这里就不介绍了,用ESP定律或PEiD插件就可以完成,比较简单。该软件使用Borland Delphi 6.0-7.0程序编写。
分析过程
用OD载入脱壳后的程序,利用OD的插件“超级字符串查找”,搜索关键字符“注册成功”,很容易找到这些关键字符,程序作者在程序中对字符没做任何处理,如图1所示。
图1
双击“注册成功”这行代码,就会来到反汇编窗口,一直向上找到段首,下好 F2断点。然后F9运行出注册界面,输入确认码 987,假码xuhw。点注册后,程序就会断下来,停在下面的代码处。
view plainprint?
0054E2C8 /. 55 push ebp ;段首 F2
0054E2C9 |. 8BEC mov ebp, esp
0054E2CB |. B9 18000000 mov ecx, 18
0054E2D0 |> 6A 00 /push 0
0054E2D2 |. 6A 00 |push 0
0054E2D4 |. 49 |dec ecx
0054E2D5 |.^ 75 F9 \jnz short 0054E2D0
0054E2D7 |. 51 push ecx
0054E2D8 |. 53 push ebx
0054E2D9 |. 56 push esi
0054E2DA |. 57 push edi
0054E2DB |. 8BD8 mov ebx, eax
0054E2DD |. 33C0 xor eax, eax
0054E2DF |. 55 push ebp
0054E2E0 |. 68 06E65400 push 0054E606
0054E2E5 |. 64:FF30 push dword ptr fs:[eax]
0054E2E8 |. 64:8920 mov dword ptr fs:[eax], esp
0054E2EB |. B2 01 mov dl, 1
0054E2ED |. A1 08634800 mov eax, dword ptr [486308]
0054E2F2 |. E8 7D81F3FF call 00486474
0054E2F7 |. 8B15 C8045E00 mov edx, dword ptr [5E04C8] ; yhds_exe.005E2E30
0054E2FD |. 8902 mov dword ptr [edx], eax
0054E2FF |. A1 C8045E00 mov eax, dword ptr [5E04C8]
0054E304 |. 8B00 mov eax, dword ptr [eax]
0054E306 |. BA 02000080 mov edx, 80000002
0054E30B |. E8 4082F3FF call 00486550
0054E310 |. A1 C8045E00 mov eax, dword ptr [5E04C8]
0054E315 |. 8B00 mov eax, dword ptr [eax]
0054E317 |. B1 01 mov cl, 1
0054E319 |. BA 20E65400 mov edx, 0054E620
;ASCII "SOFTWARE\Microsoft\Yhds"
0054E31E |. E8 7183F3FF call 00486694
0054E323 |. 68 80000000 push 80 ; /BufSize = 80 (128.)
0054E328 |. 8D85 7BFFFFFF lea eax, dword ptr [ebp-85]; |
0054E32E |. 50 push eax ; |Buffer
0054E32F |. E8 2893EBFF call ; \GetSystemDirectoryA
0054E334 |. 8D45 FC lea eax, dword ptr [ebp-4]
0054E337 |. 8D95 7BFFFFFF lea edx, dword ptr [ebp-85]
0054E33D |. B9 81000000 mov ecx, 81
0054E342 |. E8 016AEBFF call 00404D48
0054E347 |. 8D95 74FFFFFF lea edx, dword ptr [ebp-8C]
0054E34D |. 8B83 FC020000 mov eax, dword ptr [ebx+2FC]
0054E353 |. E8 0C1CF0FF call 0044FF64 ;确认码 987
0054E358 |. 83BD 74FFFFFF>cmp dword ptr [ebp-8C], 0 ;是否输入确认码
0054E35F |. 74 1A je short 0054E37B ;空就跳出
0054E361 |. 8D95 70FFFFFF lea edx, dword ptr [ebp-90]
0054E367 |. 8B83 04030000 mov eax, dword ptr [ebx+304]
0054E36D |. E8 F21BF0FF call 0044FF64 ;注册码 xuhw
0054E372 |. 83BD 70FFFFFF>cmp dword ptr [ebp-90], 0 ;是否输入注册码
0054E379 |. 75 0F jnz short 0054E38A
0054E37B |> B8 40E65400 mov eax, 0054E640
0054E380 |. E8 33A8EFFF call 00448BB8
0054E385 |. E9 DF010000 jmp 0054E569
0054E38A |> 8D95 68FFFFFF lea edx, dword ptr [ebp-98]
0054E390 |. 8B83 04030000 mov eax, dword ptr [ebx+304]
0054E396 |. E8 C91BF0FF call 0044FF64
0054E39B |. 8B85 68FFFFFF mov eax, dword ptr [ebp-98] ;假码放入EAX
0054E3A1 |. 8D95 6CFFFFFF lea edx, dword ptr [ebp-94]
0054E3A7 |. E8 5CB4EBFF call 00409808
0054E3AC |. 8B85 6CFFFFFF mov eax, dword ptr [ebp-94] ;假码放入EAX
0054E3B2 |. 50 push eax
0054E3B3 |. 8D95 5CFFFFFF lea edx, dword ptr [ebp-A4]
0054E3B9 |. 8B83 FC020000 mov eax, dword ptr [ebx+2FC]
0054E3BF |. E8 A01BF0FF call 0044FF64
0054E3C4 |. 8B85 5CFFFFFF mov eax, dword ptr [ebp-A4] ;确认码放入EAX
0054E3CA |. E8 35B7EBFF call 00409B04
;对确认码逐位计算,得到一个值 A F7进
0054E3CF |. B9 48000000 mov ecx, 48 ;除数为48
0054E3D4 |. 99 cdq
0054E3D5 |. F7F9 idiv ecx ;A/48
0054E3D7 |. 8BC2 mov eax, edx ;余数放入EAX
0054E3D9 |. 8D95 60FFFFFF lea edx, dword ptr [ebp-A0]
0054E3DF |. E8 40B6EBFF call 00409A24
0054E3E4 |. 8D85 60FFFFFF lea eax, dword ptr [ebp-A0]
0054E3EA |. 50 push eax
0054E3EB |. 8D95 50FFFFFF lea edx, dword ptr [ebp-B0]
0054E3F1 |. 8B83 FC020000 mov eax, dword ptr [ebx+2FC]
0054E3F7 |. E8 681BF0FF call 0044FF64
0054E3FC |. 8B85 50FFFFFF mov eax, dword ptr [ebp-B0] ;确认码放入EAX
0054E402 |. E8 FDB6EBFF call 00409B04
0054E407 |. 8D95 54FFFFFF lea edx, dword ptr [ebp-AC]
0054E40D |. E8 16FCFFFF call 0054E028 ;根据A计算
0054E412 |. 8B85 54FFFFFF mov eax, dword ptr [ebp-AC] ;特征码T
0054E418 |. E8 E7B6EBFF call 00409B04
0054E41D |. 8D95 58FFFFFF lea edx, dword ptr [ebp-A8] ; T转换成16进制
0054E423 |. E8 E0FCFFFF call 0054E108 ;对T计算
0054E428 |. 8B95 58FFFFFF mov edx, dword ptr [ebp-A8] ;计算出真码
0054E42E |. 58 pop eax
0054E42F |. E8 6C69EBFF call 00404DA0
0054E434 |. 8B85 60FFFFFF mov eax, dword ptr [ebp-A0] ;计算结果放入EAX
0054E43A |. 8D95 64FFFFFF lea edx, dword ptr [ebp-9C]
0054E440 |. E8 C3B3EBFF call 00409808
0054E445 |. 8B95 64FFFFFF mov edx, dword ptr [ebp-9C] ;计算结果放入EAX
0054E44B |. 58 pop eax ;假码
0054E44C |. E8 8B6AEBFF call 00404EDC ;真假码比较CALL
0054E451 |. 0F85 EE000000 jnz 0054E545 ;关键跳
0054E457 |. 8D95 4CFFFFFF lea edx, dword ptr [ebp-B4]
0054E45D |. 8B83 04030000 mov eax, dword ptr [ebx+304]
0054E463 |. E8 FC1AF0FF call 0044FF64
0054E468 |. 8B8D 4CFFFFFF mov ecx, dword ptr [ebp-B4]
0054E46E |. A1 C8045E00 mov eax, dword ptr [5E04C8]
0054E473 |. 8B00 mov eax, dword ptr [eax]
0054E475 |. BA 60E65400 mov edx, 0054E660 ;ASCII "yhdsger"
0054E47A |. E8 4187F3FF call 00486BC0
0054E47F |. 8D85 48FFFFFF lea eax, dword ptr [ebp-B8]
0054E485 |. B9 70E65400 mov ecx, 0054E670 ;ASCII "\5yten.sys"
0054E48A |. 8B55 FC mov edx, dword ptr [ebp-4]
0054E48D |. E8 5269EBFF call 00404DE4
0054E492 |. 8B8D 48FFFFFF mov ecx, dword ptr [ebp-B8]
0054E498 |. B2 01 mov dl, 1
0054E49A |. A1 B8534800 mov eax, dword ptr [4853B8]
0054E49F |. E8 C46FF3FF call 00485468
0054E4A4 |. 8BF0 mov esi, eax
0054E4A6 |. 8D95 44FFFFFF lea edx, dword ptr [ebp-BC]
0054E4AC |. 8B83 FC020000 mov eax, dword ptr [ebx+2FC]
0054E4B2 |. E8 AD1AF0FF call 0044FF64
0054E4B7 |. 8B85 44FFFFFF mov eax, dword ptr [ebp-BC]
0054E4BD |. 50 push eax
0054E4BE |. B9 84E65400 mov ecx, 0054E684 ;ASCII "dd"
0054E4C3 |. BA 90E65400 mov edx, 0054E690 ;ASCII "syssetup"
0054E4C8 |. 8BC6 mov eax, esi
0054E4CA |. 8B38 mov edi, dword ptr [eax]
0054E4CC |. FF57 04 call dword ptr [edi+4]
0054E4CF |. 8D95 40FFFFFF lea edx, dword ptr [ebp-C0]
0054E4D5 |. 8B83 04030000 mov eax, dword ptr [ebx+304]
0054E4DB |. E8 841AF0FF call 0044FF64
0054E4E0 |. 8B85 40FFFFFF mov eax, dword ptr [ebp-C0]
0054E4E6 |. 50 push eax
0054E4E7 |. B9 A4E65400 mov ecx, 0054E6A4 ;ASCII "zc"
0054E4EC |. BA 90E65400 mov edx, 0054E690 ;ASCII "syssetup"
0054E4F1 |. 8BC6 mov eax, esi
0054E4F3 |. 8B30 mov esi, dword ptr [eax]
0054E4F5 |. FF56 04 call dword ptr [esi+4]
0054E4F8 |. 8D85 3CFFFFFF lea eax, dword ptr [ebp-C4]
0054E4FE |. B9 70E65400 mov ecx, 0054E670 ;ASCII "\5yten.sys"
0054E503 |. 8B55 FC mov edx, dword ptr [ebp-4]
0054E506 |. E8 D968EBFF call 00404DE4
0054E50B |. 8B85 3CFFFFFF mov eax, dword ptr [ebp-C4]
0054E511 |. BA 02000000 mov edx, 2
0054E516 |. E8 39B9EBFF call 00409E54
0054E51B |. B8 B0E65400 mov eax, 0054E6B0 ;软件注册成功!谢谢注册!
0054E520 |. E8 93A6EFFF call 00448BB8
0054E525 |. A1 C8035E00 mov eax, dword ptr [5E03C8]
0054E52A |. 8B00 mov eax, dword ptr [eax]
0054E52C |. 8B80 0C050000 mov eax, dword ptr [eax+50C]
0054E532 |. BA D4E65400 mov edx, 0054E6D4 ;软件已注册
0054E537 |. E8 581AF0FF call 0044FF94
0054E53C |. 8BC3 mov eax, ebx
0054E53E |. E8 8DF3F1FF call 0046D8D0
0054E543 |. EB 24 jmp short 0054E569
0054E545 |> 33D2 xor edx, edx
0054E547 |. 8B83 04030000 mov eax, dword ptr [ebx+304]
0054E54D |. E8 421AF0FF call 0044FF94
0054E552 |. 33D2 xor edx, edx
0054E554 |. 8B83 FC020000 mov eax, dword ptr [ebx+2FC]
0054E55A |. E8 351AF0FF call 0044FF94
0054E55F |. B8 E8E65400 mov eax, 0054E6E8 ;注册失败,注册用户请重试!如有问题,请直接与作者联系!
0054E564 |. E8 4FA6EFFF call 00448BB8
0054E569 |> 33C0 xor eax, eax
0054E56B |. 5A pop edx
0054E56C |. 59 pop ecx
0054E56D |. 59 pop ecx
0054E56E |. 64:8910 mov dword ptr fs:[eax], edx
0054E571 |. 68 10E65400 push 0054E610
0054E576 |> 8D85 3CFFFFFF lea eax, dword ptr [ebp-C4]
0054E57C |. E8 5F65EBFF call 00404AE0
0054E581 |. 8D85 40FFFFFF lea eax, dword ptr [ebp-C0]
0054E587 |. BA 02000000 mov edx, 2
0054E58C |. E8 7365EBFF call 00404B04
0054E591 |. 8D85 48FFFFFF lea eax, dword ptr [ebp-B8]
0054E597 |. E8 4465EBFF call 00404AE0
0054E59C |. 8D85 4CFFFFFF lea eax, dword ptr [ebp-B4]
0054E5A2 |. BA 02000000 mov edx, 2
0054E5A7 |. E8 5865EBFF call 00404B04
0054E5AC |. 8D85 54FFFFFF lea eax, dword ptr [ebp-AC]
0054E5B2 |. BA 02000000 mov edx, 2
0054E5B7 |. E8 4865EBFF call 00404B04
0054E5BC |. 8D85 5CFFFFFF lea eax, dword ptr [ebp-A4]
0054E5C2 |. E8 1965EBFF call 00404AE0
0054E5C7 |. 8D85 60FFFFFF lea eax, dword ptr [ebp-A0]
0054E5CD |. BA 02000000 mov edx, 2
0054E5D2 |. E8 2D65EBFF call 00404B04
0054E5D7 |. 8D85 68FFFFFF lea eax, dword ptr [ebp-98]
0054E5DD |. E8 FE64EBFF call 00404AE0
0054E5E2 |. 8D85 6CFFFFFF lea eax, dword ptr [ebp-94]
0054E5E8 |. E8 F364EBFF call 00404AE0
0054E5ED |. 8D85 70FFFFFF lea eax, dword ptr [ebp-90]
0054E5F3 |. BA 02000000 mov edx, 2
0054E5F8 |. E8 0765EBFF call 00404B04
0054E5FD |. 8D45 FC lea eax, dword ptr [ebp-4]
0054E600 |. E8 DB64EBFF call 00404AE0
0054E605 \. C3 retn
0054E606 .^ E9 595EEBFF jmp 00404464
0054E60B .^ E9 66FFFFFF jmp 0054E576
0054E610 . 5F pop edi
0054E611 . 5E pop esi
0054E612 . 5B pop ebx
0054E613 . 8BE5 mov esp, ebp
0054E615 . 5D pop ebp
0054E616 . C3 retn
分析一个程序,不能急于求成,要细心观察,动脑分析。我们先用F8粗略的跟一遍,在跟踪的过程中,记好每行代码处出现的关键字符,并在OD的注释栏内添加上自己的注释。这个程序是明码比较的,比较容易发现注册码。在0054E44C代码行,就出现了真假码的比较。我们要分析它的算法,就要找到它的算法部分,就是程序中相应的算法Call。在0054E3BF代码行的Call后,就会出现确认码:987,程序肯定要对其进行处理的,那么我们就就 F7跟进0054E3CA的Call,看看程序究竟做了什么?
view plainprint?
00409B04 /$ 53 push ebx
00409B05 |. 56 push esi
00409B06 |. 83C4 F4 add esp, -0C
00409B09 |. 8BD8 mov ebx, eax
00409B0B |. 8BD4 mov edx, esp
00409B0D |. 8BC3 mov eax, ebx
00409B0F |. E8 489AFFFF call 0040355C ;F7进入
00409B14 |. 8BF0 mov esi, eax
00409B16 |. 833C24 00 cmp dword ptr [esp], 0
00409B1A |. 74 19 je short 00409B35
00409B1C |. 895C24 04 mov dword ptr [esp+4], ebx
00409B20 |. C64424 08 0B mov byte ptr [esp+8], 0B
00409B25 |. 8D5424 04 lea edx, dword ptr [esp+4]
00409B29 |. A1 70FE5D00 mov eax, dword ptr [5DFE70]
00409B2E |. 33C9 xor ecx, ecx
00409B30 |. E8 DBF9FFFF call 00409510
00409B35 |> 8BC6 mov eax, esi
00409B37 |. 83C4 0C add esp, 0C
00409B3A |. 5E pop esi
00409B3B |. 5B pop ebx
00409B3C \. C3 retn
上面这段代码没有需要的东西,在00409B0F行代码处 F7跟进。
view plainprint?
004035AE |> 80EB 30 /sub bl, 30
004035B1 |. |80FB 09 |cmp bl, 9
004035B4 |. |77 25 |ja short 004035DB
004035B6 |. |39F8 |cmp eax, edi
004035B8 |. |77 21 |ja short 004035DB
004035BA |. |8D0480 |lea eax, dword ptr [eax+eax*4];确认码的第1位开始,记做 EAX*5
004035BD |. |01C0 |add eax, eax ;结果*2
004035BF |. |01D8 |add eax, ebx ;加上此位数字,保存结果到EAX,最终结果记做A。
004035C1 |. |8A1E |mov bl, byte ptr [esi] ;取下一位
004035C3 |. |46 |inc esi
004035C4 |. |84DB |test bl, bl
004035C6 |.^\75 E6 \jnz short 004035AE;循环
经过这段代码的跟踪,发现是对确认码进行计算,如确认码为987,则取下第一位的9,乘以5,等于2D;将结果再自身相加,即乘2,等于5A;将结果再与第二位的8相加,等于62;将结果62乘以5,等于1EA;将结果再自身相加,即乘2,等于3D4;将结果再与第三位的7相加,等于3DB。哈哈!搞复杂了!其实就是将987这个数值转换成16进制。忽悠人嘛~~!!我们把确认码的16进制记做A。
接下来,对确认码的16进制做除法计算,除数为48,结果的整数部分放到寄存器EAX中,余数放到寄存器EDX中。这组结果有何用途?现在我们不得而知。
在0054E40D处 F7跟进,它是对确认码16进制的处理计算,看看代码吧。
view plainprint?
0054E028 /$ 55 push ebp
0054E029 |. 8BEC mov ebp, esp
0054E02B |. 33C9 xor ecx, ecx
0054E02D |. 51 push ecx
0054E02E |. 51 push ecx
0054E02F |. 51 push ecx
0054E030 |. 51 push ecx
0054E031 |. 53 push ebx
0054E032 |. 56 push esi
0054E033 |. 8BF2 mov esi, edx
0054E035 |. 8BD8 mov ebx, eax
0054E037 |. 33C0 xor eax, eax
0054E039 |. 55 push ebp
0054E03A |. 68 F8E05400 push 0054E0F8
0054E03F |. 64:FF30 push dword ptr fs:[eax]
0054E042 |. 64:8920 mov dword ptr fs:[eax], esp
0054E045 |. 81F3 F1250B00 xor ebx, 0B25F1 ;A XOR 0B25F1=B
0054E04B |. 8BC3 mov eax, ebx
0054E04D |. 33D2 xor edx, edx
0054E04F |. 52 push edx ;/Arg2 => 00000000
0054E050 |. 50 push eax ;|Arg1
0054E051 |. 8D45 FC lea eax, dword ptr [ebp-4]; |
0054E054 |. E8 FBB9EBFF call 00409A54; \yhds_exe.00409A54
0054E059 |. 8B45 FC mov eax, dword ptr [ebp-4];B的10进制=C
0054E05C |. 0FB600 movzx eax, byte ptr [eax] ;C的第1位
0054E05F |. 8B55 FC mov edx, dword ptr [ebp-4] ; C
0054E062 |. 0FB652 01 movzx edx, byte ptr [edx+1];C的第2位
0054E066 |. 03C2 add eax, edx ; C的第1位+C的第2位
0054E068 |. B9 05000000 mov ecx, 5 ;除数为 5
0054E06D |. 99 cdq
0054E06E |. F7F9 idiv ecx ;(C的第1位+C的第2位)/5取余数
0054E070 |. 80C2 34 add dl, 34 ; 余数+ 34
0054E073 |. 8855 F8 mov byte ptr [ebp-8], dl ;结果为 B1
0054E076 |. 8B45 FC mov eax, dword ptr [ebp-4] ;C
0054E079 |. 0FB640 02 movzx eax, byte ptr [eax+2];C的第3位
0054E07D |. 8B55 FC mov edx, dword ptr [ebp-4] ;C
0054E080 |. 0FB652 03 movzx edx, byte ptr [edx+3] ;C的第4位
0054E084 |. 03C2 add eax, edx;C的第3位+C的第4位
0054E086 |. B9 05000000 mov ecx, 5;除数为 5
0054E08B |. 99 cdq
0054E08C |. F7F9 idiv ecx ;(C的第3位+C的第4位)/5取余数
0054E08E |. 8BDA mov ebx, edx
0054E090 |. 80C3 33 add bl, 33;余数 + 33
0054E093 |. 885D F9 mov byte ptr [ebp-7], bl; 结果为 B2
0054E096 |. 8D45 F4 lea eax, dword ptr [ebp-C]
0054E099 |. 8A55 F8 mov dl, byte ptr [ebp-8]
0054E09C |. E8 1F6CEBFF call 00404CC0
0054E0A1 |. 8B45 F4 mov eax, dword ptr [ebp-C]
0054E0A4 |. 8D55 FC lea edx, dword ptr [ebp-4]
0054E0A7 |. B9 1B000000 mov ecx, 1B
0054E0AC |. E8 C76FEBFF call 00405078
0054E0B1 |. 8D45 F0 lea eax, dword ptr [ebp-10]
0054E0B4 |. 8BD3 mov edx, ebx
0054E0B6 |. E8 056CEBFF call 00404CC0
0054E0BB |. 8B45 F0 mov eax, dword ptr [ebp-10]
0054E0BE |. 8D55 FC lea edx, dword ptr [ebp-4]
0054E0C1 |. B9 19000000 mov ecx, 19
0054E0C6 |. E8 AD6FEBFF call 00405078
0054E0CB |. 8BC6 mov eax, esi
0054E0CD |. 8B55 FC mov edx, dword ptr [ebp-4] ; B连接B1、B2,为特征码T
0054E0D0 |. E8 5F6AEBFF call 00404B34
0054E0D5 |. 33C0 xor eax, eax
0054E0D7 |. 5A pop edx
0054E0D8 |. 59 pop ecx
0054E0D9 |. 59 pop ecx
0054E0DA |. 64:8910 mov dword ptr fs:[eax], edx
0054E0DD |. 68 FFE05400 push 0054E0FF
0054E0E2 |> 8D45 F0 lea eax, dword ptr [ebp-10]
0054E0E5 |. BA 02000000 mov edx, 2
0054E0EA |. E8 156AEBFF call 00404B04
0054E0EF |. 8D45 FC lea eax, dword ptr [ebp-4]
0054E0F2 |. E8 E969EBFF call 00404AE0
0054E0F7 \. C3 retn
从这段代码可以看到,取出确认码的16进制与常数B25F1进行异或运算,结果记做B;如3DB XOR B25F1 = B262A。把B转换成10进制数值,记做C,如B262A=730666。将C的第一、二位数值相加,除以5,取余数,加上常数34,转换成字符,记做 B1,如(37+33)/5的余数+34=35,字符是“5”;将C的第三、四位数值相加,除以5,取余数,加上常数33,转换成字符,记做B2,如(30+36)/5的余数+33=35,字符是“5”;最后,将C与B1、B2连接,组成特征码T,如:73066655。
有了前面的忽悠,0054E418的Call就不忽悠大家了,是将特征码T转换成16进制,如73066655 = 45AE89F。然后,该到关键的最终结果计算了吧!F7跟进0054E423的Call,代码如下。
view plainprint?
0054E108 /$ 55 push ebp
0054E109 |. 8BEC mov ebp, esp
0054E10B |. 33C9 xor ecx, ecx
0054E10D |. 51 push ecx
0054E10E |. 51 push ecx
0054E10F |. 51 push ecx
0054E110 |. 51 push ecx
0054E111 |. 51 push ecx
0054E112 |. 51 push ecx
0054E113 |. 53 push ebx
0054E114 |. 56 push esi
0054E115 |. 8BF2 mov esi, edx
0054E117 |. 8BD8 mov ebx, eax
0054E119 |. 33C0 xor eax, eax
0054E11B |. 55 push ebp
0054E11C |. 68 54E25400 push 0054E254
0054E121 |. 64:FF30 push dword ptr fs:[eax]
0054E124 |. 64:8920 mov dword ptr fs:[eax], esp
0054E127 |. 81F3 8776FBDD xor ebx, DDFB7687;T的16进制 XOR DDFB7687结果为D
0054E12D |. 8BC3 mov eax, ebx ;D给EAX(3651247640)
0054E12F |. 33D2 xor edx, edx
0054E131 |. 52 push edx ; /Arg2 => 00000000
0054E132 |. 50 push eax ; |Arg1
0054E133 |. 8D45 FC lea eax, dword ptr [ebp-4]; |
0054E136 |. E8 19B9EBFF call 00409A54; \yhds_exe.00409A54
0054E13B |. 8B45 FC mov eax, dword ptr [ebp-4];D的10进制
0054E13E |. 0FB600 movzx eax, byte ptr [eax];D的10进制第1位
0054E141 |. 8B55 FC mov edx, dword ptr [ebp-4];D的10进制
0054E144 |. 0FB652 01 movzx edx, byte ptr [edx+1];D的10进制第2位
0054E148 |. 03C2 add eax, edx;D的10进制第1位+第2位
0054E14A |. B9 05000000 mov ecx, 5;除数为 5
0054E14F |. 99 cdq
0054E150 |. F7F9 idiv ecx;(D的10进制第1位+第2位)/5取余数
0054E152 |. 80C2 66 add dl, 66 ;余数+66
0054E155 |. 8855 F8 mov byte ptr [ebp-8], dl ; 结果 f
0054E158 |. 8B45 FC mov eax, dword ptr [ebp-4] ; D的10进制
0054E15B |. 0FB640 02 movzx eax, byte ptr [eax+2] ; D的10进制第3位
0054E15F |. 8B55 FC mov edx, dword ptr [ebp-4] ; D的10进制
0054E162 |. 0FB652 03 movzx edx, byte ptr [edx+3] ; D的10进制第4位
0054E166 |. 03C2 add eax, edx; D的10进制第3位+第4位
0054E168 |. B9 05000000 mov ecx, 5;除数为 5
0054E16D |. 99 cdq
0054E16E |. F7F9 idiv ecx ;(D的10进制第3位+第4位)/5取余数
0054E170 |. 80C2 75 add dl, 75 ; 余数+75
0054E173 |. 8855 F9 mov byte ptr [ebp-7], dl ; 结果 w
0054E176 |. 8B45 FC mov eax, dword ptr [ebp-4] ; D的10进制
0054E179 |. 0FB640 04 movzx eax, byte ptr [eax+4] ; D的10进制第5位
0054E17D |. 8B55 FC mov edx, dword ptr [ebp-4] ; D的10进制
0054E180 |. 0FB652 05 movzx edx, byte ptr [edx+5] ; D的10进制第6位
0054E184 |. 03C2 add eax, edx ; D的10进制第5位+第6位
0054E186 |. B9 05000000 mov ecx, 5 ;除数为 5
0054E18B |. 99 cdq
0054E18C |. F7F9 idiv ecx ;(D的10进制第5位+第6位)/5取余数
0054E18E |. 80C2 7A add dl, 7A ;余数+7A
0054E191 |. 8855 FA mov byte ptr [ebp-6], dl ;结果 |
0054E194 |. 8B45 FC mov eax, dword ptr [ebp-4];D的10进制
0054E197 |. 0FB640 06 movzx eax, byte ptr [eax+6] ; D的10进制第7位
0054E19B |. 8B55 FC mov edx, dword ptr [ebp-4] ; D的10进制
0054E19E |. 0FB652 07 movzx edx, byte ptr [edx+7] ; D的10进制第8位
0054E1A2 |. 03C2 add eax, edx ; D的10进制第7位+第8位,结果放EAX
0054E1A4 |. 8B55 FC mov edx, dword ptr [ebp-4]
0054E1A7 |. 0FB652 08 movzx edx, byte ptr [edx+8] ; D的10进制第9位
0054E1AB |. 03C2 add eax, edx ; EAX+D的10进制第9位(可以理解为7、8、9位相加)
0054E1AD |. B9 05000000 mov ecx, 5 ; 除数为 5
0054E1B2 |. 99 cdq
0054E1B3 |. F7F9 idiv ecx ; EAX+D的10进制第9位
0054E1B5 |. 80C2 69 add dl, 69 ;余数+69
0054E1B8 |. 8855 FB mov byte ptr [ebp-5], dl ;结果 j
0054E1BB |. 8D45 F4 lea eax, dword ptr [ebp-C]
0054E1BE |. 8A55 F8 mov dl, byte ptr [ebp-8] ;f
0054E1C1 |. E8 FA6AEBFF call 00404CC0
0054E1C6 |. 8B45 F4 mov eax, dword ptr [ebp-C]
0054E1C9 |. 8D55 FC lea edx, dword ptr [ebp-4]
0054E1CC |. B9 07000000 mov ecx, 7 ;位置数 7
0054E1D1 |. E8 A26EEBFF call 00405078
0054E1D6 |. 8D45 F0 lea eax, dword ptr [ebp-10]
0054E1D9 |. 8A55 FB mov dl, byte ptr [ebp-5] ; j
0054E1DC |. E8 DF6AEBFF call 00404CC0
0054E1E1 |. 8B45 F0 mov eax, dword ptr [ebp-10]
0054E1E4 |. 8D55 FC lea edx, dword ptr [ebp-4]
0054E1E7 |. B9 03000000 mov ecx, 3 ;位置数 3
0054E1EC |. E8 876EEBFF call 00405078
0054E1F1 |. 8D45 EC lea eax, dword ptr [ebp-14]
0054E1F4 |. 8A55 F9 mov dl, byte ptr [ebp-7] ; w
0054E1F7 |. E8 C46AEBFF call 00404CC0
0054E1FC |. 8B45 EC mov eax, dword ptr [ebp-14]
0054E1FF |. 8D55 FC lea edx, dword ptr [ebp-4]
0054E202 |. B9 05000000 mov ecx, 5 ; 位置数 5
0054E207 |. E8 6C6EEBFF call 00405078
0054E20C |. 8D45 E8 lea eax, dword ptr [ebp-18]
0054E20F |. 8A55 FA mov dl, byte ptr [ebp-6] ; |
0054E212 |. E8 A96AEBFF call 00404CC0
0054E217 |. 8B45 E8 mov eax, dword ptr [ebp-18]
0054E21A |. 8D55 FC lea edx, dword ptr [ebp-4]
0054E21D |. B9 09000000 mov ecx, 9 ; 位置数 9
0054E222 |. E8 516EEBFF call 00405078
0054E227 |. 8BC6 mov eax, esi
0054E229 |. 8B55 FC mov edx, dword ptr [ebp-4] ; 真码36j5w124|f7640
0054E22C |. E8 0369EBFF call 00404B34
0054E231 |. 33C0 xor eax, eax
0054E233 |. 5A pop edx
0054E234 |. 59 pop ecx
0054E235 |. 59 pop ecx
0054E236 |. 64:8910 mov dword ptr fs:[eax], edx
0054E239 |. 68 5BE25400 push 0054E25B
0054E23E |> 8D45 E8 lea eax, dword ptr [ebp-18]
0054E241 |. BA 04000000 mov edx, 4
0054E246 |. E8 B968EBFF call 00404B04
0054E24B |. 8D45 FC lea eax, dword ptr [ebp-4]
0054E24E |. E8 8D68EBFF call 00404AE0
0054E253 \. C3 retn
将特征码T的16进制与常数DDFB7687进行异或运算,结果记做D,将D转换成10进制(无符号的),如73066655 = 45AE89F,45AE89F XOR DDFB7687=D9A19E18, D9A19E18=3651247640。取它的第一、二位数值相加,除以5,取余数,加上常数66,转换成字符,记做S1,如(33+36)/5的余数+66=66,字符是“f”;取它的第三、四位数值相加,除以5,取余数,加上常数75,转换成字符,记做S2,如(35+31)/5的余数+75=77,字符是“w”;取它的第五、六位数值相加,除以5,取余数,加上常数7A,转换成字符,记做S3,如(32+34)/5的余数+7A=7C,字符是“|”;取它的第七、八、九位数值相加,除以5,取余数,加上常数69,转换成字符,记做S4,如(37+36+34)/5的余数+69=6A,字符是“j”;同时对S1、S2、S3、S4字符的位置进行安排,这主要体现在0054E1CC、0054E1E7、0054E202、 0054E21D处代码的“ecx,7”、“ecx,3”、“ecx,5”、“ecx,9”安排字符。将“f ”插入到3651247640的第七位置就变成了365124f7640,将“j ”插入到365124f7640的第三位置变成了36j5124f7640,将“ w ”插入到36j5124f7640的第五位置变成了36j5w124f7640,将“|”插入到36j5124f7640的第九位置变成了 36j5w124|f7640,这就是确认码987的正确注册码。注册成功以后,软件界面如图2所示。
图2
软件注册成功以后,会在本机生成注册文件,位置是“C:\Windows\system32\5yten.sys”,并对该注册文件赋以隐藏属性。
总结
软件由Delphi程序编写,注册部分作者采用了自编算法,没有利用任何字符处理模块,主要是利用10进制和16进制的转换关系,生成注册码,对注册码字符的位置安排,还是比较巧妙的。下面我们对其算法小结一下。
1) 确认码必须是数字,将其转换成16进制,记做S1。
2) 将S1与B25F1进行异或运算,把结果转换成10进制数值,记做S2。
3)取S2的1、2位,16进制相加,除5的余数加34,转换成字符,记做P1。取S2的3、4位,16进制相加,除5的余数加33,转换成字符,记做P2。S2与P1、P2连接成特征码T。
4) 将T转换成16进制,与DDFB7687进行异或运算,结果转换成10进制,记做SSN;构成注册码SN的雏形,取SSN的1、2位,16进制相加,除5 的余数加66,转换成字符,插入到SSN的第7位;取SSN的7、8、9位,16进制相加,除5的余数加69,转换成字符,插入到SSN的第3位;取 SSN的3、4位,16进制相加,除5的余数加75,转换成字符,插入到SSN的第5位;取SSN的5、6位,16进制相加,除5的余数加7A,转换成字符,插入到SSN的第9位,形成最终注册码。
回顾一下,这个软件的致命之处在于明码比较,很容易找到关键字符,而且还会出现明码注册码;注册码和本机的硬件无任何关联,有注册文件即可,这意味着一个注册文件可以多台电脑注册。
阅读(1151) | 评论(0) | 转发(0) |