roczyl 发表于 2009-12-21 18:35:57

半仙算命2009算法分析

最近逼着分析算法,不过能力有限,只能弄简单的,下面是半仙算命2009算法分析:

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

0055BEF5   > \8D95 8CFEFFFF lea edx,dword ptr ss:
0055BEFB   .8B45 FC       mov eax,dword ptr ss:
0055BEFE   .8B80 00030000 mov eax,dword ptr ds:
0055BF04   .E8 0FC2EEFF   call unpack.00448118                     ;获取注册码位数到EAX
0055BF09   .8B85 8CFEFFFF mov eax,dword ptr ss:
0055BF0F   .50            push eax
0055BF10   .8D95 84FEFFFF lea edx,dword ptr ss:
0055BF16   .8B45 FC       mov eax,dword ptr ss:
0055BF19   .8B80 F8020000 mov eax,dword ptr ds:
0055BF1F   .E8 F4C1EEFF   call unpack.00448118                     ;获取序列号位数到EAX
0055BF24   .8B85 84FEFFFF mov eax,dword ptr ss:
0055BF2A   .E8 B1D9EAFF   call unpack.004098E0
0055BF2F   .69C0 B1040000 imul eax,eax,4B1                         ;假序列号乘4B1
0055BF35   .8D95 88FEFFFF lea edx,dword ptr ss:
0055BF3B   .E8 8CFDFFFF   call unpack.0055BCCC                     ;关键CALL
0055BF40   .8B95 88FEFFFF mov edx,dword ptr ss:         ;真注册码到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:
0055BCE6|.64:8920       mov dword ptr fs:,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,
0055BCF8|.E8 AFDBEAFF   call unpack.004098AC                     ;a转成10进制数
0055BCFD|.8B45 FC       mov eax,
0055BD00|.0FB600      movzx eax,byte ptr ds:            ;a第一位送EAX
0055BD03|.8B55 FC       mov edx,
0055BD06|.0FB652 01   movzx edx,byte ptr ds:            ;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:,dl
0055BD1A|.8B45 FC       mov eax,
0055BD1D|.0FB640 02   movzx eax,byte ptr ds:            ;a第3位送EAX
0055BD21|.8B55 FC       mov edx,
0055BD24|.0FB652 03   movzx edx,byte ptr ds:            ;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:,bl               ;存为S3
0055BD3A|.8D45 F4       lea eax,
0055BD3D|.8A55 F8       mov dl,byte ptr ss:
0055BD40|.E8 8F90EAFF   call unpack.00404DD4
0055BD45|.8B45 F4       mov eax,
0055BD48|.8D55 FC       lea edx,
0055BD4B|.B9 1B000000   mov ecx,1B
0055BD50|.E8 3794EAFF   call unpack.0040518C                     ;将a连接S2
0055BD55|.8D45 F0       lea eax,
0055BD58|.8BD3          mov edx,ebx
0055BD5A|.E8 7590EAFF   call unpack.00404DD4
0055BD5F|.8B45 F0       mov eax,
0055BD62|.8D55 FC       lea edx,
0055BD65|.B9 19000000   mov ecx,19
0055BD6A|.E8 1D94EAFF   call unpack.0040518C                     ;将a连接S3
0055BD6F|.8BC6          mov eax,esi
0055BD71|.8B55 FC       mov edx,                        ;真注册码送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:,edx
0055BD81|.68 A3BD5500   push unpack.0055BDA3
0055BD86|>8D45 F0       lea eax,
0055BD89|.BA 02000000   mov edx,2
0055BD8E|.E8 858EEAFF   call unpack.00404C18
0055BD93|.8D45 FC       lea eax,
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,即为注册码。

GGLHY 发表于 2009-12-22 13:15:03

顶下兄弟了哈!

YUEN 发表于 2009-12-22 18:11:28

不错哦,,有空下载了学习学习

lixy8888 发表于 2009-12-22 18:31:00

支持下

O(∩_∩)O~
页: [1]
查看完整版本: 半仙算命2009算法分析