如何系統的學習安卓逆向分析?


謝邀

首先,逆向分析是一門技術,也是一門藝術。

其次,安卓逆向同樣可細分為應用層APK逆向、安卓設備框架、內核驅動等逆向、基於安卓的硬體產品逆向等。此處假定樓主說的是第一種逆向。

應用層的逆向分析根據需求的不同,又可細分成APK流程逆向與功能逆向。

流程逆向通常是指簡單的對APK運行流程進行分析,此類分析通常可以使用將APK置於沙盒環境中運行捕捉並查看運行結果。這種逆向需求通常不是很多,典型的工種有殺軟廠商的病毒分析工程師。

功能逆向相比流程逆向則困難得多。但需求比較普遍。實際逆向分析過程中對功能實現的理解,在很大程度上取決於逆向人員相關的軟體開發知識。比如,分析Android程序的JAVA代碼就需要掌握基本的Android軟體開發的知識。分析so庫的代碼就需要了解C/C++相關的so庫開發的知識。除了基本開發相關的能力外,逆向分析人員還需要具備以下知識:

ARM/X86/MIPS彙編語言-分析so庫時可能需要閱讀大量的反彙編代碼。

常見逆向分析工具的使用-JDGUI/IDA PRO/APKTOOL/JEB/DEX2JAR

常用的安卓程序調試與反調試手段-調試器檢測與反檢測/脫殼/反混淆

常用的加密與解密演算法-好的逆向分析人員需要有快速識別常見加密解密演算法的能力

最後,就是多動手,多動手練習是掌握逆向分析技術最好的方法。

以上說了學習逆向分析需要掌握的知識。在此也推薦一下看雪論壇-安卓安全版塊。『Android 安全』

循序漸進的學習安卓逆向可以參看在下編寫的《《Android軟體安全與逆向分析》(豐生強)【摘要 書評 試讀】》一書。


Android逆向從未如此簡單

本文以一個最簡單的例子,來教給大家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。

1. &註冊失敗&

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

1. &


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

1. &

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

將smali文件夾添加為source root。

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

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

將sdk改為10.

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

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

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

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

結語

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

如果你喜歡我的文章,請多關注我,也可以關注「合天智匯」公眾號進行學習!

學習安卓課程及實驗可登陸http://www.hetianlab.com進行學習

參考:

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


匿了

做遊戲逆向破解的話,需要懂得更多的語言,.net,lua,什麼流行就要懂什麼。

1. 遊戲的破解與外掛,

2. 系統漏洞與挖掘,

3. 木馬病毒原理分析

3種主流的逆向工作,應該屬於不同的分支,側重點是不一樣的。

隨便寫下,手機打字太痛苦,就不多說了


學一點java,Android編程,去移動安全公司上班


推薦閱讀:

為什麼在手機攝影方面常常提及的是 iPhone 而非安卓機?
2016年發布的安卓手機,你最喜歡哪一款?
既然微軟能讓小米4用上wp10為什麼不讓所有的安卓手機都能用上wp10?
所謂的iOS「偽多任務」和Android的多任務處理的區別在哪?
為什麼 Android L 不在多任務切換界面中提供「一鍵移除所有卡片」的功能?

TAG:逆向工程 | 安全 | Android |