危险漫步博客
新鲜的“黑客思维”就是从全新的角度看待黑客技术,从更高的层面去思考;专注于黑客精神及技术交流分享的独立博客。
文章2307 浏览21468624

从教育网站作弊实例谈脚本编程

记得去年曾在危险漫步博客看过一篇关于全国继续教育作弊的文章,当时用的按键精灵模拟点击+加速器加速的方法,效果不错。近日突然想再看看时隔一年现在的继续教育网站有何变化。打开首页,果然变化不小,界面清爽、分类明确,比起一年前算是翻天覆地,国家效率不错,呵呵。界面是改了,防作弊又如何呢?好奇心驱使下,我问别人要了个ID登上去,并打开了学习界面。  

这里有必要再进行下简单说明。打开学习课程界面后,顶部是控制栏,我们要开刀的地方,下面大半部分是学习课程的地方,这里不予以理睬。控制栏中,中间有一计时器累计时间。计时器从0开始到20分钟不再累计。右面有一按钮“更新学习时间”,按钮在计时器时间小于10分钟为灰色不可点击状。计时器大予10分钟时,点击按纽向服务器累加计时器中的时间,也就告诉服务器你已经学习了这么久,同时计时器清零。由于计时器在20分钟后不再增加,所以单纯的挂机是不行了。

再尝试老方法,按键精灵加变速器,模拟点击后网页报错。后单使用按键精灵和单使用加速器均不行。初步分析后推测,服务器应该会在收到更新时间后,将收到的时间和服务器标准时间比对,假若服务器时间过了1分钟,而用户在1分钟内就提交了几次更新时间,显然不合常理,会被认为作弊,除非黑掉服务器,但是这路绕的太远了。

后尝试了一些简单方法,多开网页、灰色按钮突破等,也不行。抓包分析,得到的都是加密后的乱码。看来想要累计学习时间,只有另辟它径了。

一、脚本

首先庆祝一下,筹划已久的黑客内参论坛即将开始建设,到时候还请大家多多支持!好了闲话不多说,我们直接进入主题。

闲逛时发现一个半自动QQ号申请器脚本,大受启发。我们知道,网页内容的一些元素,如超链接、按钮、文本框等,在正常情况下会响应用户Tab按键,且有响应顺序,有规律可循。按下按钮后焦点会重置,正好可行。我的想法是,事先数好“更新学习时间”按钮响应所经过的Tab次数,后用脚本模拟之(其他的也可以,脚本相对简单),当焦点移到按钮上时,模拟回车点击。设好延时时间,如15分钟,循环运行脚本。脚本大体如下:

代码很简单,最后再调用自身既可。不过想法虽好,但效果很不理想。一是会受干扰,其他程序弹出窗口什么的就会打乱顺序。二是必须保持浏览器为最前,想边挂机边玩游戏?找电视机玩小霸王去……远没达到我的要求,脚本完败。

二、网页元素

一筹莫展之时,突然想到WebBrowser。图个方便,我用VB。(We bBrowser控件在VB里面默认不显示,非精简版VB6.0在顶栏工程,部件一控件里面找到“Microsoft Internet Control”,打勾保存,控件栏最后一个地球型图标就是了。

我先用百度做实验,查看源码得到“百度一下”按钮相关代码为<input type=”submit” value=”百度一下”id=”su”>,id值为su,打开VB画好界面。

写好代码,将其运行。在WebBrowser中填好搜索框内容后,点击“模拟点击”,成功的模拟了点击。

原本以为就成功了,结果不料,依样的套到继续教育网站上时却出了错,无论如何都取不到“更新学习时间”按钮。换用GetElementByTagName、GetElementByName均不行。这着实让我郁闷了好一阵,直到现在也不知其故。有兴趣的朋友可以尝试研究一下。

三、PostMessage投递鼠标消息

一个星期后,终于找到另外的方法,依然用VB的WebBrowser,但模拟方法改用PostMessage直接发送鼠标单击消息,尝试后,效果不错。

设计模式下的WebBrowser居然显示“无法显示该页”,呃,奇怪。窗体Form1样式BorderStyle设为0 - None,也就是无边框,Left和Top设为0,WebBrowser的Left和Top也设为0,电脑用的坐标和日常用的数学坐标略有不同,电脑上是以左上角为坐标原点,向右X增加,向下Y增加。下文要使用到的GetCursorPos取鼠标位置,得到的是屏幕上的绝对位置,而模拟点击需用到的坐标位置是相对于WebBrowser控件的相对位置(即以WebBrowser的左上角为原点)。置WebBrowser于左上角是为了让其相对位置和屏幕绝对位置重合,从而免去繁琐的坐标转换。  

1、申明部分

代码较长,文章里就不详写了。所需要申明的API函数有:GetCursorPos(取鼠标位置)、PostMessage(模拟点击用到)、FindWindow、FindWindowA(这两个都是取WebBrowser句柄用到)。

还需申明一个POINTAPI用于保存鼠标位置:

2、取“更新学习时间”按钮坐标

简述一下代码,两个Text实时显示鼠标位置。点击command2后第5秒,两个Text将定住。也就是,用户按下command2后将鼠标放在“更新学习时间”上,5秒后将记录鼠标位置,也就记录了按钮位置。(其实我原先的想法是用户鼠标停在按钮上,然后通过按快捷键来记录。但是VB里面的热键注册简直变态,不仅代码长,而且还容易死。其间VB就死了一次,害我重写了一遍程序。)

3、取得WebBrowser句柄

取WebBrowser句柄这个看似简单的部分。之前我用WebBrowserl.hwnd,结果总是报错。

后来百度一下才知道,WebBrowser不能用这个方法取句柄。时间仓促,具体原因没详看,我也没弄懂,总之我剽窃了一段取句柄的代码,未出差错,这里就不详说了。

4、投递鼠标消息

要用到PostMessage,函数原型是:Bool PostMessage  (HWND hWnd, UINT Msg,WPARAM wParam, LPARAM IParam) HWND是句柄,Msg是被寄送的消息,wParam和IParam是附加消息。执行后返回一个Bool值,成功True,失败False。具体到模拟鼠标中来,Msg填&H201是按下鼠标左键,填$H202是放开鼠标左键。IParam应该填鼠标要点击的坐标,注意这里不能直接填坐标,应该事先进行高地位转换。

5、程序收尾

剩下的都比较简单,叙述一下,代码就不贴了。

停止键将Timer3设为0。退出键代码为End。跳转那里是WebBrowserl.Navigate (text3.text),Text3是输入网址的地方。

到这里,这个程序就基本完工了,每分钟自动点击“更新学习时间”按钮,笔者亲测了将近一个小时,未出现任何问题。

四、小结

时间仓促,程序并未达到最佳效果,还有许多待改进的地方。由于设置了Form的Style为0 - None,造成程序无法最小化,可以用置于系统托盘的方法解决。热键的方法也浅尝辄止,有兴趣的朋友可以尝试一下。

当然,以上方法完全不止可用于继续教育作弊,稍加改动就可以做出其他程序来。比如,可以用来做自动填表单、网页游戏挂机、论坛自动发帖等。发挥的余地还有很多,希望大家在编程的路上多研究多探索。

相关推荐