如何學(xué)習(xí)逆向工程應(yīng)用咕别,某游戲逆向數(shù)據(jù)分析案例揭示。写穴。惰拱。

昨晚一位新學(xué)習(xí)逆向數(shù)據(jù)的小哥哥分享了學(xué)有所成的一個(gè)案例,不過(guò)給他布置這個(gè)作業(yè)都有20多天了啊送,估計(jì)得了拖延癥晚期偿短,不過(guò)通過(guò)學(xué)習(xí)后讓他這一枚小小菜鳥(niǎo)終于完成對(duì)某舞夢(mèng)工廠APP的分析。分析概述如下:該直播APP采用TCP協(xié)議馋没,TCP連接建立之后昔逗,首先進(jìn)行基礎(chǔ)連接認(rèn)證,認(rèn)證通過(guò)之后篷朵,進(jìn)行帳號(hào)認(rèn)證隔披,完成即可進(jìn)行獲取角色信息瘫絮、進(jìn)入房間等各類(lèi)操作。發(fā)送數(shù)據(jù)先進(jìn)行ProtoBuf序列化,接著采用CRC32循環(huán)加密英上,添加包頭(包括命令號(hào)以及長(zhǎng)度、校驗(yàn)位等)之后税稼,發(fā)送身害,接受到的數(shù)據(jù)反之。本文主要闡述逆向中遇到的難點(diǎn)及思路澈缺、基礎(chǔ)連接認(rèn)證過(guò)程坪创、數(shù)據(jù)包的序列化過(guò)程炕婶、CRC32循環(huán)加密過(guò)程以及重要數(shù)據(jù)包的分析過(guò)程等,旨在提供APP逆向中莱预,TCP通信協(xié)議的一般性分析研究方法柠掂。嗯,小哥哥還是學(xué)習(xí)很用功的锁施,用的工具都復(fù)習(xí)了一次陪踩,如果大家有更好的思路或者經(jīng)驗(yàn)交流,歡迎聯(lián)系悉抵。 ? ? ??

?本文以下會(huì)使用到的工具有:JEB2.3.13肩狂、GDA3.53、IDA7.0姥饰、某電模擬器傻谁、某舞夢(mèng)工廠APP。(僅供大家參考)


以下就跟大家分享小哥哥具體逆向分析過(guò)程列粪,大家指導(dǎo)指導(dǎo)更多優(yōu)化的思路审磁。。

某訊游戲軟件逆向很多難點(diǎn)及很多思路岂座。(不要跟我說(shuō)大公司大平臺(tái)沒(méi)有漏洞) ? ? ? ?

首先要尋找切入點(diǎn) ? ? ? ?一般來(lái)說(shuō)态蒂,一個(gè)好的切入點(diǎn)可以讓我們事半功倍。接觸到APP之后费什,首先進(jìn)行了流程分析钾恢。開(kāi)啟android monitor,進(jìn)行登錄操作鸳址。通過(guò)仔細(xì)分析日志以及調(diào)用方法堆棧瘩蚪,發(fā)現(xiàn)一條日志信息很可疑:

?其中,is_force_ver_up表示是否強(qiáng)制更新稿黍,正好對(duì)應(yīng)了手機(jī)上面要求強(qiáng)制更新疹瘦。通過(guò)JEB逆向app之后,搜索相關(guān)信息:handleCEventVideoInitConnectionResponse巡球,發(fā)現(xiàn)如下:

?有理由相信言沐,z即為所需的日志類(lèi)。有這么一個(gè)入手點(diǎn)酣栈,就好辦很多呢灶。一般app都會(huì)對(duì)日志類(lèi)進(jìn)行重寫(xiě),并且在發(fā)布版本時(shí)钉嘹,關(guān)閉部分信息的輸出鸯乃。

采用xposed對(duì)z類(lèi)所有方法進(jìn)行hook,打印出日志信息,可以發(fā)現(xiàn)缨睡,日志輸出了很多有用的信息鸟悴。通過(guò)對(duì)日志信息的分析,搜索日志標(biāo)簽:NetConnection奖年,分析發(fā)現(xiàn)com.h3d.qqx5.framework.d.g即為app的網(wǎng)絡(luò)操作類(lèi)细诸,在該類(lèi)中,進(jìn)行了連接之后的基礎(chǔ)連接認(rèn)證陋守,以及后續(xù)的數(shù)據(jù)包的發(fā)送接收等操作震贵。也發(fā)現(xiàn)了具體發(fā)送數(shù)據(jù)包的函數(shù)?

