綁定帳號登入

Android 台灣中文網

打印 上一主題 下一主題

[教程] android逆向學習小結--CrackMe_1

[複製連結] 查看: 3359|回覆: 3|好評: 0
跳轉到指定樓層
樓主
fam1001 | 收聽TA | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
發表於 2016-3-28 11:38

馬上加入Android 台灣中文網,立即免費下載應用遊戲。

您需要 登錄 才可以下載或查看,沒有帳號?註冊

x
斷斷續續的總算的把android開發和逆向的這兩本書看完了,雖然沒有java,和android開發的基礎,但總體感覺起來還是比較能接收的,畢竟都是觸類旁通的。當然要深入的話還需要對這門語言的細節特性和奇技淫巧進行挖掘。

這裡推薦2本書,個人覺得對android開發入門和android逆向入門比較好的教材:

《google android 開發入門與實戰》

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


1. 我對android逆向的認識

因為之前有一些windows逆向的基礎,在看android逆向的時候感覺很多東西都是能共通的。但因為android程式本身的特性,還是有很多不同的地方。


1.1 反編譯

android程式使用java語言編寫,從java到android虛擬機(Dalvik)的dex代碼(可以看成是android虛擬機的機器碼)需要一個中間語言的轉換過程。類似.NET的IL中間虛擬指令。而我們知道,.NET的IL中間代碼之所以能很容易的"反編譯"回C#源代碼,是因為除了IL中間語言,還包含了大量的META元資料,這些元資料使我們可以很容易的一一對應的反編譯回C#的源代碼。java的中間語言.class檔案也是類似的道理,我們可以使用工具直接從dex機器碼反編譯回java源代碼。


1.2 逆向分析手段

windows的逆向分析中,我們可以使用OD或者C32ASM來分析彙編指令(當然OD還可以動態調試),或者使用IDA + F5(hex Ray反編譯插件)來靜態的分析源代碼(C/C++)

在android逆向分析過程中:

1) 我們可以使用ApkTool(本質上是BakSmali反彙編引擎)對apk檔案進行反彙編,得到各個類、方法、資源、佈局檔案...的smali代碼,我們可以直接通過閱讀smali代碼來分析程式的代碼流,進行關鍵點的修改或者代碼注入。

2) 我們可以從apk中提取.dex檔案,使用dex2jar工具對dex進行反彙編,得到jar包(java虛擬指令),然後使用jd-gui等工具再次反編譯,得到java源代碼,從源碼級的高度來審計代碼,更快的找到關鍵點函數或者判斷,然後再回到smali層面,對代碼進行修改。這種方法更傾向於輔助性的,最終的步驟我們都要回到smali層面來修改代碼。

3) 使用IDA Pro直接分析APK包中的.dex檔案,找到關鍵點代碼的位置,記下檔案偏移量,然後直接對.dex檔案進行修改。修改完之後把.dex檔案重新導入apk中。這個時候要注意修改dex檔案頭中DexHeader中的checksum字段。將這個值修復後,重新導入apk中,並刪除apk中的META-INF資料夾,重新簽名即可完成破解。


1.3 android與C的結合

在學習android逆向的時候感覺遇到的最難的問題就是分析原生代碼,即JNI代碼。開發者使用android NDK編寫C/C++代碼供android的java代碼調用(通過java的代碼轉接層來完成接口的轉換)。

使用android NDK編寫的C/C++代碼最終會生成基於ARM的ARM ELF可執行檔案,我們想要分析軟體的功能就必須掌握另一項技能,ARM彙編,ARM彙編個人感覺雖然和X86彙編類似,不過由於IDA Pro對ARM彙編沒有反編譯功能以及似乎沒有工具能動態調試ARM代碼(我網上沒找到),導致我們只能直接硬看ARM代碼,加上往往伴隨著複雜的密碼學算法等等,導致對Native Code的逆向相對來說比較困難,對基本功的要求比較高。


1.4 關於分析android程式

1) 瞭解程式的AndroidManifest.xml。在程式中使用的所有activity(交互組件)都需要在AndroidManifest.xml檔案中手動聲明。包括程式啟動時預設啟動的主activity,通過研究這個AndroidManifest.xml檔案,我們可以知道該程式使用了多少的activity,主activity是誰,使用了哪些權限,使用了哪些服務,做到心中有數。


