search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

Android逆向從未如此簡單

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

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

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

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

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

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

神兵利器

  • ShakaApktool https://github.com/rover12421/ShakaApktool
  • Dex2Jar https://github.com/pxb1988/dex2jar
  • Smali https://github.com/JesusFreke/smali
  • SmaliIDEA https://bitbucket.org/JesusFreke/smali/downloads/

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

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

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

直接尋找法

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

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

資源引用法

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

註冊失敗

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

將這個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文件做一點小修改,給他加入一句

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

將smali文件夾添加為source root。

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

這時,打開ddms,看到埠為8600,這時候把窗口裡的埠改為8600.

將sdk改為10.

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

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

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

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

結語

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

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

參考:

《Android軟體安全與逆向分析》



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