與此同時(shí),日志也明確告訴TCP連接的IP和端口水评,方便抓包分析猩系。


?找到發(fā)包函數(shù),即有了突破點(diǎn)中燥。一層一層向上追溯即可找到調(diào)用層次寇甸。 ? ? ?

?游戲代碼混淆了,怎么辦疗涉?(一般平臺(tái)都用的招數(shù)) ? ??

? ?該APP代碼做了混淆拿霉,對(duì)于分析協(xié)議的過(guò)程中十分不利。我的思路為跟蹤方法過(guò)程咱扣,并及時(shí)進(jìn)行重命名绽淘,重命名的過(guò)程中,我的命名規(guī)則是:原方法名_現(xiàn)方法名闹伪,之所以保留原方法名收恢,是方便后續(xù)的hook操作。比如上述發(fā)包函數(shù)祭往,在我對(duì)此方法詳細(xì)分析之后,其效果如下:

?可讀性增強(qiáng)很多火窒,慢慢由點(diǎn)及面硼补,從日志入手,各處分析熏矿,最后零零散散已骇,即可大致分析出整體app通信流程,整體流程已經(jīng)到手票编。嗯褪储,開(kāi)始抓包分析測(cè)試了。慧域。鲤竹。

測(cè)試環(huán)境基礎(chǔ)連接認(rèn)證

通過(guò)抓包分析以及對(duì)反編譯之后的代碼分析,關(guān)鍵認(rèn)證代碼在com.h3d.qqx5.framework.d.g.b.a:

?得知建立連接之后基礎(chǔ)連接認(rèn)證流程昔榴,對(duì)比數(shù)據(jù)包進(jìn)行分析:

protocal:


?接收到的數(shù)據(jù)包第一個(gè)四字節(jié)為長(zhǎng)度辛藻,所有整數(shù)均為大端存儲(chǔ)碘橘,第二個(gè)四字節(jié)無(wú)意義,下文的send以及recv同理吱肌。之后列出來(lái)的數(shù)據(jù)包都是從第九個(gè)字節(jié)開(kāi)始痘拆。

?從long_1到long_2依次計(jì)算其sha-256值,直至結(jié)果與數(shù)據(jù)包返回的long_key_sha-256值相同氮墨,此處將符合條件的值命名為long_keypuzzle:

?verify:?

至此纺蛆,tcp基礎(chǔ)連接認(rèn)證成功!嘿嘿规揪,可以進(jìn)行后續(xù)操作桥氏。

游戲數(shù)據(jù)序列化過(guò)程是最難受了,心累A0(有挑戰(zhàn)才有動(dòng)力)

這部分是最讓人難受的一部分识颊,看著眼睛痛了,因?yàn)橐恢币詾槭枪雀璧膒rotobuf奕坟,嘗試套上去解數(shù)據(jù)包祥款,結(jié)果死活不行(不行再試,我是打不死的小強(qiáng))月杉。app解數(shù)據(jù)包這兒流程又比較復(fù)雜刃跛,加上混淆,理解了好久才理解明白流程(多看多學(xué)多想這是重點(diǎn)要考的)苛萎。

以CEventQueryVideoAccountInfo該事件的發(fā)送以及接受處理為例說(shuō)明首先桨昙,java有一個(gè)類(lèi),即為CEventQueryVideoAccountInfo類(lèi)腌歉,

?通過(guò)代碼蛙酪,可以得知該類(lèi)的功能為CEventQueryVideoAccountInfo,該類(lèi)的屬性雖然被混淆翘盖,但是根據(jù)日志桂塞,我們可以還原各個(gè)屬性的真實(shí)含義。首先馍驯,先設(shè)置各個(gè)屬性的值阁危,接著進(jìn)行序列化。序列化之后的數(shù)據(jù)如下:

?序列化完成之后汰瘫,進(jìn)行加密狂打,加密之后添加包頭


?整數(shù)型壓縮與解壓算法和加密與解密算法

隨后給出接下來(lái)先討論返回的數(shù)據(jù)java同樣定義了返回的數(shù)據(jù)類(lèi)?

收到數(shù)據(jù):?

與發(fā)送數(shù)據(jù)正好相反

?客戶(hù)端拿到數(shù)據(jù)之后,首先獲取clsid號(hào)混弥,接著在一個(gè)hashmap中尋找對(duì)應(yīng)的類(lèi)趴乡,找到之后,通過(guò)反射獲取類(lèi)的所有屬性,從而完成解析浙宜。解析之后數(shù)據(jù)如下:

