一策添、前言
之前已經(jīng)介紹了一款自動爆破應(yīng)用簽名工具kstools,不了解的同學(xué)還可以去看這篇文章:Android中自動爆破應(yīng)用簽名工具kstools;有了這個工具胎围,就不用在擔(dān)心簽名校驗了窖剑,不過在發(fā)布工具之后,很多熱心的同學(xué)都很好奇就進行了嘗試胞得,有成功的,也有失敗的屹电,而在失敗中最多的問題就在于應(yīng)用本身簽名爆破已經(jīng)沒問題了,但是在第三方登錄的時候就失效了跃巡,對于這個問題危号,不光是這個工具會帶來問題,主要是二次打包應(yīng)用都會有這個問題素邪,那么今天就來分析一下如何解決二次打包帶來的登錄失效問題外莲。
二、社交登錄SDK功能說明
首先我們要知道一件事兔朦,就是現(xiàn)在大部分的應(yīng)用都采用了第三方登錄SDK偷线,也就是網(wǎng)上的ShareSDK功能包,這個功能包沽甥,其實很簡單声邦,就是把多家登錄平臺合成一起,就是聚合登錄SDK功能:
因為我們要解決這個登錄問題摆舟,所以得先去簡單的看一下這個聚合登錄SDK源碼實現(xiàn)亥曹,這個不難邓了,直接下載jar包工程,使用也非常簡單:
下載下來之后媳瞪,目錄下有一個QuickIntegrater.jar工具骗炉,可以直接運行,然后填寫具體的包名和項目名稱蛇受,之后就會生成對應(yīng)的集成素材句葵,這里主要包括兩部分,一部分是原始多家社交平臺的jar包:
一部分就是配置信息文件ShareSDK.xml文件:
這個配置文件是關(guān)鍵核心兢仰,就是包含了多家平臺的社交信息乍丈,而這些信息必須應(yīng)用自己去各家平臺上申請獲取信息,這里舉個QQ社交平臺申請資料:
這里提交應(yīng)用之后旨别,會有一個appid和appkey這兩個值诗赌,然后再把這兩個值配置到自己的ShareSDK.xml中即可。所以這個聚合SDK其實沒做啥事情秸弛。
三铭若、問題跟蹤
了解了上面聚合SDK功能之后,下面不多說了递览,直接看爆破app的源碼叼屠,因為這個聚合SDK的包名是cn.sharesdk.x:
這里我們看一下WX登錄失效問題,直接看社交登錄源碼绞铃,(有的同學(xué)好奇镜雨,我怎么一下就找到這個關(guān)鍵代碼了,這個是有方法的儿捧,如果WX這種登錄失效荚坞,在客戶端只能依靠應(yīng)用的簽名信息來做判斷依據(jù),所以只要在這個包下面搜字符串"signature"菲盾,就找到了):
這里看到了:會判斷手機中安裝的WX簽名是否正確颓影,如果失敗了,就會登錄失效懒鉴,因為WX的簽名信息不可能變動的诡挂,所以這里就直接寫死判斷了。那么這里就發(fā)現(xiàn)了第一個問題了:因為我們之前用kstools工具爆破的時候是hook應(yīng)用的PMS服務(wù)临谱,攔截獲取簽名信息方法璃俗,然后返回爆破app正確的簽名,那么現(xiàn)在這里因為是獲取WX的簽名悉默,但是也被我們攔截了城豁,返回的是應(yīng)用的簽名,這明顯就有問題了麦牺,所以我們解決這個問題需要修改一下爆破工具钮蛛,修改很簡單鞭缭,在攔截簽名信息加一個包名判斷,只攔截本應(yīng)用的簽名信息:
這個工具我修改了魏颓,已經(jīng)更新到github上了岭辣,有問題的同學(xué)可以下載最新的在進行操作就可以了。
四甸饱、授權(quán)失敗問題分析
那么到這里就介紹了沦童,之前kstools工具的一個漏洞,無差別的攔截了叹话,導(dǎo)致WX也被干了偷遗,需要做一層過濾,只需要攔截爆破app本身的簽名即可驼壶。不過可惜的是氏豌,解決了這個問題,在登錄還是有問題热凹,比如下面是授權(quán)Q登錄問題:
這個問題修復(fù)其實才是我們本文的重點泵喘,也是網(wǎng)上很多同學(xué)二次打包之后遇到的問題,那么下面就來詳細分析這個問題導(dǎo)致的原因般妙,如何進行修復(fù)纪铺。
在修復(fù)這個問題之前,我們先猜想一下碟渺,Q是如何判斷應(yīng)用被二次簽名拒絕授權(quán)了鲜锚,還是那句話,在客戶端苫拍,只能依賴于簽名校驗信息做判斷依據(jù)芜繁,那么就不科學(xué)了,因為app我們已經(jīng)爆破成功了绒极,理論上應(yīng)該授權(quán)是成功的浆洗,可以騙過Q的,但是結(jié)果不是這樣的集峦。所以猜想:應(yīng)用授權(quán)的時候給Q帶過去哪些信息,從現(xiàn)象來看抠刺,應(yīng)該不是應(yīng)用簽名了塔淤,不過應(yīng)用的包名是肯定有的,還有appid速妖,為什么了高蜂?因為之前說了如果想用Q社交登錄功能,必須得去他后臺提交應(yīng)用獲取對應(yīng)的appid和appkey罕容,而這時候上傳app备恤,TX后臺已經(jīng)記錄了應(yīng)用的簽名信息稿饰,也就是在后臺有包名+appid+簽名信息對應(yīng)關(guān)系了。所以app在授權(quán)登錄帶過去的肯定有appid信息和包名露泊,然后Q在攜帶這些信息去服務(wù)端進行驗證喉镰。所以獲取應(yīng)用簽名信息肯定是Q端做的。
有了上面的猜想惭笑,下面可以進行驗證了侣姆,首先找到入口,直接使用adb shell dumpsys activity top找到授權(quán)頁面:
然后借助Jadx工具打開Q應(yīng)用沉噩,這里再次強調(diào)一次:TX家的app都很龐大捺宗,比如WX,Q等都是多dex文件的,所以直接打開apk會卡死的川蒙,一般activity類都是在主dex中的蚜厉,所以可以解壓apk得到classes.dex直接打開就好了:
看到代碼之后,心終于寬敞了畜眨,就和我們的猜想一模一樣昼牛,Q端得到傳遞過來的授權(quán)app包名,然后獲取其簽名信息胶果,然后就開始進行網(wǎng)絡(luò)請求授權(quán):
這里用的是post方式匾嘱,我們把data中的數(shù)據(jù)放到j(luò)son格式工具中:
看到了,這里會上傳包名早抠,appid霎烙,已經(jīng)簽名信息,那么這里肯定會授權(quán)失敗了蕊连,因為在Q代碼中通過包名獲取簽名信息肯定是二次打包之后的悬垃,因為我們攔截簽名信息只是在應(yīng)用內(nèi),不是系統(tǒng)全局的哦甘苍。
五尝蠕、問題修復(fù)
到這里我們了解了Q授權(quán)登錄的大致流程了:需要授權(quán)app會攜帶自己在Q后端申請的appid,包名去Q端進行授權(quán)载庭,然后Q端拿到包名之后看彼,就獲取手機中安裝應(yīng)用的簽名信息,然后去服務(wù)端進行授權(quán)驗證囚聚。因為我們二次打包簽名應(yīng)用了靖榕,所以授權(quán)肯定是失敗的,所以Q提示非官方應(yīng)用顽铸。了解流程之后茁计,解決也是有很多種方法了,主要涉及兩點:
第一點:如果本地不做任何操作谓松,可以把二次打包之后的應(yīng)用從新提交到Q后臺獲取新的appid和appkey星压,然后替換他的ShareSDK.xml中的配置信息即可践剂,但是這種成功率幾乎為0,以為Q后臺有強大的查重機制娜膘,會被檢查到的逊脯,提示app重復(fù)。
第二點:第一點其實說的是理論知識劲绪,實際中幾乎行不通的男窟,那么就需要在本地進行操作了,這里有兩個方法處理:
1》借助Xposed進行系統(tǒng)攔截獲取簽名信息方法贾富,通過判斷獲取簽名信息的包名來做一次過濾歉眷。這樣可以騙過Q,也可以騙過應(yīng)用本身了颤枪。
2》因為Xposed需要的額外條件太多汗捡,不方便使用,所以這里還可以修改Q中的那段授權(quán)代碼中獲取簽名信息畏纲,直接替換成需要授權(quán)app正確的簽名信息扇住。
這里為了給大家介紹更多的逆向知識,就采用第二種了盗胀,因為第一種現(xiàn)在誰都會了艘蹋,第二種需要改Q代碼,回編譯Q有些問題正好給大家說明一下票灰,下面就來操作一下女阀。首先第一步,我們到構(gòu)造出Q獲取簽名信息的算法屑迂,這個簡單浸策,直接把那部分代碼拷貝出來就好了:
把這段代碼已經(jīng)HexUtil.a方法也考出來如下:
然后手機中安裝正版的授權(quán)app,在運行這段代碼惹盼,獲取到正版授權(quán)app的簽名信息:
這樣庸汗,就拿到了,正確簽名手报。然后在去修改Q代碼蚯舱,在修改Q代碼有個問題,就是因為TX家的App都做了回編譯混淆操作掩蛤,所以這里不能借助apktools進行反編譯修改器smali代碼了晓淀,而需要用另外一種方式,直接解壓出他的dex文件盏档,然后操作即可。這里不多介紹流程燥爷,后面會單獨出一個系列文章介紹如何進行回編譯操作蜈亩。把這個正確的簽名信息在賦值給簽名變量懦窘,修改之后如下:
然后在把這個dex替換回去,重新簽名稚配,安裝Q之后畅涂,可惜的時候運行報錯:
提示appid無效,不過這個問題已經(jīng)對于我們來說不是問題了道川,因為我們有了kstools工具了午衰,使用最新的kstools工具直接爆破即可。
這下就可以愉快的冒萄,進行Q登錄授權(quán)了:
[圖片上傳中臊岸。。尊流。(19)]
看到了帅戒,這里可以正常的Q授權(quán)登錄了,到這里我們就介紹完了如何解決二次打包登錄授權(quán)問題了崖技,下面就來總結(jié)一下問題原因和具體操作逻住。
本文主要講解了Q端登錄授權(quán)問題解決方案,但是其他平臺原理都是類似迎献,比如WX平臺瞎访,可以找到授權(quán)頁面,然后跟蹤代碼即可吁恍,感興趣的同學(xué)可以自己研究解決了扒秸!
六、問題和解決方案總結(jié)
1践盼、因為之前的kstools進行攔截app內(nèi)部獲取簽名的方法鸦采,沒有做應(yīng)用包名區(qū)分,所以把登錄的時候判斷社交APP的簽名也給攔截了咕幻,導(dǎo)致登錄授權(quán)失敗渔伯,這個問題直接修復(fù)了kstools工具,已經(jīng)更新到github上肄程,可下載最新的就好了锣吼。
2、正常二次打包簽名登錄授權(quán)統(tǒng)一報錯信息蓝厌,Q端提示非正版app玄叠,這個是因為在授權(quán)app去Q端進行授權(quán)的時候會攜帶自身的appid和包名,然后Q端會在本地通過包名獲取其簽名信息拓提,然后去服務(wù)端進行驗證读恃,所以這里解決方法很多,可以借助Xposed直接hook系統(tǒng)的獲取簽名方法,還有就是修改Q端代碼替換正確的app簽名信息寺惫,當(dāng)然第二種方式不需要借助Xposed疹吃,限制條件雖然少了,但是操作局限性很大西雀,需要重新安裝Q萨驶,而且只能對授權(quán)一個app有效,如果其他app需要授權(quán)艇肴,還得繼續(xù)修改Q端代碼腔呜。
3、關(guān)于TX家族的app對回編譯都做了很多混淆策略再悼,所以我們得用其他方式二次打包核畴,具體方案會在后續(xù)給出一個系列介紹文章,詳細介紹如何操作帮哈,敬請期待膛檀。
說明:關(guān)于kstools工具出來之后,很多公司做了新的防護策略娘侍,其實這里有一個新的防護策略很簡單咖刃,就是讀取META-INF目錄下的RSA文件中的簽名信息,這樣可以直接校驗憾筏,而不是通過系統(tǒng)的那個方法獲取簽名信息痒芝,這樣二次打包之后迷殿,這個RSA文件簽名肯定會發(fā)生變化的,所以這個就是一個可以抗衡kstools工具的好方案哦。所以說安全和逆向永不停息李丰,安全不息拖叙,逆向不止厌衔!
kstools工具下載地址:https://github.com/fourbrother/kstools
嚴重聲明:本文主要利用一個樣本案例介紹了钱骂,如何修復(fù)二次打包之后授權(quán)登錄失敗問題修復(fù)方案,如果有人利用本文案例或者技術(shù)進行非法商業(yè)操作黄痪,帶來的一切法律責(zé)任將由操作者本人負責(zé)紧帕,與文章作者無關(guān),最后還是由衷的希望各位同學(xué)能夠秉著學(xué)習(xí)逆向知識的態(tài)度閱讀文本桅打,非常感謝是嗜!
最后還是要感謝某某某同學(xué)給我制作的kstools工具效果圖,太喜歡了
更多內(nèi)容:點擊這里
關(guān)注微信公眾號挺尾,最新技術(shù)干貨實時推送
[圖片上傳中鹅搪。。遭铺。(21)]
編碼美麗技術(shù)圈
微信掃一掃進入我的"技術(shù)圈"世界
[圖片上傳中丽柿。恢准。。(22)]
掃一掃加小編微信添加時請注明:“編碼美麗”非常感謝甫题!
[圖片上傳中顷歌。。幔睬。(23)]