半仙算命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,即为注册码。 顶下兄弟了哈! 不错哦,,有空下载了学习学习
支持下
O(∩_∩)O~
页:
[1]