?游戲數(shù)據(jù)序列化過(guò)程需要注意的是官辽,不一定是所有的數(shù)據(jù)結(jié)構(gòu)類(lèi)都會(huì)重寫(xiě)toString()方法幫助我們理解各個(gè)屬性的真實(shí)含義,同樣有很多類(lèi)是沒(méi)有重寫(xiě)該方法的粟瞬。因此同仆,我們需要盡可能重命名我們知道真實(shí)含義的每個(gè)值,方便以后遇到?jīng)]有重寫(xiě)toString()方法時(shí)裙品,對(duì)其屬性的含義完成猜測(cè)和驗(yàn)證俗批。(煞費(fèi)苦心,以后還是多多練習(xí)市怎。)測(cè)試完成了接下來(lái)我們就要開(kāi)始算法的壓縮解壓再加密解密岁忘。。区匠。?

我們來(lái)看看小哥哥的壓縮解壓算法如下:

?再看看小哥哥的加密解密算法:?

看看重要數(shù)據(jù)包怎么去分析干像?(想法呢?) ? ??

? ?某訊APP在數(shù)據(jù)序列化一節(jié)已經(jīng)以QueryVideoAccountInfo為例進(jìn)行了闡述驰弄。在抓包之后麻汰,想要完成對(duì)數(shù)據(jù)包的詳細(xì)分析,我采用xposed和jeb分析相結(jié)合的方法戚篙。

我們已經(jīng)知道五鲫,數(shù)據(jù)包開(kāi)頭即為clsid號(hào),對(duì)應(yīng)了一個(gè)java類(lèi)岔擂,我們可以在JEB的disassembly頁(yè)面直接搜索相關(guān)的十六進(jìn)制或者十進(jìn)制的值來(lái)定位關(guān)鍵類(lèi)位喂,


同時(shí),我們也可以通過(guò)xposed乱灵,在其序列化和反序列化的入口塑崖,攔截這個(gè)類(lèi),打印其方法名痛倚,從而得到其具體位置规婆。假設(shè)我們現(xiàn)在有一個(gè)數(shù)據(jù)包,其clsid為D1 A0 00 00状原。

我們想要找到其實(shí)現(xiàn)類(lèi)。通過(guò)xposed日志苗踪,我們搜索數(shù)據(jù)包發(fā)送的clsid: D1 A0 00 00接著找到SaveStream_param_0: com.h3d.qqx5.model.s.a.c進(jìn)入 com.h3d.qqx5.model.s.a.c類(lèi)颠区,我們發(fā)現(xiàn)并沒(méi)有重寫(xiě)toString()方法,無(wú)法準(zhǔn)確得知各個(gè)屬性的含義:

?利用jeb交叉引用功能通铲,以及之前對(duì)其他類(lèi)的各種注釋以及猜測(cè)毕莱,我們盡可能的完成了對(duì)屬性的含義的解析

分析出其含義,我們對(duì)于數(shù)據(jù)包的組包和解包也就有了很大的信息。下面給出xposed代碼:


嗯朋截,到這里小哥哥的逆向數(shù)據(jù)分析以及全部完畢了蛹稍,估計(jì)小哥哥加班累的夠嗆!


這次app逆向中部服,學(xué)習(xí)到了很多知識(shí)唆姐,該app采用了java完成了序列化和反序列化,讓我知道反射還可以這樣玩廓八,深入理解了基礎(chǔ)連接認(rèn)證奉芦,實(shí)際上安全隱患很大,因?yàn)槠鋽?shù)據(jù)包并沒(méi)有采用安全的密鑰體系剧蹂,中間人隨意竊聽(tīng)声功。深入理解了其加密解密流程,整數(shù)的壓縮與解壓流程宠叼,感覺(jué)自己的功力又深了一層等等等等先巴。。收貨蠻大冒冬。(小哥哥還是迎難而上伸蚯,初生牛犢不怕虎,最終還是收貨滿(mǎn)滿(mǎn)窄驹。)小哥哥還是很有正義感的朝卒,為此特意把逆向分析出來(lái)的漏洞上報(bào)給相關(guān)的平臺(tái),讓其改進(jìn)乐埠。抗斤。。


