Android逆向從未如此簡單

哈,又標題黨了。。不過我一定竭盡所能,寫一篇最親民的入門文章。

本文僅供學習交流之用,切勿用於非法用途,讀者若運用所學知識,進行非法任何商業目的或者非法牟利,一切責任由操作者自行承擔,與本人無關。希望讀者僅僅從瞭解原理,保護自身APP儘量減少危害出發來閱讀本文。

本文發佈自wing的地方酒館,轉載請註明出處。

本文以一個最簡單的例子,來教給大家Android逆向入門的一些知識。所以首先我們需要準備一個APK,做的簡單一些,就是一個EditText,已經一個按鈕,模擬驗證註冊碼。

當驗證碼填寫正確的時候,則提示驗證成功,錯誤的時候,則驗證失敗。

現在,我們將列舉數種辦法,攻破驗證,來讓我們輸入任何密碼就驗證成功。

神兵利器

如果你嫌命令行不好用(這是個不好的開始),那麼還可以用整合到一起的可視化工具AndroidCrackTool https://github.com/Jermic/Android-Crack-Tool

首先,把我們的apk用ApkTool給反編譯了,進入目錄發現有以下文件夾


其中,smali文件夾裏,放的都是dex反編譯出來的smali文件,如果想改變應用的邏輯,只需要修改smali再重新打包即可。接下來,介紹幾種突破方法。


尋找切入點

直接尋找法

將apk裏面的dex文件脫離,然後使用dex2jar轉換爲jar文件。

在代碼裏,我們可以很明顯看到,onClick方法內,進行了驗證碼的判斷。此時我們已經找到切入點。


資源引用法

一般apk的代碼不會如此簡單,肯定有很多複雜的代碼,這時候如何去尋找切入點呢,其實我們可以根據引用的資源來尋找,比如我們註冊失敗的時候會提示註冊失敗,這時候,我們去res文件夾下找string。

<string name="failed">註冊失敗</string>

發現name爲failed,然後再去public文件裏尋找對應的id,找到了

<public type="string" name="failed" id="0x7f060022" />

將這個16進制的id轉化爲10進制,得到2131099682,在逆向得到的jar文件,索引這個id,發現正好有引用,所以這一區域是關鍵代碼區域.


猜測法

逆向離不開猜測,找到目標頁面,假設要獲取一個點擊事件,那麼就猜測類型爲Button的屬性,在混淆代碼裏,只有一個button叫做a,那麼只要找這個a的點擊事件即可。


到現在我們已經有了切入點,接下來要開始達成我們的目的了,那就是改變代碼邏輯。

向代碼開刀

既然我們已經抓住了切入點,如何去破解這個註冊碼到底是多少呢,接下來向大家介紹幾種開刀方法。

直接分析法

看到混淆代碼,閱讀之,發現這個註冊碼是根據日期生成的,所以我們只需要人算出來當前日期輸入即可。

當然這種方法缺陷很大,因爲一般算法不會如此簡單。


偷樑換柱法

既然找到了判斷點,我們去閱讀smali代碼。

注意第48行,這裏是執行了方法a(),也就是生成key的方法,把返回值交給了V0,後面所有邏輯都是根據這個判斷的,所以我們可以把v0給偷偷替換掉,假設我們替換爲”123”,這樣我們輸入123,就可以通過驗證了,代碼如下:


酒後真言法

什麼叫做酒後真言?就是喝多了讓他自己吐出來真心話,那麼我們怎麼讓他吐出來真心話呢?當然是打log了,嘿嘿嘿,我們只要在v0後面打一條log,把這個v0打出來,驗證碼不是就自己出來了嗎,哈哈。 代碼如下:


深入敵營

這絕對是重頭戲,什麼叫做深入敵營呢?就是打入敵軍內部,這裏說的就是動態調試拉~ 直接debug smali,看看各個寄存器裏的值,你說膩害不膩害~

首先,你需要有個2.3以下的AS,因爲smaliidea這個插件不支持2.3,然後安裝這個插件。

接下來,把逆向出來的AndroidManifest.xml文件做一點小修改,給他加入一句

<application android:debuggable="true"/>

之後重新打包,安裝到手機上。接下來把整個逆向出來的項目導入到AS中。

將smali文件夾添加爲source root。

接下來Run->Edit Configurations 添加Remote,稍等要修改端口。

這時,打開ddms,看到端口爲8600,這時候把窗口裏的端口改爲8600.

將sdk改爲10.

接下來,點擊debug按鈕,就可以動態調試了。

接下來就是打斷點,在生成驗證碼之後,打上斷點,然後點擊按鈕。

就可以打印出來函數調用棧,各個寄存器等信息,這時候我們使用evaluate expression 打印出v0的值:

可以看到,與我們之前代碼猜想結果一致,驗證碼爲”0318”,到此,我們就完成了這個驗證系統的逆向。

結語

到此,本篇文章的內容就結束了,希望各位讀者不要去運用這些知識去做壞事,天網恢恢。 反而我們應該思考的是怎麼去防止別人破壞我們的APP,比如增加混淆程度,簽名校驗,加固等等,雖然這些也能被破解,但是會增加難度。畢竟安全這件事,防君子不防小人。房子的門可以被撬開,可是我上班出門仍然會關門。

如果你喜歡我的文章,請多關注我,也可以加入我的Android酒館來討論Android技術:425983695

參考:

《Android軟件安全與逆向分析》
https://www.zybuluo.com/oro-oro/note/167401

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