2) 重點關注Application類

這本來和1) AndroidManifest.xml是一起的,但是分出來說是因為這個思路和windows下的逆向思路有相通之處。

在windows exe的資料目錄表中如果存在TLS項,那程式在載入後會首先執行這個TLS中的代碼,執行完之後才進行main主程式入口。

在android 中Application類比程式中其他的類啟動的都要早。


3) 定位關鍵代碼

3.1) 訊息反應法(關鍵字查找法)

通過執行程式,查找程式UI中出現的提示訊息或標題等關鍵字,到String.xmlzhong中查找指定字符串的di,然後到程式中查找指定的id即可。

3.2) 特徵函數法

這種做法的原理和訊息反應法類似,因為不管你提示什麼訊息,就必然會調用相應的API函數來顯示這個字符串,例如Toast.MakeText().show()

例如在程式中搜尋Toast就有可能很快地定位到調用代碼

3.3) 代碼注入法

代碼注入法屬於動態調試的方法,我們可以手動修改smali反彙編代碼,加入Log輸入,配合LogCat來查看程式執行到特定點時的狀態資料。

3.4) 棧跟蹤法

棧跟蹤法屬於動態調試方法,從原理上和我們用OD調試時查看call stack的思想類似。我們可以在smali代碼中注入輸出執行時的棧跟蹤訊息,然後查看棧上的函數調用序列來理解方法的執行流程(因為每個函數的執行都會在棧上留下記錄)

3.5) Method Profiling

Method Profiling,方法剖析(這是書上的叫法,我更願意叫BenchMark測試法),它屬於一種動態調試方法,它主要用於熱點分析和性能優化。在DDMS中有提供這個功能,它除了可記錄每個函數所佔用的CPU時間外,還能夠跟蹤所有的函數調用關係。


1.5 關於android的代碼混淆和加殼

java語言編寫的代碼本身就很容易被反編譯,google為此在android 2.3的SDK中正式加入了ProGuard代碼混淆工具,只要正確的配置好project.properties與proguard.cfg兩個檔案即可使用ProGuard混淆軟體。

java語言由於語言自身的特殊性,沒有外殼保護這個概念,只能通過混淆方式對其進行保護。對android NDK編寫的Native Code倒是可以進行加殼,但目前似乎只能進行ups的壓縮殼保護


2. CrackMe_1 分析學習


2.1 執行一下程式,收集一些基本訊息
「用Android 就來APK.TW」,快來加入粉絲吧!
Android 台灣中文網(APK.TW)

評分

參與人數 6碎鑽 +2 幫助 +5 收起 理由
kueric + 1 + 1 非常讃
Hashimoto-Nana + 1 偶像,看完你的內容,讓我找到了活著的意義.
liwil + 1
104401 + 1 好內容,老衲來為這篇文章開開光.
d36584 + 1 偶像,看完你的內容,讓我找到了活著的意義.
球-球 + 1 好內容,老衲來為這篇文章開開光.

查看全部評分

收藏收藏9 分享分享 分享專題
用Android 就來Android 台灣中文網(https://apk.tw)
回覆

使用道具 舉報

沙發
coder | 收聽TA | 只看該作者
發表於 2016-4-27 09:21
越發感覺自己是多麼的菜了,哎。。。

評分

參與人數 1幫助 +1 收起 理由
104401 + 1 好內容,老衲來為這篇文章開開光.

查看全部評分

用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

板凳
cookieses | 收聽TA | 只看該作者
發表於 2016-5-12 11:31
讲得很好,然而从dll文件入手时,发现文件有壳,奈何不会脱壳233

評分

參與人數 1幫助 +1 收起 理由
104401 + 1 好內容,老衲來為這篇文章開開光.

查看全部評分

用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

地板
liwil | 收聽TA | 只看該作者
發表於 2016-9-3 14:38
請教一下,下面smali有段AAA字串,能用strings.xml中改寫嗎? 感謝!

const-string v1, "AAA"
invoke-virtual {v0, v1}, Lcom/android/DTVLauncher/FirstActivity$ChooseDialog;->setTitle(Ljava/lang/CharSequence;)V
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則