我們看看小哥哥說(shuō)說(shuō)其上報(bào)的彩蛋環(huán)節(jié):在分析app的過(guò)程中丈咐,發(fā)現(xiàn)在帳號(hào)的認(rèn)證過(guò)程中瑞眼,也就是CEventQueryVideoAccountInfo數(shù)據(jù)包,account棵逊,skey伤疙,openid三者應(yīng)該對(duì)應(yīng)才可以成功登陸帳號(hào),進(jìn)而對(duì)帳號(hào)進(jìn)行后續(xù)操作辆影。實(shí)際發(fā)現(xiàn)徒像,服務(wù)器對(duì)于skey與openid并沒(méi)有校驗(yàn),也就是說(shuō)任意帳號(hào)即可登錄某舞夢(mèng)工廠app蛙讥。已經(jīng)和某訊安全應(yīng)急中心報(bào)告了該漏洞锯蛀,并且已經(jīng)完成了修復(fù)。順便說(shuō)一句次慢,某訊是真的摳門(mén)旁涤。翔曲。


總結(jié):

學(xué)習(xí)逆向數(shù)據(jù)分析的小哥哥通過(guò)這樣的磨練,技術(shù)又更上一層樓了劈愚,不過(guò)要達(dá)到大神級(jí)別還要多多磨練瞳遍,希望各位看官多多留言多多指導(dǎo)。菌羽。如果有類(lèi)似的平臺(tái)如:手機(jī)娛樂(lè)棋牌類(lèi)彩票類(lèi)的APP或是網(wǎng)站要逆向數(shù)據(jù)分析漏洞的可以私發(fā)掠械,多讓我們小哥哥磨練磨練。算凿。份蝴。感謝大家!Cズ洹婚夫!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市署鸡,隨后出現(xiàn)的幾起案子案糙,更是在濱河造成了極大的恐慌,老刑警劉巖靴庆,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件时捌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡炉抒,警方通過(guò)查閱死者的電腦和手機(jī)奢讨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)焰薄,“玉大人拿诸,你說(shuō)我怎么就攤上這事∪” “怎么了亩码?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)野瘦。 經(jīng)常有香客問(wèn)我描沟,道長(zhǎng),這世上最難降的妖魔是什么鞭光? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任吏廉,我火速辦了婚禮,結(jié)果婚禮上惰许,老公的妹妹穿的比我還像新娘席覆。我一直安慰自己,他們只是感情好啡省,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布娜睛。 她就那樣靜靜地躺著,像睡著了一般卦睹。 火紅的嫁衣襯著肌膚如雪畦戒。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天结序,我揣著相機(jī)與錄音障斋,去河邊找鬼。 笑死徐鹤,一個(gè)胖子當(dāng)著我的面吹牛垃环,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播返敬,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼遂庄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了劲赠?” 一聲冷哼從身側(cè)響起涛目,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凛澎,沒(méi)想到半個(gè)月后霹肝,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡塑煎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年沫换,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片最铁。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡讯赏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炭晒,到底是詐尸還是另有隱情待逞,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布网严,位于F島的核電站识樱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏震束。R本人自食惡果不足惜怜庸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望垢村。 院中可真熱鬧割疾,春花似錦、人聲如沸嘉栓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至麻昼,卻和暖如春奠支,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抚芦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工倍谜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叉抡。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓尔崔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親褥民。 傳聞我的和親對(duì)象是個(gè)殘疾皇子季春,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說(shuō)明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí),會(huì)觸發(fā)此異常消返。 O...
    我想起個(gè)好名字閱讀 5,317評(píng)論 0 9
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,101評(píng)論 1 32
  • // com.adobe.flash.listen settings.gradle 定義項(xiàng)目包含那些模塊app.i...
    zeromemcpy閱讀 1,619評(píng)論 0 1
  • 在回來(lái)的路上 兜里還有二十塊 十五買(mǎi)了包煙 五塊買(mǎi)了罐啤酒 躺在床上抽了兩根煙啤酒還沒(méi)喝完 他想起了煩人的飛絮想起...
    卡比巴爾閱讀 161評(píng)論 1 1
  • 十六十七歲的年齡鹤盒,談一場(chǎng)懵懂的戀愛(ài),好像很正常侦副。沒(méi)有初中的那種幼稚侦锯,沒(méi)有大學(xué)的現(xiàn)實(shí),會(huì)認(rèn)真秦驯,會(huì)暢想以后尺碰,會(huì)有點(diǎn)小...
    喜歡民謠向往南方閱讀 316評(píng)論 0 1