文/图 阿达.浓咖啡
最近自己的系统总是有些小问题,因为自己学习、研究软件程序逆向的需要,要定期格式化系统。这次犯懒了,就到网上谷歌一下系统优化方面的软件,嘿!一大堆!就用这个吧!“系统优化大师V2007”,可运行使用却需要注册,不注册一些功能会被禁止使用。这个问题对于自己好像不是难事,立刻拿出工具,三下五除二找到注册码,成功注册!顺利的完成了系统的清理、优化工作。等手上的工作都结束后,有点时间,又想起了那个系统优化大师V2007,忍不住想探究一下程序的注册算法是如何进行的,于是就有了下面的算法分析。
软件简介
系统优化大师被评为2005年中国10个最优秀共享软件之一。软件全方位、高效、安全地提高你的系统性能,使用简单,傻瓜式操作,可能迅速达到系统优化目的。包括桌面优化、菜单优化、网络优化、软件优化、系统优化以及禁用设置、选择设置、更改设置等一系列个性化优化及设置选项。它还可以进行高速的注册表清理及高速的硬盘垃圾文件清理,清理全面、安全、不影响任何运行性能。
原程序本身加的是ASP2.12压缩壳,黑防多次谈过此类压缩壳的脱法,这里就不介绍了,用ESP定律或PEiD插件就可以完成,比较简单。该软件使用Borland Delphi 6.0-7.0程序编写。
分析过程
用OD载入脱壳后的程序,利用OD的插件“超级字符串查找”,搜索关键字符“注册成功”,很容易找到这些关键字符,程序作者在程序中对字符没做任何处理,如图1所示。
图1
双击“注册成功”这行代码,就会来到反汇编窗口,一直向上找到段首,下好 F2断点。然后F9运行出注册界面,输入确认码 987,假码xuhw。点注册后,程序就会断下来,停在下面的代码处。
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 "SOFTWAREMicrosoftYhds"
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 <jmp.&KERNEL32.GetSystemDirector>; 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 00