初探Android逆向:經過遊戲APP破解引起的安全思考

現在移動互聯網已經徹底融入到咱們的生活中,各種APP也是層出不窮,所以對於安卓APP安全的研究也尤其重要。本文經過對一款安卓APP的破解實例,來引出對於APP安全的探討。(本人純小白,初次接觸安卓逆向一星期,略有體驗,在這裏分享一下)java

本次破解的安卓APP是某款射擊類遊戲,咱們發如今遊戲裏面有購買補給的功能,那麼咱們就針對這個功能進行破解,旨在達到免費購買。算法

首先,對該遊戲進行還原,即反編譯。反編譯後能夠查看該APP的配置文檔、算法邏輯等,方便咱們對其進行分析。在這裏,咱們使用工具AndroidKiller來對其進行反編譯。安全

圖片.png

經過上圖,能夠看到APP的組成部分。咱們只須要關注smali文件,由於Smali是安卓系統裏的 Java 虛擬機(Dalvik)所使用的一種 dex 格式文件的彙編器。咱們能夠經過smali文件來查看APP的僞代碼,從而瞭解其算法邏輯等。app

接下來就是找到APP支付的入口,能夠經過搜索success、pay、paid等關鍵字符串來找到相關文件。編輯器

圖片.png

點進這個文件進行查看,咱們能夠看到一些與支付相關的字符串,猜想這裏可能就是支付函數的入口,至於究竟是不是,咱們接着看下面。ide

這些smali語句可能看着晦澀難懂,不要緊,咱們能夠經過AndroidKiller將其轉化爲咱們熟悉的java代碼。函數

圖片.png

這裏是一個switch語句,多是對支付功能作的一些判斷。咱們能夠看到這裏有個MiguPay函數,這個函數究竟是幹什麼的呢?點擊MiguSdk類,能夠跳轉到MiguSdk類。工具

圖片.png

咱們能夠看到該方法裏調用了runOnUiThread方法,其參數中有涉及另一個類MiguSdk.2,跟着這個方法繼續跳轉下去。測試

圖片.png

使人驚喜的一幕出現了,咱們能夠看到「購買道具」「成功」等字符串,到這裏差很少就能夠確定這裏就是與支付相關的方法了!好了,咱們又跳轉到以前switch判斷的函數。.net

圖片.png

以前咱們看到,當調用GMessage.success()時,就是說明購買成功。而這裏的:pswitch_0語句就是發送的GMessage.success()。這就意味着,若是全部的判斷語句都和pswitch_0裏執行的同樣,那麼是否是全部的條件都能購買成功呢?咱們試試,將全部的:pswitch_x所有改成pswitch_0。

圖片.png

用AndroidKiller對該APP進行打包簽名,安裝測試!

安裝失敗!提示簽名校驗不經過!看來該APP進行了簽名校驗,所謂的簽名校驗就是爲了防止本身的應用被反編譯後從新打包。那麼有沒有方法進行繞過呢?固然有!其實簽名校驗通常寫在native層so文件裏,或者是java層。經過搜索SignKey、Signature等關鍵字符串,通常能夠找到簽名校驗的入口。如下文件就是判斷簽名的so文件裏的相關函數,利用工具IDA轉換爲C語言的僞代碼。

圖片.png

圖片.png

從上圖能夠看出,最後作了個if語句的判斷,那麼咱們直接用十六進制編輯器將return語句直接改成return true。最後再次編譯打包該APP,ok!破解成功!

圖片.png

思考:開發一個有商用價值的APP,無疑是須要大量的精力的,若是APP能被輕易破解,那帶來的損失確定是讓人沒法接受的。所以對於APP的安全防禦顯得相當重要。關於APP逆向的安全機制,通常有如下幾種:

一、  代碼混淆:對發佈出去的程序進行從新組織和處理,使得處理後的代碼與處理前代碼完成相同的功能,而混淆後的代碼很難被反編譯,即便反編譯成功也很可貴出程序的真正語義。

二、  簽名校驗:比較用來簽名app的證書的hash與咱們寫死在其中的hash是否一致。

三、  加殼處理:在二進制的程序中植入一段代碼,在運行的時候優先取得程序的控制權,作一些額外的工做。

相關文章
相關標籤/搜索