您的位置:首页 > Web前端 > HTML5

刷一个基于html5开发的网页圣诞游戏

2013-12-25 16:45 573 查看
圣诞之际,到处都有很多庆祝的方式,学校一个学生技术团队出了一个圣诞网页游戏,上链接http://christmas.hustonline.net/game1。下面这是奖项,



主要是首页的奖品很诱人,从昨天也就是平安夜这天开始就开始上线了,看了一下这基于html5的游戏确实还不赖,个人觉得js这个发展趋势还是真的不容小觑啊!然后想着要看能不能外挂一下的!结果昨天很容易就破了,因为虽然js前台写的很好,但是后台没什么判断,处理的比较粗糙。因此和别人说了之后,今天圣诞节就改进了不少,每次提交分数的时候先请求一个auth密文,然后再和分数一起发回服务器进行判断,其中还特别是用了cookie存储了用户id和一段加密字符。为此是用了php的curl库,开始了刷分的过程。

首先,在手动玩一次之后,开启网络后台发现js异步发送了两个请求,如下图:



第一个是先获取auth密文,查看详细信息可以发现发送的内容和返回的内容,如下:


(ajax post的数据)


(返回的auth密文)

这些密文将在第二个请求中按照一定的规则发送到后台进行验证。下面分析第二个请求的内容:



经过多次试验,发现发送的数据前两对数据就是来自第一次请求返回的四个密文,分布是按照第一个请求返回的index数组去掉对应个数个字符后截取8个和13个字符组成发送请求的信息。然后再加上name、score等其他信息一起发送即可。经过以上分析,最终的源码给出如下:

<?php
set_time_limit(60);
ignore_user_abort(true);
date_default_timezone_set('PRC');
error_reporting(0);
$start = microtime(true);

//获取auth
echo "<strong>开始发送请求end_auth...</strong><br/>";
$headers['Content-Type'] = 'application/x-www-form-urlencoded';
$headers['Content-Length'] = 20;
$headers['Accept-Charset'] = 'UTF-8,*;q=0.5';
$headers['Host'] = 'christmas.hustonline.net';
$headers['Accept-Encoding'] = 'gzip,deflate,sdch';
$headers['Origin'] = 'http://christmas.hustonline.net';
$headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31';
//$headers['X-Requested-With'] = 'XMLHttpRequest';
$headers['Referer'] = 'http://christmas.hustonline.net/game1';
$cookieStr = 'Hm_lvt_9b10ce606494df8b25b4ee1e6c00852d=1385282383,1386344607; uid=4007; PHPSESSID=thgk7nd8b637ll0hlcsrosq550';

$postStr1 = "ARG1=0&ARG2=1&ARG3=2";
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, "http://christmas.hustonline.net/game1/end_auth");
curl_setopt ($ch, CURLOPT_HTTPHEADER , $headers );
curl_setopt( $ch, CURLOPT_HEADER, 0);   //不返回响应头信息
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);   //保留返回状态信息
curl_setopt($ch, CURLOPT_COOKIE,$cookieStr);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postStr1);
$backInfo = curl_exec($ch);
curl_close ($ch);
$auth = json_decode($backInfo,true);
//auth为一个二维数组,index包含四个数字和keys包含四个加密字符串echo "<pre>";var_dump($auth);echo "</pre>";

//构造对应的index起始的8个和13个字符的请求字符串
$authIndex1 = substr($auth['keys'][0],$auth['index'][0],8);
$authKeys1 = substr($auth['keys'][1],$auth['index'][1],13);
$authIndex2 = substr($auth['keys'][2],$auth['index'][2],8);
$authKeys2 = substr($auth['keys'][3],$auth['index'][3],13);
$msg = json_encode(array($authIndex1=>$authKeys1,$authIndex2=>$authKeys2,"name"=>"oshyn","score"=>97900,"tel"=>13647215948,"game"=>1));
$postStr =  "msg=${msg}";
//print $postStr."\n";

//请求刷分数
$scoreHeader = array();
$scoreHeader['Accept'] = '*/*';
$scoreHeader['Accept-Charset'] = 'UTF-8,*;q=0.5';
$scoreHeader['Accept-Language'] = 'zh-CN,zh;q=0.8';
$scoreHeader['Connection'] = 'keep-alive';
$scoreHeader['Content-Length'] = strlen($postStr);
$scoreHeader['Content-Type'] = 'application/x-www-form-urlencoded';
$scoreHeader['User-Agent'] = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)';
$scoreHeader['PHPSESSID'] = 'thgk7nd8b637ll0hlcsrosq550';
$scoreHeader['Host'] = 'christmas.hustonline.net';
$scoreHeader['Origin'] = 'http://christmas.hustonline.net';
$scoreHeader['Referer'] = 'http://christmas.hustonline.net/game1';

$scoreCh = curl_init();
curl_setopt ($scoreCh, CURLOPT_URL, "http://christmas.hustonline.net/game1/upload_score");
curl_setopt ($scoreCh, CURLOPT_HTTPHEADER , $scoreHeader );
curl_setopt( $scoreCh, CURLOPT_HEADER, 0);   //不返回响应头信息
curl_setopt( $scoreCh, CURLOPT_RETURNTRANSFER, 1);   //保留返回状态信息
curl_setopt($scoreCh, CURLOPT_COOKIE,$cookieStr);
curl_setopt($scoreCh, CURLOPT_POST, true);
curl_setopt($scoreCh, CURLOPT_POSTFIELDS, $postStr);
$back = curl_exec($scoreCh);
curl_close ($scoreCh);
echo "<br><strong>返回结果:$back</strong>";
$end = microtime(true);
$taketime = sprintf('%.5f',$end - $start);
echo "<br/><strong>请求完成!用时${taketime}s.</strong><br/>";

?>
请求完成后,返回正确信息如下图所示:



完成之后,可以设置一个score分数值发送即可。当然这只是圣诞节活动,仅供娱乐,不支持使用任意恶性手段强制破解,也是出于对php的curl函数库的使用以及http协议的理解的基础和学习上娱乐而已。和别人交流的时候,有人说用TCP层传输分数等信息会更安全,不如这个游戏是基于html5的,因此只有现代浏览器支持,因此可以使用websocket来传输,不过原理都差不多。其实这个就是要构造一个完善的auth验证机制防止刷分。

最后还是祝大家圣诞节快乐!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: