内网通修改积分文件_【页游逆向】4399小游戏积分系统分析及修改积分
偶然看到這個(gè)游戲,挺難玩的,而且把馬里奧畫(huà)的有點(diǎn)丑,今天我們就來(lái)通過(guò)對(duì)這款游戲的反編譯來(lái)分析4399積分系統(tǒng)是什么樣的以及修改積分上排行榜。
通過(guò)截包我們可以得到游戲的真實(shí)地址:
http://szhong.4399.com/4399swf/upload_swf/ftp5/haibo/20110511/1/mainload.swf積分函數(shù)JS:
http://www.4399.com/jss/playerbg_jifen20140301.js下載swf文件,用FFDec打開(kāi),可以看出這個(gè)swf是個(gè)Loader,載入的是二進(jìn)制數(shù)據(jù)中的gamefile:
導(dǎo)出二進(jìn)制數(shù)據(jù),重命名為swf文件,再載入FFDec,然后分析代碼:
顯然這個(gè)swf也是個(gè)Loader,用于在游戲中顯示排行榜、提交積分、即時(shí)獲取游戲內(nèi)的積分通過(guò)js傳遞到html頁(yè)面顯示等。
我們目的是修改積分,所以只要在這個(gè)積分傳遞過(guò)程中做手腳就可以了。來(lái)試試吧!
定位到提交分?jǐn)?shù)的地方:
這里可以看出是和js相互通信,js中這個(gè)函數(shù)的地方:
其中提交積分的關(guān)鍵函數(shù)是:
get_max_soure(gameid,user4399id);//更新當(dāng)前分?jǐn)?shù)這個(gè)函數(shù)有兩個(gè)參數(shù),一個(gè)是游戲id,一個(gè)是自己的4399id
游戲ID在flash常量定義中可以找到:
4399id可以進(jìn)入你的個(gè)人主頁(yè)中看到:
我們繼續(xù)尋找積分調(diào)用的地方
就在這里,調(diào)用了js中的rdscore,我們?nèi)s中看看這個(gè)函數(shù):
顯而易見(jiàn),我們調(diào)用這個(gè)函數(shù)就能改變面板上的積分
Javascript:rdscore('50000');我們?cè)賵?zhí)行
get_max_soure(gameid,user4399id);提交積分
結(jié)果排行榜的分?jǐn)?shù)依然是之前游戲內(nèi)的分?jǐn)?shù)。
為什么呢?讓我們分析下提交積分的函數(shù)
可以看出這個(gè)函數(shù)只是更新了面板的數(shù)據(jù),然后更新成就。數(shù)據(jù)是來(lái)自:
http://score.4399.com/get_topscore_forusercenter.php?callback=?&game_id=56259&user_id=1881037144因此我們繼續(xù)往上跟:
提交積分原來(lái)在這里!
LoadBytes相當(dāng)于一個(gè)post請(qǐng)求,第一個(gè)參數(shù)是url,是常量:
private var URL_SCORE:String = "http://score.4399.com/submitscore_forusercenter.php";第二個(gè)是個(gè)事件參數(shù)
他這里使用了匿名內(nèi)部類(lèi)來(lái)實(shí)現(xiàn),用來(lái)和js進(jìn)行一些交互
第三個(gè)參數(shù)就是post的參數(shù)了。就是這些:
我們截包后可以看到數(shù)據(jù)如下:
token=980a942d3fa726ec4b3d2e556c771aab&score=750&verify=bf621be32ad6654830c4e8d64e8393b1&autocommit=1&game%5Fid=56259&gs=1&time=1454063544314&game%5Fkey=a6231db93dfa5af2&starttime=1454062807192&uid=1881037144&username=hookd3d其中有些數(shù)據(jù)是加密的,我們來(lái)一一解析:
Token:
其中URL_TOKEN是常量
http://score.4399.com/get_token.php流程就是訪問(wèn)這個(gè)php得到
&token=980a942d3fa726ec4b3d2e556c771aab然后去掉前面7位
得到980a942d3fa726ec4b3d2e556c771aab就是token
Score:這個(gè)沒(méi)有加密,直接寫(xiě)任意數(shù)字即可
Verify:
這里一些的代碼被混淆了,經(jīng)過(guò)混淆處理后
我們可分析得出
Verify是由
"SDALPlsldlnSLWPElsdslSE" + temKey + lGameScore + gameID + starttime + gs + _tokenData + "PKslsO";然后進(jìn)行三次MD5得出的
我們?cè)俜謩e分析調(diào)用到的這些變量分別是什么
TemKey:
private function getIntegraKey() : String{ var _loc1_:String = MD5.hash(MD5.hash(this.gameID + "LPislKLodlLKKOSNlSDOAADLKADJAOADALAklsd" + this.gameID)).substr(4,16); return _loc1_;}這里算法很清晰,我們可以直接調(diào)用
lGameScore:
?
應(yīng)該就是游戲的分?jǐn)?shù)
gameID:
56259
Starttime:
var _loc2_:Date = new Date();???this.starttime?=?_loc2_.getTime();取當(dāng)前時(shí)間 可以直接用
Gs:
當(dāng)前關(guān)卡?取值來(lái)自這里
_tokenData:
就是上面獲取的token
繼續(xù)分析下面的參數(shù),
Autocommit:
為1提交后自動(dòng)看排行為0不自動(dòng)看排行。
game%5Fid:
也就是game_id:56259
Gs:當(dāng)前關(guān)卡 和上面一樣取值第一關(guān)就是1
Time:
var ts:String = md.getTime().toString();
應(yīng)該是時(shí)間
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_;}也是個(gè)簡(jiǎn)單的算法,可以直接調(diào)用
Starttime:
var _loc2_:Date = new Date();this.starttime?=?_loc2_.getTime();游戲開(kāi)始時(shí)的時(shí)間。
uid=1881037144&username=hookd3d這個(gè)就不用說(shuō)了吧。
好了全部分析完了,可以看出我們關(guān)鍵要得出的參數(shù)是Verify。因?yàn)槠渲邪?dāng)前分?jǐn)?shù),我們修改了積分,這個(gè)值就也會(huì)變。
而其他的參數(shù)根據(jù)游戲不同而不同,這里我們僅測(cè)試這一款游戲,其他參數(shù)通過(guò)封包中已經(jīng)得出,就不一一生成了。?所以要模擬POST請(qǐng)求修改積分只需計(jì)算出Verify即可,這里我們直接修改flash來(lái)修改分?jǐn)?shù)。
分?jǐn)?shù)的變量是lGameMidScore,與之相關(guān)的是
看到這里我們可以知道,上面我們修改的函數(shù)只是網(wǎng)頁(yè)上顯示的數(shù)據(jù)而已,并沒(méi)有賦值到flash中提交分?jǐn)?shù)中的變量Score,所以那些修改是無(wú)效的。
this.lGameMidScore = this.lMain.score + this._totalscore;從這行代碼看出
這里面分?jǐn)?shù)來(lái)自于lMain.score
lMain就是loader的游戲類(lèi)的了。
??
這里有很多修改點(diǎn),我們?yōu)榱朔奖?#xff0c;就直接改他獲取的地方吧
給他加五萬(wàn)
變成這樣
然后改下當(dāng)前關(guān)卡,防止被檢測(cè)到我們是作弊
?他是從游戲中獲取的關(guān)卡數(shù)
?估算了下應(yīng)該是有10關(guān),就改成10吧
OK,保存看下效果
結(jié)果是運(yùn)行后閃退。
這是由于這個(gè)flash是混淆過(guò)的,而FFDec處理不完全,所以導(dǎo)致內(nèi)存錯(cuò)誤閃退
修改文件不行的話我們可以使用Loader來(lái)修改,但是介于篇幅,我們還是直接改游戲主文件吧
導(dǎo)出后再載入FFdex
找到啟動(dòng)類(lèi)
找到分?jǐn)?shù)初始化的地方:
直接改50000
關(guān)卡也要改
保存之后依次替換回去,來(lái)看看效果怎么樣:
結(jié)果是分?jǐn)?shù)變動(dòng)了,但是一開(kāi)始游戲又全部清零了。
這是因?yàn)?399的Loader初始化的時(shí)候會(huì)把分?jǐn)?shù)清零
但是這里獲取的還是我們修改的50000
只是提交按鈕不可用。
這時(shí)候我們上面分析到的提交分?jǐn)?shù)函數(shù)就有用了
在瀏覽器地址欄輸入:
Javascript:get_max_soure('56259','1881037144');可以看到已經(jīng)上了排行榜第一名,我們的目的也就達(dá)到了。
總結(jié)
以上是生活随笔為你收集整理的内网通修改积分文件_【页游逆向】4399小游戏积分系统分析及修改积分的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用HanLP增强Elasticsear
- 下一篇: Kali系统下载Thefatrat太慢怎