国外某网络软件
加密分析,该程序使用Armadillo加壳,并使用网络验证,每次运行需要从该公司服务器申请执行许可。
通过IRIS监听验证过程,发现他的验证过程基于http协议,服务器端为asp,可以用比较简单的方法实现模拟验证服务器
他的详细验证过程如下
软件启动 
请求http://www.example.com/getver.asp
返回字符串 3.45 (比较软件本身版本号,=3.45则不提示升级)
获取硬盘物理序号并按照一定的规则转换成硬件码 (结果为212487602000,我的硬盘生成的是这个硬件码)
注册表读取用户名和注册码(已注册用户的用户名和注册码被写入注册表)
从注册表未能获取用户信息和注册码,提示注册,已注册则跳过下一步。
输入用户名netx注册码441363-112460-365001-427305,点击注册
软件提交数据到服务器验证
请求http://www.example.com/gen.asp?h=212487602000&u=netx&c=441363-112460-365001-427305
合法验证,返回程序运行许可字串示例:08f08f08f08f08f09f08f09f09f07f02e02e02e02e02e.47e13f09f14e13e13e13e13e13e13e13e13e13e13e12e08f08f08f08f08f57f17e13e26f23f23f23f23f23f23f24f24f24f23f20f22e
该字串随软件运行时间,用户名变化而变化
软件启动完成,各个功能正常使用。

不合法返回:error! 
软件各个功能不能正常使用。

已有合法注册码一组,现需要多台机器使用。破解方法如下:
修改系统system32\drivers\etc\目录下的hosts文件
增加解析记录
127.0.0.1       localhost
10.9.163.1      www.example.com #将验证服务器域名解析到本部门web服务器10.9.163.1 或者如下
#127.0.0.1      www.example.com#将验证服务器域名解析到本机

在本机IIS根目录或者web服务器根目录下建立getver.asp,gen.asp

getver.asp内容为3.45 

gen.asp内容为
<%
dim Http 
set Http=server.createobject("MSXML2.XMLHTTP") 
Http.open "GET","http://67.15.34.XXX/gen.asp?h=212487602000&u=netx&c=441363-112460-365001-427305",false 
'67.15.34.XXX为www.example.com的真实IP,因为该域名已经被转向,所以此处需要使用真实IP
Http.send() 
Response.write Http.responseText; 
set http=nothing 
%>

至此,运行软件,软件已经被欺骗到你指定的服务器进行验证,不论你的硬件id,和用户,注册码如何,都能通过自己的验证服务器获得合法的运行许可。

总结,该软件过于侧重自己的网络验证,忽视了基本的本地验证,获取的许可字串也没有经过严格本地的校验,直接应用于软件各个功能模块的许可判断。而且这个网络验证似乎太简单了,写出来不知道对大家有没有参考价值。

2005/7/24 网网 QQ:108508999

  • 标 题: 答复
  • 作 者:auser
  • 时 间:2005-07-25 10:13

用IP地址也不行,直接在路由上做个手脚就搞定。

具体的还是要把认证搞复杂一些。不能使用明码认证,每次通信数据都要不一样,使用不对称加密。当然还要结合本地认证进行辅助。

  • 标 题: 答复
  • 作 者:蓝色光芒
  • 时 间:2005-07-25 12:00

分两步验证,首先从服务器取得随机密匙,然后用这个密匙加密这些数据再发送。服务器需要保存密匙。

  • 标 题: 答复
  • 作 者:kernels
  • 时 间:2005-07-25 14:11

域名和ip都是不可信的, 需要动态加密才能有效保证验证的安全性.