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

圣诞之际,到处都有很多庆祝的方式,学校一个学生技术团队出了一个圣诞网页游戏,上链接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验证机制防止刷分。

最后还是祝大家圣诞节快乐!



©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页