-
-
[原创]软件安全中可能出现的问题
-
发表于: 2008-8-26 00:22 3212
-
好久没有在看雪发表文章了 ,假期调试了两个软件,在此分享一下自己对于软件编写中思路得一点心得。
OK,软件有注册界面
输入正确得注册码,注册成功:) ,不然就会
分析后发现加壳,壳在这不是重点,所以直接说脱壳后得分析
在超级字符串中发现有这样得一行
文本字串=software\microsoft\windows\currentversion\sesoftware\googleqqscan
初步估计会在注册表中写一个键值,而且有可能作为下次启动,判断是否注册得一个依据。再找
发现“请输入软件的序列号”
后面两步 下断点
运行软件,点击注册
,弹出,输入这注册码的对话框,随便输入:123456789
0048F683 |. 3C 01 cmp al, 1
0048F685 |. 0F85 11010000 jnz unpacked.0048F79C
0048F68B |. 8D55 D4 lea edx, [local.11]
0048F68E |. 8B45 FC mov eax, [local.1]
0048F691 |. E8 4694F7FF call unpacked.00408ADC
0048F696 |. 8B45 D4 mov eax, [local.11]
0048F699 |. E8 1297F7FF call unpacked.00408DB0
0048F69E |. 8945 F0 mov [local.4], eax
0048F6A1 |. 8955 F4 mov [local.3], edx
0048F6A4 |. 6A 00 push 0
0048F6A6 |. 6A 49 push 49
0048F6A8 |. 8B45 F0 mov eax, [local.4]
0048F6AB |. 8B55 F4 mov edx, [local.3]
0048F6AE |. E8 9D60F7FF call unpacked.00405750
0048F6B3 |. 8945 F0 mov [local.4], eax
0048F6B6 |. 8955 F4 mov [local.3], edx
0048F6B9 |. 8B45 F0 mov eax, [local.4]
0048F6BC |. 8B55 F4 mov edx, [local.3]
0048F6BF |. 2D E3C30B00 sub eax, 0BC3E3
0048F6C4 |. 83DA 00 sbb edx, 0
0048F6C7 |. 8945 F0 mov [local.4], eax
0048F6CA |. 8955 F4 mov [local.3], edx
0048F6CD |. 8D45 D8 lea eax, [local.10]
0048F6D0 |. E8 5FF0FFFF call unpacked.0048E734
0048F6D5 |. 8B45 D8 mov eax, [local.10]
0048F6D8 |. 99 cdq
0048F6D9 |. 8945 E8 mov [local.6], eax
0048F6DC |. 8955 EC mov [local.5], edx
0048F6DF |. 8B45 F0 mov eax, [local.4]
0048F6E2 |. 8B55 F4 mov edx, [local.3]
0048F6E5 |. 3B55 EC cmp edx, [local.5]
0048F6E8 |. 0F85 99000000 jnz unpacked.0048F787
0048F6EE |. 3B45 E8 cmp eax, [local.6]
0048F6F1 |. 0F85 90000000 jnz unpacked.0048F787 ; 这个地方跳转到错误信息
{
0048F787 |> \6A 00 push 0
0048F789 |. 66:8B0D 70F84>mov cx, word ptr ds:[48F870]
0048F790 |. B2 01 mov dl, 1
0048F792 |. B8 ACF84800 mov eax, unpacked.0048F8AC ; 软件注册号误!
0048F797 |. E8 EC4DFAFF call unpacked.00434588 ;弹出错误提示
}
这样就很明显了,0048F6F1 是一个判断走向的转折点也就是常说得爆破点。
我们再看
0048F6F7 |. B2 01 mov dl, 1
0048F6F9 |. A1 98FF4500 mov eax, dword ptr ds:[45FF98]
0048F6FE |. E8 9509FDFF call unpacked.00460098
0048F703 |. 8BF0 mov esi, eax
0048F705 |. BA 02000080 mov edx, 80000002
0048F70A |. 8BC6 mov eax, esi
0048F70C |. E8 270AFDFF call unpacked.00460138
0048F711 |. B1 01 mov cl, 1
0048F713 |. BA 1CF84800 mov edx, unpacked.0048F81C ; software\microsoft\windows\currentversion\sesoftware\googleqqscan
0048F718 |. 8BC6 mov eax, esi
0048F71A |. E8 7D0AFDFF call unpacked.0046019C
0048F71F |. 84C0 test al, al
0048F721 |. 74 0E je short unpacked.0048F731
0048F723 |. 33C9 xor ecx, ecx
0048F725 |. BA 68F84800 mov edx, unpacked.0048F868 ; gc_id
0048F72A |. 8BC6 mov eax, esi
0048F72C |. E8 DF0BFDFF call unpacked.00460310
0048F731 |> 8BC6 mov eax, esi
0048F733 |. E8 D009FDFF call unpacked.00460108
0048F738 |. 8BC6 mov eax, esi
0048F73A |. E8 2942F7FF call unpacked.00403968
0048F73F |. 6A 00 push 0
0048F741 |. 66:8B0D 70F84>mov cx, word ptr ds:[48F870]
0048F748 |. B2 02 mov dl, 2
0048F74A |. B8 7CF84800 mov eax, unpacked.0048F87C ; 软件登记注册成功!
0048F74F |. E8 344EFAFF call unpacked.00434588
0048F754 |. 33D2 xor edx, edx
0048F756 |. 8B83 08030000 mov eax, dword ptr ds:[ebx+308]
0048F75C |. 8B08 mov ecx, dword ptr ds:[eax]
0048F75E |. FF51 64 call dword ptr ds:[ecx+64]
0048F761 |. A1 142D4900 mov eax, dword ptr ds:[492D14]
0048F766 |. 8B00 mov eax, dword ptr ds:[eax]
0048F768 |. 8B80 04030000 mov eax, dword ptr ds:[eax+304]
0048F76E |. BA 98F84800 mov edx, unpacked.0048F898 ; 已注册版本
0048F773 |. E8 64BAFAFF call unpacked.0043B1DC
到此,我们可以分析出软件得思路为
【获得用户注册码】-----> 变换处理函数 得到一个值a
【硬件号】----------->变换处理函数 得到一个值b
if(a == b)
{
success();
regwrite();
.....
}
else
{
fail();
}
注册成功后,软件启动时,都会读取一个键值判断是否注册,当然这里就还有一个问题:别人监视注册表,完全可以发现你软件的这个小秘密,也是没有安全性可言的。
整套软件得注册思路就是这样,可以说这种注册方式太容易被破,这种方式即使用再厉害得加密算法,那也是白搭得:)
这是软件安全中弊端之一,后续,我们继续。逐渐完善自己在软件安全中可能遇到的问题的心得。
OK,软件有注册界面
输入正确得注册码,注册成功:) ,不然就会
分析后发现加壳,壳在这不是重点,所以直接说脱壳后得分析
在超级字符串中发现有这样得一行
文本字串=software\microsoft\windows\currentversion\sesoftware\googleqqscan
初步估计会在注册表中写一个键值,而且有可能作为下次启动,判断是否注册得一个依据。再找
发现“请输入软件的序列号”
后面两步 下断点
运行软件,点击注册
,弹出,输入这注册码的对话框,随便输入:123456789
0048F683 |. 3C 01 cmp al, 1
0048F685 |. 0F85 11010000 jnz unpacked.0048F79C
0048F68B |. 8D55 D4 lea edx, [local.11]
0048F68E |. 8B45 FC mov eax, [local.1]
0048F691 |. E8 4694F7FF call unpacked.00408ADC
0048F696 |. 8B45 D4 mov eax, [local.11]
0048F699 |. E8 1297F7FF call unpacked.00408DB0
0048F69E |. 8945 F0 mov [local.4], eax
0048F6A1 |. 8955 F4 mov [local.3], edx
0048F6A4 |. 6A 00 push 0
0048F6A6 |. 6A 49 push 49
0048F6A8 |. 8B45 F0 mov eax, [local.4]
0048F6AB |. 8B55 F4 mov edx, [local.3]
0048F6AE |. E8 9D60F7FF call unpacked.00405750
0048F6B3 |. 8945 F0 mov [local.4], eax
0048F6B6 |. 8955 F4 mov [local.3], edx
0048F6B9 |. 8B45 F0 mov eax, [local.4]
0048F6BC |. 8B55 F4 mov edx, [local.3]
0048F6BF |. 2D E3C30B00 sub eax, 0BC3E3
0048F6C4 |. 83DA 00 sbb edx, 0
0048F6C7 |. 8945 F0 mov [local.4], eax
0048F6CA |. 8955 F4 mov [local.3], edx
0048F6CD |. 8D45 D8 lea eax, [local.10]
0048F6D0 |. E8 5FF0FFFF call unpacked.0048E734
0048F6D5 |. 8B45 D8 mov eax, [local.10]
0048F6D8 |. 99 cdq
0048F6D9 |. 8945 E8 mov [local.6], eax
0048F6DC |. 8955 EC mov [local.5], edx
0048F6DF |. 8B45 F0 mov eax, [local.4]
0048F6E2 |. 8B55 F4 mov edx, [local.3]
0048F6E5 |. 3B55 EC cmp edx, [local.5]
0048F6E8 |. 0F85 99000000 jnz unpacked.0048F787
0048F6EE |. 3B45 E8 cmp eax, [local.6]
0048F6F1 |. 0F85 90000000 jnz unpacked.0048F787 ; 这个地方跳转到错误信息
{
0048F787 |> \6A 00 push 0
0048F789 |. 66:8B0D 70F84>mov cx, word ptr ds:[48F870]
0048F790 |. B2 01 mov dl, 1
0048F792 |. B8 ACF84800 mov eax, unpacked.0048F8AC ; 软件注册号误!
0048F797 |. E8 EC4DFAFF call unpacked.00434588 ;弹出错误提示
}
这样就很明显了,0048F6F1 是一个判断走向的转折点也就是常说得爆破点。
我们再看
0048F6F7 |. B2 01 mov dl, 1
0048F6F9 |. A1 98FF4500 mov eax, dword ptr ds:[45FF98]
0048F6FE |. E8 9509FDFF call unpacked.00460098
0048F703 |. 8BF0 mov esi, eax
0048F705 |. BA 02000080 mov edx, 80000002
0048F70A |. 8BC6 mov eax, esi
0048F70C |. E8 270AFDFF call unpacked.00460138
0048F711 |. B1 01 mov cl, 1
0048F713 |. BA 1CF84800 mov edx, unpacked.0048F81C ; software\microsoft\windows\currentversion\sesoftware\googleqqscan
0048F718 |. 8BC6 mov eax, esi
0048F71A |. E8 7D0AFDFF call unpacked.0046019C
0048F71F |. 84C0 test al, al
0048F721 |. 74 0E je short unpacked.0048F731
0048F723 |. 33C9 xor ecx, ecx
0048F725 |. BA 68F84800 mov edx, unpacked.0048F868 ; gc_id
0048F72A |. 8BC6 mov eax, esi
0048F72C |. E8 DF0BFDFF call unpacked.00460310
0048F731 |> 8BC6 mov eax, esi
0048F733 |. E8 D009FDFF call unpacked.00460108
0048F738 |. 8BC6 mov eax, esi
0048F73A |. E8 2942F7FF call unpacked.00403968
0048F73F |. 6A 00 push 0
0048F741 |. 66:8B0D 70F84>mov cx, word ptr ds:[48F870]
0048F748 |. B2 02 mov dl, 2
0048F74A |. B8 7CF84800 mov eax, unpacked.0048F87C ; 软件登记注册成功!
0048F74F |. E8 344EFAFF call unpacked.00434588
0048F754 |. 33D2 xor edx, edx
0048F756 |. 8B83 08030000 mov eax, dword ptr ds:[ebx+308]
0048F75C |. 8B08 mov ecx, dword ptr ds:[eax]
0048F75E |. FF51 64 call dword ptr ds:[ecx+64]
0048F761 |. A1 142D4900 mov eax, dword ptr ds:[492D14]
0048F766 |. 8B00 mov eax, dword ptr ds:[eax]
0048F768 |. 8B80 04030000 mov eax, dword ptr ds:[eax+304]
0048F76E |. BA 98F84800 mov edx, unpacked.0048F898 ; 已注册版本
0048F773 |. E8 64BAFAFF call unpacked.0043B1DC
到此,我们可以分析出软件得思路为
【获得用户注册码】-----> 变换处理函数 得到一个值a
【硬件号】----------->变换处理函数 得到一个值b
if(a == b)
{
success();
regwrite();
.....
}
else
{
fail();
}
注册成功后,软件启动时,都会读取一个键值判断是否注册,当然这里就还有一个问题:别人监视注册表,完全可以发现你软件的这个小秘密,也是没有安全性可言的。
整套软件得注册思路就是这样,可以说这种注册方式太容易被破,这种方式即使用再厉害得加密算法,那也是白搭得:)
这是软件安全中弊端之一,后续,我们继续。逐渐完善自己在软件安全中可能遇到的问题的心得。
赞赏
看原图
赞赏
雪币:
留言: