- UID
- 45500
注册时间2008-2-14
阅读权限10
最后登录1970-1-1
周游历练
该用户从未签到
|
最近逼着分析算法,不过能力有限,只能弄简单的,下面是半仙算命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,即为注册码。 |
|