飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4578|回复: 3

[原创] 半仙算命2009算法分析

[复制链接]

该用户从未签到

发表于 2009-12-21 18:35:57 | 显示全部楼层 |阅读模式
最近逼着分析算法,不过能力有限,只能弄简单的,下面是半仙算命2009算法分析:

先查壳,aspack,ESP法,脱掉。
OD载入unpack.exe,
查找字符串,有“注册成功!”字样,双击,来到0055C031
向上看,

0055BEF5   > \8D95 8CFEFFFF lea edx,dword ptr ss:[ebp-174]
0055BEFB   .  8B45 FC       mov eax,dword ptr ss:[ebp-4]
0055BEFE   .  8B80 00030000 mov eax,dword ptr ds:[eax+300]
0055BF04   .  E8 0FC2EEFF   call unpack.00448118                     ;  获取注册码位数到EAX
0055BF09   .  8B85 8CFEFFFF mov eax,dword ptr ss:[ebp-174]
0055BF0F   .  50            push eax
0055BF10   .  8D95 84FEFFFF lea edx,dword ptr ss:[ebp-17C]
0055BF16   .  8B45 FC       mov eax,dword ptr ss:[ebp-4]
0055BF19   .  8B80 F8020000 mov eax,dword ptr ds:[eax+2F8]
0055BF1F   .  E8 F4C1EEFF   call unpack.00448118                     ;  获取序列号位数到EAX
0055BF24   .  8B85 84FEFFFF mov eax,dword ptr ss:[ebp-17C]
0055BF2A   .  E8 B1D9EAFF   call unpack.004098E0
0055BF2F   .  69C0 B1040000 imul eax,eax,4B1                         ;  假序列号乘4B1
0055BF35   .  8D95 88FEFFFF lea edx,dword ptr ss:[ebp-178]
0055BF3B   .  E8 8CFDFFFF   call unpack.0055BCCC                     ;  关键CALL
0055BF40   .  8B95 88FEFFFF mov edx,dword ptr ss:[ebp-178]           ;  真注册码到EDX
0055BF46   .  58            pop eax                                  ;  假注册码到EAX
0055BF47   .  E8 A490EAFF   call unpack.00404FF0                     ;  比较
0055BF4C   .  0F85 F3000000 jnz unpack.0055C045                      ;  跳就失败,爆破点

