好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

腾讯3366游戏分数任意修改 - 网站安全 - 自学php

3366中任意一个可以和好友PK分数的游戏,如 飞天忍者猫 http://www.3366.com/flash/1000168.shtml

 

开始游戏,结束时Tamper数据包:

 

POST数据为:

 

 

 

 

从内存中提取swf(或直接 下载 )分析源代码,该swf会加载远端api的一个swf(如果没改名的话叫openservice_as3_v3.swf),再拿回来反编译分析代码。发现有这么一个函数:

 

 

 

private function getFinalKey(param1:String, param2:Number) : String { if (param1) { } if (param1.length == 48) { } if (param2 > 999999999) { return null; } var _loc_3:* = param1; param1 = param1.substr(42, 6); var _loc_4:* = parseInt(param1, 36); var _loc_5:* = _loc_4.toString(35); var _loc_6:* = _loc_5.length; var _loc_7:* = parseInt(param1.substr((param1.length - 1)), 36) % _loc_6; var _loc_8:* = param2.toString(36); var _loc_9:* = _loc_5.substr(0, _loc_7); var _loc_10:* = _loc_5.substr(_loc_7); var _loc_11:* = _loc_7 + 10; var _loc_12:* = _loc_11 + _loc_8.length; var _loc_13:* = MD5.hash(_loc_11.toString() + param2.toString() + _loc_12.toString()); var _loc_14:* = _loc_13.substring(6, 10); var _loc_15:* = [_loc_11.toString(36), _loc_9, _loc_8, _loc_10, _loc_14, _loc_12.toString(36), _loc_3].join(""); return _loc_15; }// end function

 

 

 

 

 

这个函数用于生成最后KEY,该函数有2个输入值,一个是得的分数(我们修改这个),然后是一个关键KEY(param1)。

 

观察:

 

var _loc_3:* = param1;

 

 

var _loc_15:* = [_loc_11.toString(36), _loc_9, _loc_8, _loc_10, _loc_14, _loc_12.toString(36), _loc_3].join("");

 

 

 

可以知道这个关键KEY 位于 最终 KEY 的末尾。 通过多次抓包发现 最终KEY的后48位都是不变的。 所以我们试着取 关键KEY 为 最终KEY后48位。

 

 

 

然后我们把关键KEY和想要修改的分数作为参数 执行 这个函数中的算法(可把as代码改成js代码直接在浏览器console里跑)得到最终KEY。然后 tamper 提交。 修改成功。 

 

 

修复方案: 1. 完善认证算法,不要把关键KEY完整放在最终KEY之内。

 

2. 关键代码 源码 混淆。 

 

查看更多关于腾讯3366游戏分数任意修改 - 网站安全 - 自学php的详细内容...

  阅读:86次