内网通修改积分文件_【页游逆向】4399小游戏积分系统分析及修改积分
这篇文章是几年前写的,当时发布在我的博客中,由于我的博客已经年久失修,这几天就把博客中的内容都搬运到这来分享给大家。现在4399小游戏的积分系统好像已经没有了,很多flash小游戏也都已经下架,猜测未来会朝着H5页游方向发展,但这篇文章也能学到逆向思路和技巧。
偶然看到这个游戏,挺难玩的,而且把马里奥画的有点丑,今天我们就来通过对这款游戏的反编译来分析4399积分系统是什么样的以及修改积分上排行榜。
通过截包我们可以得到游戏的真实地址:
http://szhong.4399.com/4399swf/upload_swf/ftp5/haibo/20110511/1/mainload.swf
积分函数JS:
http://www.4399.com/jss/playerbg_jifen20140301.js
下载swf文件,用FFDec打开,可以看出这个swf是个Loader,载入的是二进制数据中的gamefile:
导出二进制数据,重命名为swf文件,再载入FFDec,然后分析代码:
显然这个swf也是个Loader,用于在游戏中显示排行榜、提交积分、即时获取游戏内的积分通过js传递到html页面显示等。
我们目的是修改积分,所以只要在这个积分传递过程中做手脚就可以了。来试试吧!
定位到提交分数的地方:
这里可以看出是和js相互通信,js中这个函数的地方:
其中提交积分的关键函数是:
get_max_soure(gameid,user4399id);//更新当前分数
这个函数有两个参数,一个是游戏id,一个是自己的4399id
游戏ID在flash常量定义中可以找到:
4399id可以进入你的个人主页中看到:
我们继续寻找积分调用的地方
就在这里,调用了js中的rdscore,我们去js中看看这个函数:
显而易见,我们调用这个函数就能改变面板上的积分
Javascript:rdscore('50000');
我们再执行
get_max_soure(gameid,user4399id);
提交积分
结果排行榜的分数依然是之前游戏内的分数。
为什么呢?让我们分析下提交积分的函数
可以看出这个函数只是更新了面板的数据,然后更新成就。数据是来自:
http://score.4399.com/get_topscore_forusercenter.php?callback=?&game_id=56259&user_id=1881037144
因此我们继续往上跟:
提交积分原来在这里!
LoadBytes相当于一个post请求,第一个参数是url,是常量:
private var URL_SCORE:String = "http://score.4399.com/submitscore_forusercenter.php";
第二个是个事件参数
他这里使用了匿名内部类来实现,用来和js进行一些交互
第三个参数就是post的参数了。就是这些:
我们截包后可以看到数据如下:
token=980a942d3fa726ec4b3d2e556c771aab&score=750&verify=bf621be32ad6654830c4e8d64e8393b1&autocommit=1&game%5Fid=56259&gs=1&time=1454063544314&game%5Fkey=a6231db93dfa5af2&starttime=1454062807192&uid=1881037144&username=hookd3d
其中有些数据是加密的,我们来一一解析:
Token:
其中URL_TOKEN是常量
http://score.4399.com/get_token.php
流程就是访问这个php得到
&token=980a942d3fa726ec4b3d2e556c771aab
然后去掉前面7位
得到980a942d3fa726ec4b3d2e556c771aab就是token
Score:这个没有加密,直接写任意数字即可
Verify:
这里一些的代码被混淆了,经过混淆处理后
我们可分析得出
Verify是由
"SDALPlsldlnSLWPElsdslSE" + temKey + lGameScore + gameID + starttime + gs + _tokenData + "PKslsO";
然后进行三次MD5得出的
我们再分别分析调用到的这些变量分别是什么
TemKey:
private function getIntegraKey() : String{ var _loc1_:String = MD5.hash(MD5.hash(this.gameID + "LPislKLodlLKKOSNlSDOAADLKADJAOADALAklsd" + this.gameID)).substr(4,16); return _loc1_;}
这里算法很清晰,我们可以直接调用
lGameScore:
应该就是游戏的分数
gameID:
56259
Starttime:
var _loc2_:Date = new Date(); this.starttime = _loc2_.getTime();
取当前时间 可以直接用
Gs:
当前关卡 取值来自这里
_tokenData:
就是上面获取的token
继续分析下面的参数,
Autocommit:
为1提交后自动看排行为0不自动看排行。
game%5Fid:
也就是game_id:56259
Gs:当前关卡 和上面一样取值第一关就是1
Time:
var ts:String = md.getTime().toString();
应该是时间
game%5Fkey:
game_key
private function getIntegraKey() : String{ var _loc1_:String = MD5.hash(MD5.hash(this.gameID + "LPislKLodlLKKOSNlSDOAADLKADJAOADALAklsd" + this.gameID)).substr(4,16); return _loc1_;}
也是个简单的算法,可以直接调用
Starttime:
var _loc2_:Date = new Date();this.starttime = _loc2_.getTime();
游戏开始时的时间。
uid=1881037144&username=hookd3d
这个就不用说了吧。
好了全部分析完了,可以看出我们关键要得出的参数是Verify。因为其中包含当前分数,我们修改了积分,这个值就也会变。
而其他的参数根据游戏不同而不同,这里我们仅测试这一款游戏,其他参数通过封包中已经得出,就不一一生成了。 所以要模拟POST请求修改积分只需计算出Verify即可,这里我们直接修改flash来修改分数。
分数的变量是lGameMidScore,与之相关的是
看到这里我们可以知道,上面我们修改的函数只是网页上显示的数据而已,并没有赋值到flash中提交分数中的变量Score,所以那些修改是无效的。
this.lGameMidScore = this.lMain.score + this._totalscore;
从这行代码看出
这里面分数来自于lMain.score
lMain就是loader的游戏类的了。
这里有很多修改点,我们为了方便,就直接改他获取的地方吧
给他加五万
变成这样
然后改下当前关卡,防止被检测到我们是作弊
他是从游戏中获取的关卡数
估算了下应该是有10关,就改成10吧
OK,保存看下效果
结果是运行后闪退。
这是由于这个flash是混淆过的,而FFDec处理不完全,所以导致内存错误闪退
修改文件不行的话我们可以使用Loader来修改,但是介于篇幅,我们还是直接改游戏主文件吧
导出后再载入FFdex
找到启动类
找到分数初始化的地方:
直接改50000
关卡也要改
保存之后依次替换回去,来看看效果怎么样:
结果是分数变动了,但是一开始游戏又全部清零了。
这是因为4399的Loader初始化的时候会把分数清零
但是这里获取的还是我们修改的50000
只是提交按钮不可用。
这时候我们上面分析到的提交分数函数就有用了
在浏览器地址栏输入:
Javascript:get_max_soure('56259','1881037144');
可以看到已经上了排行榜第一名,我们的目的也就达到了。
内网通修改积分文件_【页游逆向】4399小游戏积分系统分析及修改积分相关推荐
- 批量修改html文件内容,批量修改word文件内容 批量修改WORD文件的页眉页脚
批量修改多个Word文档内容 同时批量修改多个word文档步骤1把要批量修改的文档都放在同一个文件夹中同时批量修改多个word文档步骤2在修改前,先确定多个word文档文件要被修改的内容如小小要修改的 ...
- 人民币决定页游未来——8166网页游戏行业分析
过度提高付费玩家的满足感,迅速攫取游戏利益,无疑是"杀鸡取卵"!近日,百度网页游戏<九州三国>因为一场国战因免费玩家战胜了付费玩家,引起了RMB玩家的吐槽.进而事态转变 ...
- 网游放缓页游疾进 客户端游戏会被取代吗?
2010年,延续了十年高速增长的网络游戏陷入增长的瓶颈期.进入下半年以来,游戏公司营收增长放缓.裁员等新闻不断出现,让习惯了高速增长的游戏行业颇不习惯.不过,在不那么给力的去年,网页游戏却依旧实现了超 ...
- HTML5游戏_基于DOM平台跳跃小游戏开发_9.按键监听
HTML5游戏_基于DOM平台跳跃小游戏开发 按键监听 视频讲解 HTML5游戏 效果图 本章知识点: 对象自定义名称属性,可以用变量来命名属性名称 //这段代码把多个属性(品牌, 型号, 排量)赋给 ...
- mysql修改游戏元宝_页游源码【武斗乾坤】自带安装启动教程+元宝游戏数据修改教程+自由一键游戏启动服务端...
页游源码[武斗乾坤]自带安装启动教程+元宝游戏数据修改教程+自由一键游戏启动服务端_站长下载 资源说明: 1.本资源为一键启动服务端,只需要安装好所需组件一键启动即可运行. 2.资源默认为单机架设,无 ...
- Ubuntu18.04下用信使与Windows下用内网通互传文件
1.前言 前段时间把自己的笔记本装了Ubuntu18.04.因为是五年前的笔记本了,配置有点跟不上了,之前一直用的win10,后来想反正这个旧本本没啥用了,索性在折腾折腾,装个Linux系统玩玩,于是 ...
- c#小游戏_.NET手撸2048小游戏
前言 2048是一款益智小游戏,得益于其规则简单,又和 2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎" FlysEngine,从空白窗口 ...
- Android逆向 微信小游戏破解(一):我要当皇上满级修改
1.我要当皇上的wx小游戏修改 首先游戏长这个样子, 我的长这个样子 1.首先需要用的到的工具,抓包工具,postman 抓包工具有很多,自己百度一下吧.我用的是charles,这个是mac版本的.W ...
- 挖掘:如何用迅雷下载4399小游戏站内的所有游戏
偶然一次无聊想玩玩flash小游戏,于是就百度了一下,随意进了一个网站--4399,然后漫无目的瞎看,点了一个叫特技摩托3的小游戏,不玩不知道,一玩就从此爱不释手,可是每次玩都要打开网页,然后再等它加 ...
- python tkinter火柴人_用Python实现童年小游戏俄罗斯方块!别说还挺好玩!
原标题:用Python实现童年小游戏俄罗斯方块!别说还挺好玩! 前言 大三上学期的程序设计实训大作业,挑了其中一个我认为最简单的的<图书管理系统>来写.用python写是因为py有自带的G ...
最新文章
- 关于印发《会计电算化管理办法》等规章的通知
- MMDetection-运行时
- SNAT,是源地址转换,其作用是将ip数据包的源地址转换成另外一个地址
- 程序员自身价值值这么多钱么?
- [Angularjs]ng-select和ng-options(转载)
- think php left join,Thinkphp两张数据表left join怎么让相同字段不被覆盖?
- Linux排查java程序CPU占用过高问题
- 传播路径图调查2013年初
- 使用vue-cli+axios配置代理进行跨域访问数据
- hbase中为何不能向表中插入数据_MySQL数据库中表记录的增、删和改操作
- php serialize参数,php serialize(),unserialize()
- 12款网盘搜索神器以备不时之需要
- 申报快结束!2022年武汉经开区在孵企业房租申报奖励补贴补助、申报条件材料
- 《大天蓬》片尾升华,燃情!
- 两部手机怎样才能把数据都传过来_新旧手机怎样互传数据?
- 一个 vue 登陆页面
- metaspolit提示Exploit failed: You must select a target.
- AI:2020北京智源大会与五位图灵奖得主和100多位专家《共同探讨人工智能的下一个十年》——6月21日~6月24日的日程安排(实时更新,建议收藏)
- 举例理解transformer中的位置编码
- Python跨文件全局变量的使用技巧
热门文章
- STM32F407 硬件IIC驱动MCP4017 数字电位器
- android 谷歌地图离线访问,Android版谷歌地图更新 新增离线浏览功能(图)
- 数据库存储过程讲解与实例
- windows_98.css—— 实现Win98效果的网页样式
- Tribon参数化建模之__对型材端切的参数化建模解析
- emWin—数字软键盘
- (二十三)美萍酒店管理系统:系统维护_系统设置_商品设置_添加类别、添加商品
- 农民讲习所建立通用程序 7 设计通用按键扫描模块
- 如何在OTN网站下载Grid方法(Oracle RAC)
- Java不能做游戏?快来看看这个Java版超级玛丽吧。