分析的很清晰,留作学习资料
前言
不可否认,目前阿里旺旺垃圾消息还是比较多的。这个现状并不可怕,只要我们真正花时间和精力去解决,一定能大为改善。
知己知彼方能百战百胜,要解决垃圾消息的问题,必须要从以下方面入手分析:
◆垃圾消息发送的必要条件
◆目前市面上的群发软件的工作原理
◆我们的漏洞
◆垃圾消息内容分析
其中,垃圾发送的必要条件是最应该仔细分析的,因为既然是必要条件,是缺一不可的,只要能斩断其中的某个条件,或许就可以极大的改善。
分析市面上流行的群发软件的工作原理,有助于我们针对性地推出一些防御措施。虽然堵漏洞不是治本的方法,但是某些时候的确也是比较有效的方法。
分析我们的漏洞,有助于我们提高自身的免疫力,使得垃圾消息的发送者无机可乘。
对垃圾消息的内容进行分析,可以让我们设置一些过滤器,做到即使收到也能不显示出来,以免污染我们的眼球。这基本上是最后一道防线了。
垃圾消息阿里旺旺的用户造成了一些不便,同时也极大的损害了阿里旺旺这个品牌。因此本人经过一段时间的思考和分析,总结了一些心得,经过组织形成了本文。
现状
目前市面上比较流行的IM产品主要有QQ、MSN、阿里旺旺、雅虎通、gtalk等等,对于一些比较冷门的IM,不在本文的分析之内。
通过网上一些网友的文章基本上可以了解到,目前QQ和阿里旺旺的垃圾消息是比较多的,而MSN和雅虎通相对要好一些。这是偶然的情况吗?其实偶然中是有必然的因素在里面的。
是否是我们的用户比较容易引起发送垃圾消息者的兴趣?答案是”错”。阿里旺旺的用户和别的IM的用户没有什么本质区别。如果垃圾消息的内容主要是广告,这或许还可以说是因为发送者认为针对阿里旺旺用户发送广告比较有价值。但问题是垃圾消息的内容很多是诈骗信息,我们总不能说是阿里旺旺的用户比较啥,容易诈骗成功,因此骗子喜欢发给阿里旺旺的用户。事实上,诈骗信息的现状仍然在QQ、阿里旺旺上比较多,而在MSN等上面相对要少一些,这个就基本可以排除因为用户群不同而导致的垃圾消息数量的差异了。
真正的原因是什么呢?我们有必要讨论一下垃圾消息群发的必要条件了。
一个必要条件及我们的漏洞
要解决任何事情,都要先找到这件事情发生的原因。只要原因找到,事情顺理成章的就能解决了。就像修改软件的BUG,一旦这个BUG的重现路径被找到,这个BUG其实就可以说已经被解决了。因此我们要想解决垃圾消息泛滥的问题,一定要先找到垃圾邮件发送的路径,或者说是必要条件。
如果我们是垃圾消息的发送者
有时候换位思考一下,把自己放在进攻方,这样做起防守的时候会比较容易一些。现在我们假设自己是一个开发垃圾消息群发器的人。
假设我们是开发垃圾消息群发器的人,第一步会如何做?当然是首先获取一个真实,精确的用户ID列表。如果拿不到这个列表,就无法实现群发。可以肯定,如果一款IM产品,或者是邮箱产品,如果能很方便地得到这个ID列表,那么这款IM或者邮箱必定垃圾信息和垃圾邮件会比较多。
如果我要做一个QQ的垃圾消息群发器,生成ID列表是毫无技术含量的。因为QQ的号码是一个数字,而且随着时间的推移,全国QQ用户的号码放在一起已经成了一个基本连续的数列了,因此只要写一个简单的程序,把某个整数每次加一就能生成一个相当精确的ID列表了。因此QQ上如果垃圾消息不多,简直没有天理了。
看MSN,垃圾消息相对来说是不算多的,原因何在?其实很简单,和MSN使用邮箱作为ID是有点关系的。虽然从全球范围上看,垃圾邮件的数量相当惊人,但实际上,如果要通过程序穷举生成的邮箱ID列表,其中有效邮箱的数量,或者说命中率是不高的。一个垃圾邮件的发送者必定从某些渠道搞到一个精确的,真实的邮件地址列表,通过这个列表来发送垃圾邮件。
如何获取阿里旺旺的ID列表
回到阿里旺旺上面来,要发送阿里旺旺的垃圾消息,同样必须先拿到一个精确,真实的ID列表。目前阿里旺旺(包括贸易通和淘宝以及口碑等)的ID体系也是使用字符,数字等构成,比QQ好一点,不容易通过编写程序遍历的方式生成精确,真实的ID列表。那么为什么还是有这么多垃圾消息呢?
目前,贸易通的ID就是中文站的ID,淘宝旺旺的ID就是淘宝网的ID。我们知道,如果正面攻击没有效果的话,可以从侧面,后面甚至从顶上进行攻击。如果我要要获取精确,真实的ID列表,我就从中文站和淘宝网入手。
用IE打开下面这个网页:
http://search.china.alibaba.com/search/offer_search.htm?keywords=%B5%E7%C4%D4&do=true&doSearchNews=true&catcount=10,将得到一个搜索”电脑”之后的结果,在每一条结果的最后都有一个按钮”跟我洽谈”,如图:
众所周知,点击”跟我洽谈”按钮就可以打开阿里旺旺的跟对方洽谈。
查看上面那个网址对应的HTML的源代码,会发现,内容里有搜出来的每个用户的ID,例如:value=rifeixiang type=checkbox name=191930532 memberId=”rifeixiang”> </DIV>。只需要写一个很简单的程序,就可以把ID从html里解析出来,保存成一个列表。这个程序只要运行一段时间,就可以获得一个非常庞大的列表。有了这个列表,就可以很容易的遍历这个列表,发送消息。
从淘宝网的网页上抓取ID的方法和中文站的略有差别,但原理极为类似,同样只需要一个很简单的程序就可以解析出一个详细的ID列表。
可以设想,我们增加获取ID列表的门槛,必定会改善目前垃圾消息泛滥的状况。
垃圾群发器原理
其实,目前市面上流行的垃圾消息群发器相当的没有技术含量,基本上都是通过模拟人工的方式进行发送的,就是用电脑模拟人的动作进行发送。目前在google上能搜索到的群发器,还没有通过破解协议来发送的。这一方面可能是破解协议相对来说有点难度,另一方面可能是电脑模拟人的动作太简单,因此没有必要去破解协议。
以目前市面上比较流行的《小康淘宝旺旺群发 2008贺岁版》为例,在它的动态信息里,有下面这段话:
这里基本上讲出了这个软件的实现原理。只要我们有针对性地加以防御,应该不难。
电脑模拟人工发送,分解开来的动作就是:指定用户打开聊天窗口->粘贴内容到输入框->发送一个WM_COMMAND消息到聊天窗口,模拟鼠标点击”发送”按钮的事件,发出消息。这一个序列用软件自动完成即可。当然也可能是真的模拟一个鼠标点击事件出去,不一定直接发送WM_COMMAND。正是因为基于模拟人工发送,我们是很难在服务器端加以控制的。因为即使通过限制发送频率,限制为没10秒才能发送一条(这个已经是一个非常大的时间了),我们可以通过计算得到,每天可以有24*60*60/10 = 8640条消息可以被发送。如果同时开100个旺旺进行发送,这个数字就是864000,非常大了,相当于三分之一的在线用户都能收到了。
通过活跃度限制发送的数量同样也用处不大,因为我注册一堆帐号,写个程序互相发点东西,用不了几天这些帐号的活跃度就够了。现在市面上已经有自动注册中文站帐号的软件,可以很方便地注册用户。
过滤关键字基本上也有点困难,比如说我发送一条介绍我店铺的消息出去,即合理又合法,凭什么把这条消息过滤掉?
解决方案分析
是否无法解决?只要我们下决心,一定是可以解决的。解决垃圾消息不是阿里旺旺一个团队的事,而是整个集团的事,各子公司要通力合作。
第一步要先斩断获取ID列表的途径。有人会说现在发送垃圾消息的人手里都已经有了一份ID列表了。这话不错,但亡羊补牢,为时不晚。不能说因为别人已经有列表了,我们就不在这方面加强。而且如果做了这部分工作,至少发垃圾消息的人拿不到新用户的ID,这样新用户至少可以免受垃圾消息的骚扰。至于如何做这部分工作,需要中文站和淘宝网配合,不过至少可以做到在网页中不显示ID的明文。
关于电脑模拟人工发送,或许使用非窗口控件代替窗口控件是一个解决方案。使用非窗口控件,就无法通过枚举或者查找窗口的方法来得到窗口的句柄,从而也无法给窗口发送消息。不知MSN之类的IM使用的控件都是非窗口的,是不是出于这个目的考虑。
Windows里有几个API,可以直接模拟鼠标和键盘事件,对于这种情况,我们可能需要做一些判断,判断当”发送”按钮被点击的事件来的时候,是用户鼠标或者键盘操作产生的,还是通过程序发送过来的。结合人操作电脑的一些客观情况,这个判断应该不难完成。
基于客户端的防范,有一个必须要面对的问题是,如果发送垃圾消息的人使用的是老客户端来发送,那么是无法防范的。在条件满足的时候,应该强制用户升级到某一个版本以上的客户端。
另外,从客户端看,可以考虑加一个复杂一点的垃圾消息判断机制,能相对准确地判断出一条消息是否为垃圾消息。仅仅是检测关键字是远远不够的,不但很容易漏过消息,更可能误杀消息。这个功能值得投入一定的时间和人手来研究一下,或者和目前业界一些有经验的公司或个人合作。
总之,解决垃圾消息是一项长期的过程,是一个道高一尺,魔高一丈的斗争过程。没有简单的方案来彻底解决,我们所能做的就是积极防范,同时提高自己产品被利用的难度和门槛。相信只要我们能下决心投入精力去做,垃圾消息泛滥的状况一定会改善。