昨晚一位新學(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ズ洹婚夫!