跟进0055BCCC处的关键CALL,如下:
0055BCCC  /$  55            push ebp
0055BCCD  |.  8BEC          mov ebp,esp
0055BCCF  |.  33C9          xor ecx,ecx
0055BCD1  |.  51            push ecx
0055BCD2  |.  51            push ecx
0055BCD3  |.  51            push ecx
0055BCD4  |.  51            push ecx
0055BCD5  |.  53            push ebx
0055BCD6  |.  56            push esi
0055BCD7  |.  8BF2          mov esi,edx
0055BCD9  |.  8BD8          mov ebx,eax                              ;  序列号*4B1的值转EBX,设为变量a
0055BCDB  |.  33C0          xor eax,eax
0055BCDD  |.  55            push ebp
0055BCDE  |.  68 9CBD5500   push unpack.0055BD9C
0055BCE3  |.  64:FF30       push dword ptr fs:[eax]
0055BCE6  |.  64:8920       mov dword ptr fs:[eax],esp
0055BCE9  |.  81F3 F1250B00 xor ebx,0B25F1                           ;  a与0B25F1异或
0055BCEF  |.  8BC3          mov eax,ebx                              ;  a送EAX
0055BCF1  |.  33D2          xor edx,edx
0055BCF3  |.  52            push edx
0055BCF4  |.  50            push eax
0055BCF5  |.  8D45 FC       lea eax,[local.1]
0055BCF8  |.  E8 AFDBEAFF   call unpack.004098AC                     ;  a转成10进制数
0055BCFD  |.  8B45 FC       mov eax,[local.1]
0055BD00  |.  0FB600        movzx eax,byte ptr ds:[eax]              ;  a第一位送EAX
0055BD03  |.  8B55 FC       mov edx,[local.1]
0055BD06  |.  0FB652 01     movzx edx,byte ptr ds:[edx+1]            ;  a第二位送EDX
0055BD0A  |.  03C2          add eax,edx                              ;  第一位和第二位的ascii码相加
0055BD0C  |.  B9 05000000   mov ecx,5
0055BD11  |.  99            cdq
0055BD12  |.  F7F9          idiv ecx                                 ;  a除以5
0055BD14  |.  80C2 34       add dl,34                                ;  余数加上34,存为S2
0055BD17  |.  8855 F8       mov byte ptr ss:[ebp-8],dl
0055BD1A  |.  8B45 FC       mov eax,[local.1]
0055BD1D  |.  0FB640 02     movzx eax,byte ptr ds:[eax+2]            ;  a第3位送EAX
0055BD21  |.  8B55 FC       mov edx,[local.1]
0055BD24  |.  0FB652 03     movzx edx,byte ptr ds:[edx+3]            ;  a第4位送EDX
0055BD28  |.  03C2          add eax,edx
0055BD2A  |.  B9 05000000   mov ecx,5
0055BD2F  |.  99            cdq
0055BD30  |.  F7F9          idiv ecx
0055BD32  |.  8BDA          mov ebx,edx
0055BD34  |.  80C3 33       add bl,33                                ;  加33
0055BD37  |.  885D F9       mov byte ptr ss:[ebp-7],bl               ;  存为S3
0055BD3A  |.  8D45 F4       lea eax,[local.3]
0055BD3D  |.  8A55 F8       mov dl,byte ptr ss:[ebp-8]
0055BD40  |.  E8 8F90EAFF   call unpack.00404DD4
0055BD45  |.  8B45 F4       mov eax,[local.3]
0055BD48  |.  8D55 FC       lea edx,[local.1]
0055BD4B  |.  B9 1B000000   mov ecx,1B
0055BD50  |.  E8 3794EAFF   call unpack.0040518C                     ;  将a连接S2
0055BD55  |.  8D45 F0       lea eax,[local.4]
0055BD58  |.  8BD3          mov edx,ebx
0055BD5A  |.  E8 7590EAFF   call unpack.00404DD4
0055BD5F  |.  8B45 F0       mov eax,[local.4]
0055BD62  |.  8D55 FC       lea edx,[local.1]
0055BD65  |.  B9 19000000   mov ecx,19
0055BD6A  |.  E8 1D94EAFF   call unpack.0040518C                     ;  将a连接S3
0055BD6F  |.  8BC6          mov eax,esi
0055BD71  |.  8B55 FC       mov edx,[local.1]                        ;  真注册码送EDX
0055BD74  |.  E8 CF8EEAFF   call unpack.00404C48
0055BD79  |.  33C0          xor eax,eax
0055BD7B  |.  5A            pop edx
0055BD7C  |.  59            pop ecx
0055BD7D  |.  59            pop ecx
0055BD7E  |.  64:8910       mov dword ptr fs:[eax],edx
0055BD81  |.  68 A3BD5500   push unpack.0055BDA3
0055BD86  |>  8D45 F0       lea eax,[local.4]
0055BD89  |.  BA 02000000   mov edx,2
0055BD8E  |.  E8 858EEAFF   call unpack.00404C18
0055BD93  |.  8D45 FC       lea eax,[local.1]
0055BD96  |.  E8 598EEAFF   call unpack.00404BF4
0055BD9B  \.  C3            retn


一组正确的注册码:
序列号:88888
注册码:10641927364


总结一下算法:
将输入的序列号(A*4B1) XOR B25F1,再算出十进制B。取B的1、2位ASCII码相加除以5取余数加34,为B1。取B的3、4位ASCII码相加除以5取余数加33,为B2,连接B、B1、B2,即为注册码。
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-23 23:49
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    发表于 2009-12-22 13:15:03 | 显示全部楼层
    顶下兄弟了哈!
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2024-7-18 13:59
  • 签到天数: 65 天

    [LV.6]常住居民II

    发表于 2009-12-22 18:11:28 | 显示全部楼层
    不错哦,,有空下载了学习学习
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-12-22 18:31:00 | 显示全部楼层

    支持下

    O(∩_∩)O~
    QQ截图未命名.gif
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表