版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
惡意代碼的植入13.1反編譯13.2邏輯分析13.3動態(tài)調(diào)試應(yīng)用程序13.4惡意代碼的植入13.5重新打包小結(jié)
13.1反編譯
13.1.1反編譯Dalvik字節(jié)碼文件
Google于2007年底正式發(fā)布了AndroidSDK,作為Android系統(tǒng)的重要特性,Dalvik虛擬機(jī)第一次進(jìn)入了人們的視野。Dalvik虛擬機(jī)作為Android平臺的核心組件,具有如下特點(diǎn):
(1)體積小,占用內(nèi)存空間小。
(2)專用的DEX可執(zhí)行文件格式,體積更小,執(zhí)行速度更快。
(3)常量池采用32位索引值,尋址類方法名、字段名、常量更快。
(4)基于寄存器架構(gòu),擁有完整的指令系統(tǒng)。
(5)提供了對象生命周期管理、堆棧管理、線程管理、安全和異常管理以及垃圾回收等重要功能。
所有的Android程序都運(yùn)行在Android系統(tǒng)進(jìn)程里,每個進(jìn)程對應(yīng)一個Dalvik虛擬機(jī)實(shí)例。
APK是AndroidPacKage的縮寫,即Android安裝包。將APK文件直接傳到Android模擬器或Android手機(jī)中執(zhí)行即可安裝。APK文件是zip格式,但后綴名被修改為apk,在Windows上可以通過WinRar等程序直接解壓查看。解壓APK后,其目錄結(jié)構(gòu)如表13-1所示。
資源文件在逆向解析過程中十分重要,其相關(guān)資源文件如表13-2所示。
1.
Dalvik虛擬機(jī)字節(jié)碼的指令格式
在Android4.0源碼Dalvik/docs目錄下提供了一份文檔instruction-forma-ts.html,里面詳細(xì)列舉了Dalvik虛擬機(jī)字節(jié)碼指令的所有格式,表13-3列出了部分虛擬機(jī)字節(jié)碼的指令格式,詳細(xì)情況請查閱該文檔。
2.Dalvik虛擬機(jī)字節(jié)碼的類型、方法和字段的表示方法
1)類型
Dalvik字節(jié)碼有兩種類型,即基本類型和引用類型。對象和數(shù)組是引用類型,其他是基本類型,如表13-4所示。
2)方法
方法調(diào)用的表示格式是:
Lpackage/name/ObjectName;->MethodName(III)Z
“Lpackage/name/ObjectName;”表示類型,MethodName是方法名,III為參數(shù)(在此是三個整型參數(shù)),Z是返回類型(bool型)。函數(shù)的參數(shù)是一個接一個的,中間沒有隔開。下面是一個更復(fù)雜的例子:
method(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
在Java中則為:
Stringmethod(int,int[][],int,String,Object[])
3)字段
字段即Java中類的成員變量,表示格式如下:
Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;
即包名、字段名和字段類型,字段名與字段類型之間以“:”分隔。
3.
Dalvik虛擬機(jī)字節(jié)碼指令解析
為了能夠順利閱讀逆向的smail代碼片段,需要熟悉各個指令的功能與格式,具體可查閱相關(guān)文檔。下面先介紹Dalvik虛擬機(jī)字節(jié)碼中寄存器的命名法。
在Dalvik虛擬機(jī)字節(jié)碼中,寄存器的命名法主要有兩種:v命名法和p命名法。假設(shè)一個函數(shù)使用M個寄存器,并且該函數(shù)有N個入?yún)ⅲ鶕?jù)Dalvik虛擬機(jī)參數(shù)傳遞方式中的規(guī)定:在入?yún)⑹褂玫淖詈驨個寄存器中,局部變量使用從v0開始的前M~N個寄存器。比如:某函數(shù)A使用了五個寄存器,兩個顯式的整型參數(shù),如果函數(shù)A是非靜態(tài)方法,函數(shù)被調(diào)用時(shí)會傳入一個隱式的對象引用,因此實(shí)際傳入的參數(shù)個數(shù)是三個。根據(jù)傳參規(guī)則,局部變量將使用前兩個寄存器,參數(shù)會使用后三個寄存器。
在實(shí)際的smali文件中,幾乎都是使用p命名法,原因是使用p命名法能夠通過寄存器的名字前綴,判斷寄存器到底是局部變量還是函數(shù)的入?yún)?。在smali語法中,在調(diào)用非靜態(tài)方法時(shí)需要傳入該方法所在對象的引用,因此此時(shí)p0表示的是傳入的隱式對象引用,從p1開始才是實(shí)際傳入的入?yún)?。但在調(diào)用靜態(tài)方法時(shí),由于靜態(tài)方法不需要構(gòu)建對象的引用,因而不需要傳入該方法所在對象的引用,此時(shí)從p0開始就是實(shí)際傳入的入?yún)ⅰ?/p>
在Dalvik指令中使用“v加數(shù)字”的方法來索引寄存器,如v0、v1、v15、v255,但每條指令使用的寄存器索引范圍都有限制(因?yàn)镈alvik指令字節(jié)碼必須字節(jié)對齊)。此處使用大寫字母表示四位數(shù)據(jù)寬度的取值范圍,如指令“movevA,vB”表示目的寄存器vA可使用v0~v15的寄存器,源寄存器vB可以使用v0~v15的寄存器。再如指令“move/from16vAA,vBBBBB”表示目的寄存器vAA可使用v0~v255的寄存器,源寄存器vB可以使用v0~v65535的寄存器。簡而言之,當(dāng)目的寄存器和源寄存器中有一個寄存器的編號大于15時(shí),即需要加上“/from16”指令才能得到正確運(yùn)行。
4.
smali格式結(jié)構(gòu)
1)文件格式
無論是普通類、抽象類、接口類還是內(nèi)部類,在反編譯出的代碼中,都以單獨(dú)的smali
文件來存放。每個smali文件頭三行描述了當(dāng)前類的一些信息,格式如下:
.class<訪問權(quán)限>[修飾關(guān)鍵字]<類名>
.super<父類名>
.source<源文件名>
打開HelloWorld.smali文件,頭三行代碼如下:
.classpublicLHelloWorld;
.superLandroid/app/Activity;
.source"HelloWorld.java"
2)類的結(jié)構(gòu)
無論是普通類、抽象類、接口類還是內(nèi)部類,反編譯時(shí)會為每個類單獨(dú)生成一個Smali文件,但是內(nèi)部類存在相對比較特殊的地方。
(1)內(nèi)部類的文件以“[外部類]$[內(nèi)部類].smali”的形式命名,匿名內(nèi)部類文件以“[外部類]$[數(shù)字].smali”來命名。
(2)內(nèi)部類訪問外部類的私有方法和變量時(shí),通過編譯器生成的“合成方法”來間接訪問。
(3)編譯器會將外部類的引用作為第一個參數(shù)插入到內(nèi)部類的構(gòu)造器參數(shù)列表中。
(4)內(nèi)部類的構(gòu)造器中先保存外部類的引用到一個“合成變量”,再初始化外部類,最后初始化自身。
具有Dalvik文件結(jié)構(gòu)及smail相關(guān)基本知識后,即可使用apktool反編譯工具將.apk文件反編譯為smail代碼進(jìn)行分析,具體步驟如下:
第一步,apktool工具下載。
第二步,apktool工具安裝。
第三步,對.apk文件進(jìn)行反編譯。
按下Windows+R打開cmd窗口,運(yùn)行“apktool”命令出現(xiàn)apktool的版本號和指導(dǎo)的命令,如圖13-1所示。
圖13-1
apktool參數(shù)列表
找一個apk,嘗試反編譯,運(yùn)行“apktoold-fc:\test.apk-oc:\test”命令,將test.apk反編譯,將反編譯后的文件放入C盤下的test文件中,如圖13-2所示。
圖13-2
apktool反編譯過程
反編譯的文件結(jié)構(gòu)如圖13-3所示,反編譯后文件夾所存儲的內(nèi)容如表13-5所示。
圖13-3反編譯的文件結(jié)構(gòu)
造成該現(xiàn)象的原因是Android的assets和res文件都不會編譯為二進(jìn)制文件,因此反編譯后基本可看到其全貌。Android中的?.java文件在JVM編譯之后變成?.class文件,再經(jīng)過Android的虛擬機(jī)Dalvik將代碼編譯為?.smali文件。smali是另外一種語言,涉及寄存器操作等。如圖13-4所示為smali語言的代碼格式。
圖13-4
smali代碼格式
13.1.2反編譯原生文件
原生文件是指反編譯后獲得的so庫文件,AndroidApp在Native層加載so庫文件。
1.在Native層動態(tài)加載so庫的原因
從App的性能方面考慮,需要在Native層使用C/C++?實(shí)現(xiàn)的方案,Native層再通過JNI的方式將方案提供給實(shí)現(xiàn)應(yīng)用基本功能的Java層調(diào)用,以此拓展計(jì)算密集型的功能。例如App如果要支持播放手機(jī)自身不支持的音頻格式,就需要在Native層實(shí)現(xiàn)App自己的音頻解碼功能。
隨著項(xiàng)目規(guī)模的增大,Native層的代碼規(guī)模也逐漸膨脹。為了更清晰地組織代碼,Native層之間會按照模塊分別構(gòu)建成獨(dú)立的so庫。為了簡化Java層與Native層之間的通信方式,通常會特地使用一個JNI層so庫引用其他實(shí)現(xiàn)具體功能的功能實(shí)現(xiàn)so庫。Java層只加載該JNI層so庫,來間接調(diào)用功能實(shí)現(xiàn)so庫,如圖13-5所示。
圖13-5原生層代碼被調(diào)用流程
2.
Native層的so庫動態(tài)加載的實(shí)現(xiàn)
在Native層的C/C++?代碼環(huán)境中,so庫動態(tài)加載是使用dlopen()、dlsym()和dlclose()函數(shù)實(shí)現(xiàn)的。這三個函數(shù)均在頭文件<dlfcn.h>中定義,作用分別是:dlopen()表示打開一個動態(tài)鏈接庫,返回一個動態(tài)鏈接庫的句柄;dlsym()表示可根據(jù)動態(tài)鏈接庫的句柄和符號名,返回動態(tài)鏈接庫內(nèi)的符號地址,該地址既可以是變量指針,也可以是函數(shù)指針;dlclose()表示關(guān)閉動態(tài)鏈接庫句柄,并對動態(tài)鏈接庫的引用計(jì)數(shù)減“1”,當(dāng)庫的引用計(jì)數(shù)為“0”時(shí)將會被系統(tǒng)卸載。一般使用C/C++實(shí)現(xiàn)so庫動態(tài)加載的流程如下:
(1)首先調(diào)用dlopen()函數(shù),此函數(shù)所需的參數(shù)是so庫的路徑和加載模式。
(2)在得到so庫句柄之后,即可調(diào)用dlsym()函數(shù)傳入so庫句柄和所需的函數(shù)或變量名稱,返回相應(yīng)的函數(shù)指針或變量指針;加載方即可使用返回的指針調(diào)用被加載so庫中定義的函數(shù)和數(shù)據(jù)結(jié)構(gòu)。
(3)當(dāng)so庫的調(diào)用結(jié)束后,調(diào)用dlclose()函數(shù)關(guān)閉并卸載so庫。
(4)當(dāng)打開、關(guān)閉so庫或者獲取so庫中操作對象的指針出現(xiàn)錯誤時(shí),可調(diào)用dlerror()函數(shù)獲取具體的錯誤原因。
3.?
Java層調(diào)用Native層動態(tài)加載的實(shí)現(xiàn)
確定動態(tài)加載的方案后,Native層代碼模塊的劃分有所修改,即增加一個公共數(shù)據(jù)結(jié)構(gòu)定義的so庫,專門存放一些通用常量和基本的數(shù)據(jù)操作接口,例如一些基類的定義和JNI層so庫操作基類對象,具體的功能實(shí)現(xiàn)則通過so庫繼承這些基類,然后定義具體操作來完成。
由于基類數(shù)據(jù)結(jié)構(gòu)定義需要事先獲知,所以該so庫需要作為共享庫被JNI層so庫和功能實(shí)現(xiàn)so庫在運(yùn)行時(shí)依賴(具體表現(xiàn)就是在構(gòu)建這些so庫的Android.mk文件中,將公共定義的so庫指定到“LOCAL_SHARED_LIBRARIES”變量中),而JNI層so庫則通過調(diào)用dlopen()動態(tài)加載功能實(shí)現(xiàn)so庫。so庫動態(tài)加載的流程如下:
(1)為了便于配置so庫路徑,so庫路徑的獲取方法在Java層實(shí)現(xiàn),在動態(tài)加載開始之前,Native層通過JNI對象指針調(diào)用Java層的so庫路徑配置,獲取so庫路徑并將其回傳到Native層。
(2)功能實(shí)現(xiàn)so庫對外聲明構(gòu)造和析構(gòu)操作接口子類的函數(shù),JNI層so庫通過dlopen()函數(shù)打開功能實(shí)現(xiàn)so庫之后,再調(diào)用dlsym()函數(shù)獲取兩個對外聲明的函數(shù)的指針,調(diào)用構(gòu)造函數(shù)獲取操作接口對象,并把析構(gòu)函數(shù)指針和so庫句柄登記到以操作接口對象為鍵值的映射表中。
(3)當(dāng)需要釋放關(guān)閉so庫的時(shí)候,從映射表中取回析構(gòu)函數(shù)指針和so庫句柄,先調(diào)用析構(gòu)函數(shù)釋放操作接口對象,調(diào)用dlclose()函數(shù)并傳入so庫句柄,再卸載so庫,刪除析構(gòu)函數(shù)指針和so庫句柄在映射表中的登記。
4.原生文件的反編譯
對原生文件進(jìn)行反編譯的基礎(chǔ)知識為:熟練使用IDA
Pro工具和熟悉常用的ARM匯編指令。此類知識的相關(guān)內(nèi)容參見本書的基本篇。
首先解壓出.apk文件中的so文件,可使用apktool來實(shí)現(xiàn)。其次使用IDAPro逆向所獲得的so文件,如圖13-6所示。
圖13-6逆向所獲得的so文件
13.2邏輯分析
13.2.1
Java代碼分析本節(jié)以某款手環(huán)的App代碼分析為例介紹Java代碼分析,代碼分析流程如圖13-7所示。首先應(yīng)熟悉官方App設(shè)置界面。在逆向分析App時(shí),最好對官方的App功能和軟件界面有足夠的了解,這樣有利于工作目標(biāo)的快速實(shí)現(xiàn),如對官方App設(shè)置界面及操作的熟悉,如圖13-8所示。圖13-7代碼分析流程圖13-8官方App設(shè)置界面
通過操作所對應(yīng)的Activity及操作事件進(jìn)行代碼定位,定位結(jié)果如圖13-9所示。
圖13-9對官方App定位的代碼片段
官方App實(shí)現(xiàn)由24小時(shí)轉(zhuǎn)換為12小時(shí)的操作步驟為:單擊12小時(shí)選項(xiàng),彈出正在與設(shè)備同步對話框,同步成功則手環(huán)時(shí)間格式修改成功。定位時(shí)間格式設(shè)置Activity中關(guān)于12小時(shí)選項(xiàng)的單擊時(shí)間事件代碼,代碼界面如圖13-10所示。
圖13-10官方App調(diào)用SetTimeToDevice()
通過代碼分析可知:當(dāng)單擊12小時(shí)選項(xiàng)后,觸發(fā)設(shè)置項(xiàng)的一些顯示效果動作后,調(diào)用了SetTimeToDevice()方法。SetTimeToDevice()代碼追蹤如圖13-11所示。
圖13-11
SetTimeToDevice()代碼跟蹤
13.2.2補(bǔ)充分析smali代碼
在APK逆向時(shí),有些smali代碼無法映射為Java代碼,則需要直接對smail代碼進(jìn)行分析。獲得APK的smali代碼的工具很多,現(xiàn)在以baksmali為例闡述smail代碼分析過程。由于分析過程中涉及smali基本知識,請參考本書有關(guān)章節(jié)。
步驟1:解壓APK包。
<codeclass=“hljsavrasm”>unzipxxx.apk</code>
步驟2:用baksmali對解壓出來的DEX文件反編譯。
<codeclass="hljsavrasm">java-jarbaksmali-2.0.3.jarclasses.dex</code>
步驟3:代碼分析。
①寄存器與變量。
寄存器采用v和p來命名,v表示本地寄存器,p表示參數(shù)寄存器
②基本指令。
movev0,v3:將寄存器v3的值移動到寄存器v0。
const-stringv0,“MainActivity”:將字符串?“MainActivity”?賦值給寄存器v0。
invoke-super:調(diào)用父函數(shù)。
return-void:函數(shù)返回void。
new-instance:創(chuàng)建實(shí)例。
iput-object:對象賦值。
iget-object:調(diào)用對象。
invoke-static:調(diào)用靜態(tài)函數(shù)。
invoke-direct:調(diào)用函數(shù)。
④字段。
在smali文件中,字段的聲明使用“.field”指令,字段分為靜態(tài)字段和實(shí)例字段,具體細(xì)節(jié)請查看本章有關(guān)內(nèi)容。
⑤方法。
smali的方法聲明使用“.method”指令,方法分為直接方法和虛方法兩種,具體細(xì)節(jié)請查看本章有關(guān)內(nèi)容。
⑥注解。
如果一個類使用了注解,那么smali中會使用“.annotation”指令,具體細(xì)節(jié)請查看本章有關(guān)內(nèi)容。
⑦smali插樁。
插樁的原理是靜態(tài)地修改APK的samli文件,重新打包。使用該方法得到一個APK的smali文件,在關(guān)鍵部位添加自己的代碼,需要遵循smali語法。例如在關(guān)鍵地方打log,輸出關(guān)鍵信息,再重新進(jìn)行打包簽名。
13.2.3補(bǔ)充分析原生代碼
以分析登錄代碼為例,下面對Native層中的代碼進(jìn)行分析。在Java代碼層查找獲取登錄密碼的代碼,從圖13-12中觀察到Java代碼調(diào)用了psProcess對象。
跟蹤分析psProcess對象的所屬類代碼,如圖13-13所示。
圖13-12
Java如何調(diào)用psProcess圖13-13跟蹤psProcess
psProcess對象所屬類在代碼中調(diào)用Native層中的getDbPassword()方法,因此接下來對該方法進(jìn)行跟蹤。圖13-14所示為使用IDAPro跟蹤到該方法的代碼。
圖13-14在IDAPro中分析原生代碼
在該函數(shù)的實(shí)現(xiàn)中查看BL/BLX等信息、跳轉(zhuǎn)邏輯以及返回值。在函數(shù)的最后部分,發(fā)現(xiàn)一個重點(diǎn),即“BL__android_log_print”是在Native層調(diào)用log的函數(shù),再往上觀察,可以發(fā)現(xiàn)tag是System.out.c。此時(shí)可在Java層添加日志,通過全局搜索該方法,發(fā)現(xiàn)此時(shí)在yi.class中該方法被調(diào)用,如圖13-15所示。
圖13-15
Java代碼中搜索調(diào)用getDbPassword的點(diǎn)
修改yi.smail代碼,如圖13-16所示。
圖13-16修改yi.smail文件中的代碼
13.3動態(tài)調(diào)試應(yīng)用程序
分析代碼的兩種方法分別為靜態(tài)分析與動態(tài)分析。靜態(tài)分析相對于動態(tài)分析效率低,難度大。但動態(tài)分析的過程本身就包含著靜態(tài)分析,兩者相輔相成。那什么是動態(tài)分析?動態(tài)分析是通過運(yùn)行要分析的軟件,應(yīng)用動態(tài)調(diào)試技術(shù)對軟件的運(yùn)行狀態(tài)進(jìn)行跟蹤和調(diào)試,來獲取軟件運(yùn)行關(guān)鍵環(huán)節(jié)的臨時(shí)變量及狀態(tài)。由此可知,動態(tài)分析是以動態(tài)調(diào)試為基礎(chǔ)的。下面介紹有關(guān)動態(tài)調(diào)試的內(nèi)容。
靜態(tài)分析技術(shù)是指破解者利用反匯編工具將二進(jìn)制的可執(zhí)行文件翻譯成匯編代碼,通過對代碼的分析來破解軟件。而動態(tài)分析是指破解者利用調(diào)試器跟蹤軟件的運(yùn)行,尋求破解的途徑。以下就以Android的APK動態(tài)分析為例介紹動態(tài)分析技術(shù)(動態(tài)調(diào)試)。
13.3.1動態(tài)調(diào)試環(huán)境配置
由于動態(tài)調(diào)試的對象及工具不同,動態(tài)調(diào)試環(huán)境的配置也不相同,本小節(jié)擬使用Android
Studio實(shí)現(xiàn)對APK文件中的Java及smali代碼進(jìn)行調(diào)試,并使用IDAPro對原生代碼進(jìn)行調(diào)試。因此環(huán)境配置主要以這兩個調(diào)試場景為主,下面分別介紹兩種調(diào)試工作的環(huán)境配置及調(diào)試過程。
13.3.2使用AndroidStudio動態(tài)調(diào)試程序
AndroidStudio動態(tài)調(diào)試Java代碼的環(huán)境配置及操作同其他集成開發(fā)環(huán)境大同小異,本小節(jié)重點(diǎn)介紹AndroidStudio調(diào)試smail代碼的環(huán)境設(shè)置,具體內(nèi)容如下:
(1)安裝配置插件。
(2)下載插件smalidea,下載地址為https:///JesusFreke/smali/downloads。
(3)下載smalidea-0.03.zip。
(4)下載完成后,選擇AndroidStudio的“Settings”→“Plugins”,點(diǎn)擊【Installpluginfromdisk…】按鈕,如圖13-17所示。
圖13-17在AndroidStudio中導(dǎo)入smalidea
AndroidStudio安裝并設(shè)置完成后進(jìn)行以下操作:
①反編譯APK,修改AndroidManifest.xml中的debug屬性并在oncreate()中設(shè)置斷點(diǎn),如圖13-18所示。
圖13-18設(shè)置斷點(diǎn)(允許進(jìn)入調(diào)試模式)
找到入口Activity之后,在onCreate()方法的第一行加上“waitForDebugger”代碼即可。找到對應(yīng)的MainActivity的smali源碼,添加一行代碼“invoke-static{},Landroid/os/Debug;
->waitForDebugger()V”,此語句符合smali語法,對應(yīng)的Java代碼為“android.os.Debug.
waitForDebugger();”。設(shè)置界面如圖13-19所示。
圖13-19啟動程序進(jìn)入調(diào)試模式
(2)使用AndroidStudio導(dǎo)入該目錄SmaliDebug,如圖13-20所示。
圖13-20導(dǎo)入修改過的項(xiàng)目
(3)選擇“Createprojectfromexistingsources”,點(diǎn)擊【Next】按鈕,如圖13-21所示。
圖13-21導(dǎo)入過程截圖
(4)成功導(dǎo)入工程后,右鍵點(diǎn)擊src目錄,選擇“MarkDirectoryAs”→“SourcesRoot”,如圖13-22所示。
圖13-22設(shè)定SourcesRoot
(5)配置遠(yuǎn)程調(diào)試的選項(xiàng),選擇“Run”→“EditConfigurations…”(如圖13-23所示),并在隨后出現(xiàn)的對話框中(如圖13-24所示)選擇“Remote”。
圖13-23編輯配置圖13-24選擇遠(yuǎn)程
(6)增加一個Remote調(diào)試的調(diào)試選項(xiàng),端口選擇8700,如圖13-25和圖13-26所示。
圖13-25增加一個遠(yuǎn)程調(diào)試端口圖13-26選擇ProjectStructure菜單
(7)選擇“File”→“ProjectStructure…”,配置JDK,如圖13-27所示。
圖13-27配置JDK
(8)以調(diào)試狀態(tài)啟動App。
(9)下好斷點(diǎn)之后選擇“Run”→“Debug”,如圖13-28所示。
圖13-28跟蹤演示
(10)調(diào)試程序。
13.3.3使用IDAPro調(diào)試原生程序
(1)在IDA安裝目錄下獲取android_server命令文件。
android_server使用gdb和gdbserver實(shí)現(xiàn)調(diào)試功能。gdb和gdbserver在調(diào)試時(shí),必須注入被調(diào)試的程序進(jìn)程中。但如果是非root設(shè)備,注入進(jìn)程只能借助于run-as命令實(shí)現(xiàn),所以,如果要調(diào)試應(yīng)用進(jìn)程,必須要注入它的內(nèi)部。IDA調(diào)試so原理同上,它需要注入(Attach附加)進(jìn)程才能進(jìn)行調(diào)試,但是IDA沒有自己開發(fā)一個類似于gdbserver的工具(即android_server),所以IDA需要運(yùn)行在設(shè)備中,保證和PC端的IDA進(jìn)行通信,比如獲取設(shè)備的進(jìn)程信息、具體進(jìn)程的so內(nèi)存地址和調(diào)試信息等。
因此,需要將android_server保存到設(shè)備的“/data”目錄下,修改運(yùn)行權(quán)限。因?yàn)樽⑷脒M(jìn)程操作必須要使用root權(quán)限,所以必須在root環(huán)境下運(yùn)行,如圖13-29所示。
圖13-29系統(tǒng)中的android_server指令
注意:此處將android_server放在“/data”目錄下,然后在終端中輸入“./android_server”,按回車鍵運(yùn)行,提示“IDAAndroid32-bit”,所以在打開IDA的時(shí)候一定要是32位的IDA而不是64位的。否則,保存IDA在安裝之后都是有兩個可執(zhí)行的程序,一個是32位的,一個是64位的。如果打開不正確會出現(xiàn)如圖13-30所示的錯誤。
圖13-30IDAAndroid報(bào)錯信息
(2)使用IDA對程序進(jìn)行調(diào)試。
以上操作已將android_server運(yùn)行成功。下面用IDA嘗試連接,獲取信息,進(jìn)行進(jìn)程附加注入。
首先打開一個IDA,用來對so文件作靜態(tài)分析;再打開一個IDA,用來調(diào)試so文件。所以都是需要打開兩個IDA,也叫作雙開IDA操作。
如圖13-31所示,選擇Go選項(xiàng),則無需打開so文件,進(jìn)入后是一個空白頁。
圖13-31再打開一個IDA
如圖13-32所示,選擇“Debugger”選項(xiàng),再選擇“Attach”,可觀察到很多debugger,由此可見IDA工具做到了很多debugger的兼容,可調(diào)試很多平臺下的程序。此處選擇“RemoteARMLinux/Androiddebugger”,將出現(xiàn)如圖13-33所示界面。
圖13-32IDA中的Debugger圖13-33IDA中的Androiddebugger窗口
點(diǎn)擊【OK】按鈕,將列舉出設(shè)備進(jìn)程信息,如圖13-34所示。
圖13-34設(shè)備進(jìn)程列表
找到函數(shù)地址,下斷點(diǎn),開始調(diào)試。按下組合鍵【Ctrl+S】找到需要調(diào)試so文件的基地址74FE4000,如圖13-35所示。
圖13-35獲得so文件的基地址
通過另一個IDA打開so文件,查看函數(shù)的相對地址E9C,如圖13-36所示。
圖13-36獲得so文件中的相對地址
通過與基地址相加得到了函數(shù)的絕對地址74FE4E9C。按下【G】鍵快速跳轉(zhuǎn)到絕對地址,如圖13-37所示。
圖13-37跳轉(zhuǎn)到指定地址
跳轉(zhuǎn)到指定地址之后,點(diǎn)擊最左邊的綠色圓點(diǎn)即可設(shè)置斷點(diǎn),如圖13-38所示。
點(diǎn)擊左上角的綠色按鈕,或按【F9】鍵運(yùn)行程序。進(jìn)入調(diào)試階段后,按【F8】鍵進(jìn)行單步調(diào)試,按【F7】鍵單步進(jìn)入調(diào)試。
圖13-38設(shè)置斷點(diǎn)
13.4惡意代碼的植入
13.4.1手工植入具有間諜軟件性質(zhì)的監(jiān)控類軟件,多是通過社會工程學(xué)等手段手工植入到用戶手機(jī)中的,如家長控制工具“Kidlogge”。該植入方法非常有針對性,往往更關(guān)注受監(jiān)控用戶的隱私,被用來做婚外戀調(diào)查、商業(yè)和政府機(jī)密竊取等不可告人的事情。該植入手段主要靠欺騙及誘惑等手段使用戶接受下載惡意代碼并安裝。
13.4.2捆綁植入
Android應(yīng)用軟件安裝包中可以包含原始的、不會被壓縮的資源文件(存放在安裝包中的res、raw目錄中),給攻擊者帶來了可乘之機(jī)。攻擊者將惡意軟件直接捆綁到普通軟件中,普通軟件安裝后,惡意軟件安裝包被釋放并安裝到用戶手機(jī)中。具體的調(diào)用惡意資源文件的途徑包括通過Android入口點(diǎn)切換到惡意代碼、通過監(jiān)控廣播機(jī)制調(diào)用惡意代碼等,具體原理如下。
Android是一款建立在Linux內(nèi)核基礎(chǔ)上的操作系統(tǒng),在繼承Linux安全的基礎(chǔ)上,對內(nèi)核源碼作了大量的增加和修改,使得Android操作系統(tǒng)的安全機(jī)制不但有著傳統(tǒng)Linux安全機(jī)制還有與虛擬機(jī)相關(guān)的和Android所特有的安全機(jī)制。但由于Android系統(tǒng)的開放性,Android應(yīng)用程序存在的安全性隱患比較多。比如存在多種盜版市場,用戶無法鑒別哪些是具有潛在危險(xiǎn)的軟件,可能會下載到不安全的軟件,惡意軟件就是通過這種方式進(jìn)行傳播的。
調(diào)查表明:在第三方市場中的應(yīng)用程序部分來自于對官方市場的剽竊或重新打包(利用本章前半部分介紹的App逆向及靜態(tài)、動態(tài)調(diào)試技術(shù)對官方App進(jìn)行分析、剽竊后,將惡意代碼插入到官方App的代碼中進(jìn)行重新打包)。即便是在官方的安卓市場,也存在對其他各方合法應(yīng)用程序重新打包的惡意應(yīng)用程序。其次,Android采用對應(yīng)用程序簽名的形式為開發(fā)者自簽名,無法對開發(fā)者的身份進(jìn)行驗(yàn)證,惡意代碼靜態(tài)注入正是利用Android簽名機(jī)制的缺陷。
惡意程序根據(jù)實(shí)現(xiàn)方法可分為兩類:第一類是攻擊者編寫惡意應(yīng)用,使用與常見應(yīng)用相似的圖標(biāo)與界面,通過偽裝成常見應(yīng)用來達(dá)到欺騙的目的,這種方式工作量大且效果不好;第二類是攻擊者對正常應(yīng)用實(shí)施代碼植入攻擊,修改正常應(yīng)用的程序執(zhí)行流程來達(dá)到攻擊的目的,即惡意代碼植入。
根據(jù)植入方式不同,惡意代碼植入分為三種。
第一種是基于程序入口點(diǎn)的惡意代碼植入。
第二種是基于Android系統(tǒng)廣播機(jī)制的惡意代碼植入
第三種是基于篡改字節(jié)碼的惡意代碼植入。
以下分別介紹這三種攻擊流程。
圖13-39簡要描述了通過程序入口點(diǎn)植入惡意代碼的流程。
圖13-39基于程序入口點(diǎn)的惡意代碼植入
在描述利用Android廣播機(jī)制進(jìn)行惡意代碼植入之前,先復(fù)習(xí)一下Android廣播機(jī)制。Android提供一套完整的API允許應(yīng)用程序自由地發(fā)送和接收廣播,其中主要分為兩種類型:標(biāo)準(zhǔn)廣播和有序廣播。標(biāo)準(zhǔn)廣播是一種異步執(zhí)行的廣播,廣播發(fā)送之后所有的廣播接收器幾乎會在同一時(shí)刻接收到這條廣播,效率較高。有序廣播是一種同步執(zhí)行的廣播,廣播發(fā)送后某一個時(shí)刻只能一個廣播接收器可以接收到,即廣播的傳播是有先后順序的。
Android手機(jī)接收短信的廣播是有序廣播,可以通過構(gòu)建一個惡意的短信廣播接收器,提高其接收廣播的優(yōu)先級,使其優(yōu)先接收到短信,再對短信進(jìn)行修改、攔截等惡意行為,接收機(jī)具有最高優(yōu)先級,在接收到信息后,截?cái)嘈畔⒁苑乐瓜蚝罄^續(xù)傳播,具體流程如圖13-40所示。
圖13-40基于廣播機(jī)制的惡意代碼植入
基于篡改字節(jié)碼的惡意代碼植入的流程圖如圖13-41所示。
圖13-41基于篡改字節(jié)碼的惡意代碼植入
13.5重
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國消防救援學(xué)院《城市土地管理》2023-2024學(xué)年第一學(xué)期期末試卷
- 鄭州體育職業(yè)學(xué)院《電動汽車原理與設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 長春人文學(xué)院《西方政治思想史汪聶才》2023-2024學(xué)年第一學(xué)期期末試卷
- 浙江工貿(mào)職業(yè)技術(shù)學(xué)院《C程序設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 食品衛(wèi)生檢測技術(shù)的發(fā)展
- 策劃感恩節(jié)新媒體活動模板
- 清明文化在媒體傳播中的挖掘模板
- 元旦跨年夜祝福語
- 統(tǒng)編版五年級語文上冊寒假作業(yè)(一)(有答案)
- 徐州幼兒師范高等??茖W(xué)校《創(chuàng)業(yè)基礎(chǔ)實(shí)踐》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年浙江杭州師范大學(xué)附屬醫(yī)院招聘筆試真題
- 學(xué)校自習(xí)室管理及收費(fèi)方案
- 2025年護(hù)理部護(hù)士理論培訓(xùn)計(jì)劃
- 環(huán)保管家管家式管家式一站式服務(wù)合同
- 醫(yī)療廢物污水培訓(xùn)
- 2024年山東省高考政治試卷真題(含答案逐題解析)
- 《用銳角三角函數(shù)解決問題(3)》參考課件
- 房地產(chǎn)營銷策劃 -佛山龍灣壹號學(xué)區(qū)房項(xiàng)目推廣策略提案方案
- 產(chǎn)品共同研發(fā)合作協(xié)議范本5篇
- 風(fēng)水學(xué)的基礎(chǔ)知識培訓(xùn)
-
評論
0/150
提交評論