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的主流產品都沒有進行加固。但是有的應用必須進行加固,那就是涉及到金融方面的,對于他們來說安全比崩潰率更重要。也有的大部分收費和內購的游戲也是選擇加固的。而這種應用現在大部分屬于中型應用 ,本文還是可以進行操作的。
六、總結
本文主要講解了如何hook系統類信息,然后獲取到加固應用之后的所有方法信息,同時還可以獲取到哪些方法被執行了,以及執行的過程中參數信息,而這些信息是分析一個應用最為重要的信息。當然我們也可以通過分析方法的參數信息來判斷這個方法的可以程度,然后在用Xposed進一步進行hook來驗證結果都是可以的。介紹了本文的內容,如果大家覺得文章有幫助的同學可以多多點贊和分享擴散,要是有打賞那就最好了!
來自:http://blog.csdn.net/jiangwei0910410003/article/details/54982476