Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92156
  • 博文数量: 26
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1030
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-25 10:47
文章分类
文章存档

2013年(26)

我的朋友

分类: 网络与安全

2013-08-13 09:43:39

最近自己的系统总是有些小问题,因为自己学习、研究软件程序逆向的需要,要定期格式化系统。这次犯懒了,就到网上谷歌一下系统优化方面的软件,嘿!一大堆!就用这个吧!“系统优化大师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) |
给主人留下些什么吧!~~