本帖最后由 wangzhe311 于 2012-7-29 19:24 编辑
皇室取名软件2.28 算法分析:
通过查找字符串,找到关键call,进入进行算法分析。如下所示: ********************************************************************************** 004A3F31 |. E8 FE05F6FF call 皇室取名.00404534 004A3F36 |. 83F8 20 cmp eax,20 ; 对位数进行比较,20是十六进制表示法,转换成十进制应该是32,所以密码应该是32位的,输入32位的假码。 004A3F39 |. 74 07 je short 皇室取名.004A3F42 ;是32位就跳向验证。。。 004A3F3B |. 33DB xor ebx,ebx 004A3F3D |. E9 E0000000 jmp 皇室取名.004A4022 004A3F42 |> 8D45 F0 lea eax,[local.4] 跳向这里。 004A3F45 E8 9EFEFFFF call 皇室取名.004A3DE8 004A3F4A |. 8B55 F0 mov edx,[local.4] 004A3F4D |. A1 B48D5D00 mov eax,dword ptr ds:[5D8DB4] 004A3F52 |. E8 2907F6FF call 皇室取名.00404680 004A3F57 |. 74 07 je short 皇室取名.004A3F60 004A3F59 |. 33DB xor ebx,ebx 004A3F5B |. E9 C2000000 jmp 皇室取名.004A4022 004A3F60 |> FF35 548B5B00 push dword ptr ds:[5B8B54] 004A3F66 |. FF35 B48D5D00 push dword ptr ds:[5D8DB4] 004A3F6C |. FF35 508B5B00 push dword ptr ds:[5B8B50] 004A3F72 |. 8D45 EC lea eax,[local.5] 004A3F75 |. BA 03000000 mov edx,3 004A3F7A |. E8 7506F6FF call 皇室取名.004045F4 004A3F7F |. 8B45 EC mov eax,[local.5] 004A3F82 |. 8D55 F8 lea edx,[local.2] 004A3F85 |. E8 0AF0FFFF call 皇室取名.004A2F94 ;ASCII "Qingling72ea94c3047065d8CQL"初始码装入,计算出第一个码 004A3F8A |. B8 01000000 mov eax,1 004A3F8F |> 8BD0 /mov edx,eax 004A3F91 |. 03D2 |add edx,edx 004A3F93 |. 8B4D FC |mov ecx,[local.1] 004A3F96 |. 8A5411 FE |mov dl,byte ptr ds:[ecx+edx-2] 004A3F9A |. 8B4D F8 |mov ecx,[local.2] ;把“Qingling72ea94c3047065d8CQL”进行md5加密,得到“6ea7ccd8d0180f0977d13c8da01a1cd1” 004A3F9D |. 3A5401 FF |cmp dl,byte ptr ds:[ecx+eax-1] ; 对注册码进行比较较验,拿6ea7ccd8d0180f0977d13c8da01a1cd1的前15位与注册码的奇数位进行校验。 004A3FA1 74 04 je short 皇室取名.004A3FA7 ; 要跳 004A3FA3 |. 33DB |xor ebx,ebx 004A3FA5 |. EB 7B |jmp short 皇室取名.004A4022 004A3FA7 |> 40 |inc eax 004A3FA8 |. 83F8 10 |cmp eax,10 ;控制循环取数。10是十六进制数,转换成十进制数是16,从1开始,在16处跳,说明取了15位。 004A3FAB |.^ 75 E2 \jnz short 皇室取名.004A3F8F 004A3FAD |. 8D45 E4 lea eax,[local.7] 004A3FB0 |. 50 push eax 004A3FB1 |. B9 10000000 mov ecx,10 004A3FB6 |. BA 11000000 mov edx,11 004A3FBB |. 8B45 F8 mov eax,[local.2] 004A3FBE |. E8 D107F6FF call 皇室取名.00404794 ;取“6ea7ccd8d0180f0977d13c8da01a1cd1”的后十六位“77d13c8da01a1cd1” 004A3FC3 |. 8B45 E4 mov eax,[local.7] 004A3FC6 |. 8D55 E8 lea edx,[local.6] 004A3FC9 |. E8 C6EFFFFF call 皇室取名.004A2F94 :对“77d13c8da01a1cd1”进行md5加密操作,得到“3015f57808ba01ce6cabd45a839b65f5” 004A3FCE |. 8B55 E8 mov edx,[local.6] 004A3FD1 |. 8D45 F8 lea eax,[local.2] 004A3FD4 |. E8 3303F6FF call 皇室取名.0040430C 004A3FD9 |. B8 01000000 mov eax,1 004A3FDE |> 8BD0 /mov edx,eax 004A3FE0 |. 03D2 |add edx,edx 004A3FE2 |. 8B4D FC |mov ecx,[local.1] 004A3FE5 |. 8A5411 FF |mov dl,byte ptr ds:[ecx+edx-1] 004A3FE9 |. 8B4D F8 |mov ecx,[local.2] 004A3FEC |. 3A5401 0F |cmp dl,byte ptr ds:[ecx+eax+F] 004A3FF0 74 04 je short 皇室取名.004A3FF6 004A3FF2 |. 33DB |xor ebx,ebx 004A3FF4 |. EB 2C |jmp short 皇室取名.004A4022 004A3FF6 |> 40 |inc eax 004A3FF7 |. 83F8 10 |cmp eax,10 004A3FFA |.^ 75 E2 \jnz short 皇室取名.004A3FDE ;取“3015f57808ba01ce6cabd45a839b65f5”的“6cabd45a839b65f5”(前15位)与注册码的偶数位(15位)进行比较。 ********************************************************************************** 至此,注册码的前30位的奇数位为:6ea7ccd8d0180f0 前30位的偶数位为:6cabd45a839b65f 所以注册码的前30位为:66ecaa7bcdc4d58ad803198b06f50f ********************************************************************************** 004A3FFC |. A1 B48D5D00 mov eax,dword ptr ds:[5D8DB4] 004A4001 |. 8A40 03 mov al,byte ptr ds:[eax+3] :取eax(机器码)的第4位(因为是空3位,所以是第4位)给al 004A4004 |. 8B55 FC mov edx,[local.1] 004A4007 |. 3A42 1E cmp al,byte ptr ds:[edx+1E] ;取edx(假注册码)的第31位,与al直比较。。1e是十六进制,转换十进制是30。 004A400A 74 04 je short 皇室取名.004A4010 004A4015 |. 8A40 0A mov al,byte ptr ds:[eax+A] ;取eax(机器码)的第11位(因为是空10位,所以是第11位)给al 004A4018 |. 8B55 FC mov edx,[local.1] 004A401B |. 3A42 1F cmp al,byte ptr ds:[edx+1F] ;取edx(假注册码)的第32位,与al直比较。。1f是十六进制,转换十进制是31。 第31位和32位为:a7 软件机器码为“72ea94c3047065d8”时的注册码为“66ecaa7bcdc4d58ad803198b06f50fa7” **************************************************************************** 注册码的计算过程为: 机器码 ;机器码 Qingling+72ea94c3047065d8+CQL ;把机器码前后都加上一个固定字符串。 6ea7ccd8d0180f0977d13c8da01a1cd1 ;把得到的字符串md5加密。 6ea7ccd8d0180f0 ;取前15位作为软件的注册码前30位的奇数位 77d13c8da01a1cd1 ;取md5加密后数据的后16位 3015f57808ba01ce6cabd45a839b65f5:对字符串进行md5加密 6cabd45a839b65f ;取加密后数据的后16位的前15位作为软件注册码前30位的偶数位 a ;取机器码的第4位作为注册码的第31位 7 ;取机器码的第11位作为注册码的第32位 得到软件的注册码:66ecaa7bcdc4d58ad803198b06f50fa7
我电脑的机器码是:f1abac3298505f48 加上固定的字符串:Qinglingf1abac3298505f48CQL Md5加密后是:73a1dd43d1ecb5814c45774217bceb5b 取前15位作为软件的注册码前30位的奇数位:73a1dd43d1ecb58 取md5加密后数据的后16位,对字符串进行md5加密:985be925bef02ad7de44f549df4a3f2a 取加密后数据的后16位的前15位作为软件注册码前30位的偶数位:de44f549df4a3f2 取机器码的第4位作为注册码的第31位:b 取机器码的第11位作为注册码的第32位:5 得到软件的注册码:7d3ea414dfd54439dd1fe4cab35f82b5 ************************************************************ |