论坛上面主要讨论单机软件安全,而在网络通信安全方面的帖子比较少。下面说说我对网络应用软件数据安全的一些看法,不知道有没偏离论坛的主题。
我认为网络数据安全归根结底是软件安全,任何网络数据都是通过应用软件发送除去的,如果软件做的无懈可击,也就不存在网络数据安全的顾虑。因为任何被截获的数据对于别人来说都是一些不可逆的乱码(网络攻防不属于本文讨论范围)。
想解密网络数据,首先需要知道数据特征和解密算法。而这些从哪里来呢?从软件中来!软件的服务器怎么识别数据的,就采用同样的方式。服务器怎么解密我们就怎么解。软件的运行方式自然需要去逆向分析。
常用断点如下:WSASend、WSASendTo、WSARecv、WSARecvFrom、send、sendto、recv、recvfrom。对于一般的软件下这些断点都是可以截获数据的。然而有些是例外,我见过有款游戏采用动态加载DLL的方式,将函数入口地址保存来使用。因此输入表中不含有这些函数,也无法通过BP 函数名下断点。不过可以手动定位函数并下断点,对于加具有代码抽取的功能壳的,而且脱起来麻烦的则可以手动定位函数并在函数结尾的地方下断点。类似的反调试方式很多,在此不在赘述。
常用算法:
1.  简单的异或或者自己写的算法,强度较低。
2.  标准算法库,强度较高。
这些看雪上面的文章很多。我在此就不再多说。
A.  首先说说目前主流的一些网络应用软件。
1.  IM类软件,例如QQ、MSN等。IM类软件除文本聊天外一般具有语音视频和文件传输的功能。对于文本聊天,由于数据量比较小。一般不注重加密算法性能,所以加密做的比较强。但是对于语音视频和文件传输,由于数据流量太大,如果采用复杂的加密会严重影响服务器的性能。因此一般采用简单的加密算法甚至不加密。MSN就聊天明文的!而MSN的语音视频同样是不加密的。因此只要截取它的语音视频数据,再调用它的解码器(比如视频是WMV3编码)就可以还原其音视频。以我分析过的软件来看,大部分IM类软件其聊天和语音等都是采用可逆的对称加密算法,只要逆向其程序取出其中的算法对网络上相应特征的数据进行解密即可。对于用密码来加密的,当你截获其处理过的密码(比如MD5加密)可以采取穷举来破解。比如QQ的破解。
2.  VOIP类。在IM类中一般都集成了VOIP功能,主要的区别是VOIP类软件可以拨打固定电话或者手机。对于目前的一些主流的VOIP类软件,大部分采用异或等简单运算来加密数据流。采取的协议则是SIP 2.0 或者H323,现在SIP已经逐步取代H323而成为主流。这2种协议的共同点是数据传输采用RTP协议,该协议可以使用UDP也可以使用TCP,其交互过程网上有介绍。当采用嗅探技术获取到其协商过程后,对获取的端口和IP进行过滤。剩下的就是RTP数据,然后再验证RTP的合法性,正确后取有效数据段进行解密重组。再用RTP中交互的解码算法进行还原,再调用相应的音频解码器播放即可(对于某些厂商自己写的编码方式,直接调用其DLL或者注入其程序解码即可)。目前采用的广泛的主要是GIPS、G729、G721等编码。注:我发现目前加密措施做的好的VOIP逐渐成为主流,比如Skype、UUCall。可见人们对网络传输的安全性越来越重视了。
3.  游戏类。以我分析过的一些游戏来说,游戏类软件的数据安全做的比一般软件要强的多。作为目前主流的游戏,其反外挂措施做的都很不错,这些反调试分析措施让人头疼不已。太难处理的我一般都是直接放弃,花太多时间来分析实在是得不偿失。而且花了时间还不一定有成果。网络游戏的特点在于登陆,一般有用户登陆服务器、角色登陆服务器、游戏等。要对特定的端口和IP进行数据过滤比较烦琐。一般服务器列表最先通过更新服务器获取,然后用户选择相应的服务器进行登陆,其登陆数据的加密一般都是上下文相关的,只截取一个数据包无法成功解密数据。游戏这个东西让我比较头疼,在此不多说。
4.  邮件。对于普通的邮件来说。其登陆方式是明文传输的。客户端登陆采用SMTP,POP3协议,或者通过网页登陆,不过现在有些网站采用HTTPS来登陆邮箱,HTTPS采用SSL加密,安全性极高。
B.  数据截取方式。
以上所说的都是数据解密还原,当然有人会说我都截获不到数据。如何进行这些操作呢?下面我简单说一下数据截取。
1.  假如主机处于一个局域网中,而局域网是基于集线器连接的。熟悉计算机网络的都知道集线器的工作原理,我们可以截获别的PC所发送的数据,这个很简单。
2.  然而如果所处的网络不是局域网,或者局域网是通过路由器来连接的呢?有一种方法可以实现,不过有一定的局限性。因为我们需要知道的路由器的用户名和密码(只要能够获得管理权限即可,由于LINUX安全性高,这个很难。不过一些路由器内置帐号是固定的,比如D-LINK和SMC的部分产品)。进入路由器内部实现路由转向的功能。假如先TELNET进去后进行操作。对于这些路由器,一般的工作原理是嵌入式LINUX系统,其路由转换功能并非程序员自己写的。而是基于开源的IPTABLES,进入后建立新的路由表(有兴趣的可以参看<<LINUX 网络防火墙>>),将数据指向你的电脑,在你的电脑中用IFCONFIG建立一个逻辑网卡,然后在你的电脑中实现一个简单的NAT功能,将数据通过这个链路重新路由回去,你的程序用来监听数据流经的网卡即可。这需要LINUX系统下实现。有人会说为什么不直接写个程序挂在路由器上?因为嵌入式路由器的硬件平台和编译器是特定的,PC上面编译的程序跑不起来。
3.  如果你会入侵挂马在一些路由PC服务器上面。这样你就可以监听通过这个服务器的数据。呵呵。
4.  你是网络管理员,假如你要监听公司员工上网数据,程序直接放在公司网络出口上面就OK了。现在市面上卖的一些网络监控软件基本都是给网管用的。
C.  安全防护的一些措施。
由于是防止网络数据被解密,而不是本机数据。因此这里不谈反调试措施。
1.  可逆对称算法性能很好,安全性很差(其强度在于KEY的使用),不推荐单独使用。
2.  不对称不可逆加密算法,强度很高。速度较慢。不适合进行大规模的数据加密。
3.  2者结合使用来进行加密,用不对称不可逆算法进行交互来生成对称算法所需要的KEY(比如RSA)。由于KEY在网络中无法被解密,因此可以保证后面的算法的安全性。而KEY的数据量是非常小的,只有在连接的时候加密解密一次。因此也保留了对称算法的高效性,不过这样的加密需要服务器存储每个用户登陆时交互的KEY,需要占据部分内存。在我印象中百度HI就是采用RSA的数字签名再配合RC4加密。而QQ的数据加密强度来源与用户密码的强度,我觉得让用户自己来承担网络安全风险是不太负责任的。
4.  由于网络监听都是有一定的过滤条件,因为网络数据流量实在太大。因此只要能够欺骗监听软件即可实现反监听从而保护你的数据。对于单一程序嗅探工具无效,因为人家订上你了肯定会采取相应处理。因此只能采用加密强度来提高安全性。而对于多类型的网络监听软件有作用。因为类型多了出于性能考虑必然要使用数据分流来实现。其方式可以采用以下几点:
a)  不采用你自己定义的端口而采用80、443,21等端口。比如443端口是用来SSL加密的,你可以将包文头模拟成SSL来增加软件判断难度。
b)  动态IP,通过下载加密后的服务器列表来获取IP地址。
c)  动态端口,端口通过与服务器交互动态获得。
d)  包文头不采用固定标志,一些软件通过数据内容的头几个字节固定标志来分辨是登陆还是下线等操作,建议这些标志也一同进行加密。这样的数据杂乱无章。
总结一下,总的来说是加密容易解密难。可惜目前大部分软件网络数据加密做的很差劲,而只是一味强调软件的反调试,甚至只是加个壳,应该是不够重视的原因。
以上只是我个人的一些看法。绝大多数经过实践证实,但由于水平有限,不足之处希望有人指出。顺便说一下,我觉得软件安全这行真的非常偏,加上目前的经济危机,不知道工作好不好找,而且这一行的如果单干的话好象只有写外挂或者病毒盗号之类违法的事。请大家谈谈自己的看法。