石宗育 劉凱 謝飛帆
摘要:該文以Andorid系統(tǒng)的安全機制與權(quán)限系統(tǒng)的研究為基礎基礎,對APK文件進行逆向分析。從最基礎的APK文件結(jié)構(gòu)入手,首先對AndroidManifest.xml文件分析,掌握了程序的基本信息后,依次對res資源文件,smali函數(shù)文件進行分析,進一步分析此APP應用程序的運行流程。在掌握了此程序的運行流程后,進行逆向工程,對其smali代碼進行審計分析,找出其中存在問題的地方,并實施自己的猜想與假設。
關(guān)鍵詞:Android;網(wǎng)絡安全;逆向工程
中圖分類號:TP393 文獻標識碼:A 文章編號:1009-5039(2018)19-0096-03
1 分析過程
1.1 將APK安裝包反編譯成Smali文件
使用apktook將down.APK文件反編譯成Smali文件,使用的命令為apktool.batd-fdown.apktest。反編譯后的文件如圖1所示。
其中AndroidManifest.xml文件為Andorid應用配置文件,并且是此應用的入口文件。其中包含一些程序必要的組件和權(quán)限信息,在后面的分析中是第一重要的文件。第二重要的是smali文件夾中以.smali結(jié)尾所有文件。這些文件支持著整個應用程序的運行,不論是需要程序直觀顯示的提示信息、功能按鈕或頁面布局,還是需要程序內(nèi)部處理的數(shù)據(jù)傳輸、變量聲明、或函數(shù)調(diào)用,都是在這些文件中運行完成的[1]。所以當要分析一個程序的運行流程時,這些.smali結(jié)尾的文件是重中之重。最后一個需要分析的文件就是res文件夾中的資源文件了,其中包括著一些圖片資源和字符資源,大部分的字符串都會在這里聲明,當對程序內(nèi)的字符進行搜索時,會有限在次文件夾中搜索。
1.2 對AndroidManifest.xml文件的分析
在AndroidManifest.xml這個文件中,我們需要分析的有兩個部分,第一部分為此APP應用程序需要獲取到我們手機的哪些權(quán)限,如圖2。
從圖2中可以看到,此程序需要獲取的權(quán)限有讀取外部存儲、寫入外部存儲、讀取寫入文件系統(tǒng)、獲取網(wǎng)絡狀態(tài)、訪問互聯(lián)網(wǎng)、獲取電話狀態(tài)、獲取無線網(wǎng)狀態(tài)、系統(tǒng)警報窗口和震動共九個權(quán)限,其中除獲取電話狀態(tài)以外全為普通權(quán)限,不需要用戶授權(quán)系統(tǒng)將自動授予這些權(quán)限給應用。這些普通權(quán)限不會涉及用戶的隱私。而獲取電話狀態(tài)這一權(quán)限則會獲取用戶的個人信息,所以當程序申請授予這一權(quán)限時,系統(tǒng)將會向用戶申請授權(quán),用戶可以選擇同意或者拒絕。當程序的所有權(quán)限都已經(jīng)申請授權(quán)后,程序就可以依賴用戶已經(jīng)授權(quán)的權(quán)限繼續(xù)運行[2]。
在Android的系統(tǒng)中,不論是普通權(quán)限還是敏感權(quán)限,都需要在AndroidManifest.xml文件中聲明,在聲明之后系統(tǒng)才會進行授權(quán)操作。
第二部分則是Application標簽中的各個屬性,其中除了對程序本身的一些特征進行聲明以外,還聲明了在Andorid系統(tǒng)中是否與其他應用程序產(chǎn)生交互。如圖3
由圖3可知,此程序在Application標簽中聲明了以下屬性。分別為允許用戶自行清除數(shù)據(jù)、允許activity更換從屬任務、允許該應用在任何時候都保持運行狀態(tài)、此APP應用程序的圖標的圖片名稱為drawable、為應用程序鎖實現(xiàn)的Applicationg子類的全名為com.cyanflxy.magictowet.AppApplication、此APP程序的所有acticity的主題風格為默認。
至此,對AndroidManifest.xml文件的分析就已經(jīng)完成了,知道了這個APP應用程序獲取的九種權(quán)限,并且都為正常權(quán)限。那么就可以開始進行下一步地分析了。
1.3 對res資源文件進行分析
在res文件夾中,有drawable、layout、raw和values四種不同的文件夾,他們分別保存著程序運行過程中需要用到的不同資源。
drawable文件夾中保存著圖片文件,因為手機的屏幕大小與分辨率是不同的,所以這個文件夾中每一種圖片都保存了多種不同的大小和分辨率,以便于適應更多的手機使用。
layout文件夾中保存著大量的樣式資源、主題和布局。在APP程序運行時,會有不同的頁面呈現(xiàn)出來,而這些頁面的布局文件就保存在此文件夾中。
raw文件中保存著APP應用程序運行時會使用的音頻文件。
最后的values文件夾中則保存著很多字符資源,在對apk文件進行逆向分析時,常用到此文件夾中的public.xml和strings.xml文件。這兩個文件夾中保存著APP程序運行時大部分的字符與字符串,有以英文命名的也有以中文命名的。但是在程序中如果直接明文的去使用這些字符是不安全的,所以在這些文件會給每一個字符設置一個id號,當需要調(diào)用這個字符時,就獲取到這個字符的id號,再進行字符的調(diào)用。如圖4。
1.4 對smali文件進行分析
在smali文件中保存著此APP應用程序運行時需要的函數(shù),這些函數(shù)文件都是以.smali結(jié)尾的。在這些函數(shù)中,主函數(shù)的命名中,除去部分開發(fā)者為了APK文件的安全或者APK文件本身經(jīng)過代碼混淆和加固,一般都帶有Acticity。如圖5。
在對這些文件進行分析時,首先要對Acticity主函數(shù)進行分析。之所以說Activity為主函數(shù),是因為在APK文件中,不論其他的子函數(shù)在哪個位置,其功能是什么,最后都會直接或間接地被Activity的主函數(shù)調(diào)用。所以首先分析主函數(shù)有利于對整個smali文件結(jié)構(gòu)的分析與規(guī)劃整理。
此APK的Activity主函數(shù)的部分內(nèi)容如下
.method public onClick(Landroid/view/View;)V
.line 46
const v0, 0x7f0b0058
invoke-virtual {p0, v0}, Lcom/ctf/ctf/CTFActivity;->findViewById(I)Landroid/view/View;
move-result-object v0
check-cast v0, Landroid/widget/Button;
iput-object v0, p0, Lcom/ctf/ctf/CTFActivity;->but:Landroid/widget/Button;
.line 47
const v0, 0x7f0b0059
invoke-virtual {p0, v0}, Lcom/ctf/ctf/CTFActivity;->findViewById(I)Landroid/view/View;
move-result-object v0
check-cast v0, Landroid/widget/TextView;
iput-object v0, p0, Lcom/ctf/ctf/CTFActivity;->tex:Landroid/widget/TextView;
.line 55
const-string v0, "Administrator"
.line 56
.local v0, "admin":Ljava/lang/String;
iget-object v7, p0, Lcom/ctf/ctf/CTFActivity$1;->this$0:Lcom/ctf/ctf/CTFActivity;
invoke-virtual {v7, v0}, Lcom/ctf/ctf/CTFActivity;->string1(Ljava/lang/String;)I
move-result v2
.line 57
.local v2, "ctf1":I
if-ne v2, v1, :cond_0
.line 58
iget-object v7, p0, Lcom/ctf/ctf/CTFActivity$1;->this$0:Lcom/ctf/ctf/CTFActivity;
invoke-virtual {v7, v3}, Lcom/ctf/ctf/CTFActivity;->Flag(Ljava/lang/String;)Ljava/lang/String;
move-result-object v6
.line 59
.local v6, "message_1":Ljava/lang/String;
iget-object v7, p0, Lcom/ctf/ctf/CTFActivity$1;->this$0:Lcom/ctf/ctf/CTFActivity;
iget-object v7, v7, Lcom/ctf/ctf/CTFActivity;->tex:Landroid/widget/TextView;
invoke-virtual {v7, v6}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
.line 62
:cond_0
const-string v5, "Sorry Plues try again"
.line 63
.local v5, "message":Ljava/lang/String;
iget-object v7, p0, Lcom/ctf/ctf/CTFActivity$1;->this$0:Lcom/ctf/ctf/CTFActivity;
iget-object v7, v7, Lcom/ctf/ctf/CTFActivity;->tex:Landroid/widget/TextView;
invoke-virtual {v7, v5}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
.line 67
return-void
.end method
雖然smali代碼是Android系統(tǒng)的底層匯編代碼,但是它與X86匯編代碼還是有一定的區(qū)別的,在smali中不會涉及內(nèi)存與堆棧的問題,而是通過v寄存器和p寄存器進行數(shù)據(jù)的存儲、傳輸與運算[3]。
從以上的smali代碼中可以看出line46與line47分別為獲取Button和TextView兩個標簽中的id,以便于對其數(shù)據(jù)進行處理。而line55、line56、line57則是對字符串"Administrator"與id為admin的TextView標簽中輸入的數(shù)據(jù)進行比較,如若不同則跳轉(zhuǎn)到line62,通過名為message的變量輸出提示信息"Sorry Plues try again".如若相同則不跳轉(zhuǎn)繼續(xù)運行l(wèi)ine58與line59的代碼,其內(nèi)容為調(diào)用一個名為Flag的函數(shù),并將這個函數(shù)的返回值傳入到名為message_1的變量,并通過其進行輸出。
在最后的line67中,其內(nèi)容為返回一個void類型的返回值,這里之所以要返回void類型的返回值,是因為在這一段代碼的第一行的最末尾字符V,表示了這個onClick函數(shù)是一個返回值類型為void的函數(shù)。
那么現(xiàn)在這個主函數(shù)的功能就已經(jīng)分析出來了,這是一個返回值類型為void名為onClick的函數(shù),其功能為將TextView標簽中獲取的字符串,也就是在APP應用中輸入的字符串,與其原本定義好的字符串"Administrator"做比較。如若兩者相同,則輸出Flag函數(shù)中的提示信息,如若不相同,則輸出"Sorry Plues try again"提示信息。
2 逆向工程及應用
對于以上smali的代碼中,可以進行一個大膽的假設,既然可以看懂這些smali代碼,那么是否可以把其中的某些重要的代碼做一些修改,改變其原本的運行軌跡,使得這個APK不能實現(xiàn)原有的功能呢。
在以上的smali代碼中,存在著可以修改的部分,并且這一部分可以將這個onClick主函數(shù)的功能改變。這個主函數(shù)的功能就是通過一個判斷來確定輸出正確的提示信息還是錯誤的提示信息,那么如果將這個判斷修改了,則改變了這個APP的原有功能,從而也達到了對APK文件進行逆向工程的目的。
3 結(jié)束語
隨著移動設備的普及,Android系統(tǒng)也逐漸地進入人們的視線內(nèi)。而相比與蘋果的IOS系統(tǒng),Andorid由于是開源的原因,使得其APP應用程序可以被任意一個人開發(fā)。而又因為國內(nèi)并沒有一個類似于美國GooglePlay的官方軟件下載平臺,雖然在我們使用各種APP時帶來了許多便利,但是也增加了一些惡意APP渾水摸魚的情況,使得我們的隱私信息在不知不覺中被他人盜取,所以對APP應用進行全面的分析是非常必要的。在對APP應用進行分析時,就需要用到逆向工程技術(shù),將APK文件進行反編譯,查看其smail匯
編代碼進行分析。
參考文獻:
[1] 豐生強.Android軟件安全與逆向分析[M].北京:人民郵電出版社,2013.
[2] 楊峻.Android系統(tǒng)安全和反編譯實戰(zhàn)[M].北京:人民郵電出版社,2015(5).
[3] 張志遠,萬月亮,翁越龍,糜波.Android應用逆向分析方法研究[J].信息網(wǎng)絡安全,2013(6):65-68.