Android逆向之旅---獲取加固後應用App的所有方法信息

一、前言

在逆向應用的時候,我們有時候希望能夠快速定位到應用的關鍵方法,在之前我已經詳細介紹了一個自己研發的代碼動態注入工具icodetools,來進行動態注入日誌信息到應用中,不瞭解的同學可以查看這裏:icodetools動態注入代碼解析,看完之後都會發現這個工具對於現在加固的應用是沒有辦法的,所以我們如何能夠得到加固的應用的所有方法信息呢?再不用複雜的脫殼步驟也可以輕鬆的獲取對應的方法信息。這個就是本文需要介紹的內容。


二、獲取加固應用方法

在之前瞭解過加固應用原理的同學或者是弄過脫殼的同學都知道,加固其實就是對源apk進行加密,然後進行解密加載運行,所以在這個過程中如果我們想要得到應用的所有方法信息,必須是在解密加載運行之後進行操作了。這個我們就需要藉助系統的一個重要類DexFile,下面可以查看他的源碼:


看到這三個方法,而這三個方法是一個應用中類加載運行的最終點,不管你怎麼加固,最終都會需要解密,加載dex,加載類然後運行。所以這三個地方是應用運行的必經之地。看到三個方法的參數信息,可以知道這個類的名稱和類加載器,那麼我們就可以利用這兩個信息通過反射獲取這個類的所有方法信息,這裏依然需要藉助神器Xposed來進行hook操作,hook的對象就是系統的dalvik.system.DexFile類的三個方法:


注意:爲了防止多dex進行hook發生類找不到的錯誤,這裏做一次attach操作!這裏爲了演示加固應用,就選擇了之前我寫過的一個下載今日頭條視頻的小工具,當時沒有開源,並且進行了加固,選擇的是梆梆加固。也有人找我要源代碼。那麼通過本文案例分析之後,就不需要源碼了,你可以窺探這個小工具的所有方法信息了。這個工具的下載地址:https://pan.baidu.com/s/1eR56t94,使用教程在應用中也有。或者不瞭解的可以看這篇文章:Python腳本下載今日頭條視頻


下面繼續來看看上面hook之後的處理類方法:


在這個方法中,首先我們通過類名和加載器信息,得到這個類所有的方法信息,然後開始構造這個方法的簽名信息:


這個信息包括:方法的修飾符,返回類型,方法名,參數類型,大致最終的樣式爲:

public final native java.lang.String xxx(java.lang.String, int)

這樣的信息就能夠把一個方法的所有信息體現出來,後續如果我們想在外部利用反射調用這個方法來窺探信息就好辦了,得到這些方法的簽名信息之後,然後就開始進行每個方法的hook操作了:


在利用Xposed進行hook一個方法的時候,需要知道類名,類加載器,方法名,方法參數類型。正好這些信息在上面都可以知道,而這裏之所以要進行hook是爲了能夠判斷這個方法是否被調用了,方法在被調用的時候的參數值是什麼。因爲上面獲取是這個類所有的方法,但是不代表這些方法就是被調用了。只有在次進行hook纔可以判斷當前方法被調用了。而這裏有一個問題就是如果一個應用過於龐大,方法較多。在Xposed進行hook那麼多方法就會出現OOM這樣的錯誤。所以本文爲了演示就沒有做優化,我們可以先獲取類的所有方法,然後分批進行hook操作即可。


三、運行效果

下面我們運行這個Xposed模塊,然後重啓設備運行即可,最後在運行上面已經安裝加固的今日頭條下載器工具,運行看效果日誌:


看到了,我們把這個工具的所有方法都打印出來了,然後再來看看他的調用方法:


從這些信息可以看到,這些方法被實際調用了,再來看看那些方法被調用時的參數值:


看到了,方法調用的參數值我們也可以把它打印出來。


四、如何處理獲取到的方法

到這裏我們達到了我們的目的,可以dump出一個加固應用的所有方法,以及被實際調用方法,同時還可以把參數值打印處理,本文用的是梆梆加固的案例,其實其他家的加固都是可以的。感興趣的同學可以嘗試一下。下面繼續來看,上面獲取到了應用的所有方法信息,有的同學可以會想這麼幹,用反射調用某個可疑方法,看看方法的返回值是啥?所謂可以,可能需要通過經驗,結合方法的參數信息類型得知這個方法的可疑程度,反射調用很簡單:


可以自己隨便寫一個應用然後得到根據包名得到其對應的Context變量,然後得到其類加載器,開始加載這個可以方法,不過可惜的是,這個運行應該是報錯的:


提示找不到這個類,原因想一下就通了:因爲現在的應用是加固的,加固最終解密dex運行肯定用的是自己的類加載器,而上面的這種方式獲取到的Context只是外層殼的類加載器也就是應用默認的PathClassLoader加載器,所以理論上肯定是找不到這個類的,所以如果想不報錯,就需要找到這個類加載器。但是這個因爲沒有源碼所以很難找到。所以通過這個簡單的代碼想告訴一些同學,這種想法是好的,但是其實是錯誤的。


取而代之的是我們可以利用Xposed來進行hook這個方法,因爲Xposed中我們可以解決類加載器的問題:


先hook系統的Application類的attach方法,然後在獲取他的Context值,得到類加載器,來加載指定類,如果加載成功了,所以找到了對應的類加載器,那麼就可以進行後續的hook操作了。這種方法和思想是對的。


五、解答疑惑

有的同學又好奇了,上面我們在進行獲取類的所有方法信息的同時不是已經進行hook方法了,還得到方法運行時的參數值了,的確那裏是做了,但是我也說了,Xposed一次性hook太多方法是會報錯的,因爲本文案例的應用方法數不是很多,所以看起來很正常,如果進行hook大的應用的時候會出現問題的。所以爲了解決這樣的問題,我們可以先獲取應用的所有方法,此時可以不進行hook操作,然後有了類的所有方法信息之後,在進行方法分析,然後對可以方法單獨進行hook操作來進行驗證即可。


有的同學又有疑問了?這個對於大型的app來說感覺沒什麼用?的確,比如像WX這樣的應用,如果用作本文案例,可以看到日誌刷屏了,沒有一會就出現ANR了,這個問題在之前說到用icodetools工具進行操作的時候也出現過。當時的解決方案是通過開關進行控制,這裏其實也可以用開關進行控制的。但是這裏想說的是,現在加固的應用並不是大型應用,原因很簡單,因爲加固是有崩潰率的,現在沒有任何一個加固平臺可以保證零崩潰率的,因爲加固現在都涉及到了native層,而Android機型複雜,兼容性肯定不好。所以對於那些用戶量非常龐大的應用是不會進行加固的,比如BAT的主流產品都沒有進行加固。但是有的應用必須進行加固,那就是涉及到金融方面的,對於他們來說安全比崩潰率更重要。也有的大部分收費和內購的遊戲也是選擇加固的。而這種應用現在大部分屬於中型應用,本文還是可以進行操作的。


項目下載地址:https://github.com/fourbrother/XposedHookAllMethod


六、總結

本文主要講解了如何hook系統類信息,然後獲取到加固應用之後的所有方法信息,同時還可以獲取到哪些方法被執行了,以及執行的過程中參數信息,而這些信息是分析一個應用最爲重要的信息。當然我們也可以通過分析方法的參數信息來判斷這個方法的可以程度,然後在用Xposed進一步進行hook來驗證結果都是可以的。介紹了本文的內容,如果大家覺得文章有幫助的同學可以多多點贊和分享擴散,要是有打賞那就最好了!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章