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的详细内容...