溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android中怎么進(jìn)行靜態(tài)分析

發(fā)布時(shí)間:2022-01-12 16:12:50 來(lái)源:億速云 閱讀:181 作者:iii 欄目:網(wǎng)絡(luò)安全

本文小編為大家詳細(xì)介紹“Android中怎么進(jìn)行靜態(tài)分析”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Android中怎么進(jìn)行靜態(tài)分析”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

Android逆向就是反編譯的過(guò)程,因?yàn)榭床欢瓵ndroid正向編譯后的結(jié)果所以CTF中靜態(tài)分析的前提是將出現(xiàn)文件反編譯到我們看得懂一層源碼,進(jìn)行靜態(tài)分析。

0X01 基礎(chǔ)說(shuō)明

Android應(yīng)用的邏輯代碼是由Java進(jìn)行開(kāi)發(fā),所以是第一層就是java代碼

Java虛擬機(jī)JVM運(yùn)行的是java文件編譯過(guò)后的class文件

Android虛擬機(jī)Dalvik并不是執(zhí)行Java虛擬機(jī)JVM編譯后生成的class文件,而是執(zhí)行再重新整合打包后生成的dex文件編譯之后的smali文件

APK:是編譯完成后的Android應(yīng)用程序安裝包

dex文件:是class文件的打包文件

smali文件:是Dalvik字節(jié)碼文件

class文件:是JVM字節(jié)碼文件

0X02 工具使用

在CTF中Android題目不一定給你完整編譯完成后的APK,可能是編譯過(guò)程中任意文件類型,下面斗哥分以下文件類型利用工具來(lái)得到斗哥看得懂的java源碼

類型一:class文件

這種情況比較簡(jiǎn)單,推薦工具jd-gui

直接將class文件拉進(jìn)去就可以看到j(luò)ava源碼。


Android中怎么進(jìn)行靜態(tài)分析

類型二:APK程序

Android工程編譯完成會(huì)得到我們想要的APK安裝包,APK文件其實(shí)是一個(gè)壓縮包。

修改后綴名為zip后解壓,解壓后的文件如下圖所示:


Android中怎么進(jìn)行靜態(tài)分析

META-INF文件夾:

存放apk簽名信息,用來(lái)保證apk包的完整性和系統(tǒng)的安全。

res文件夾:

存放資源文件,包括icon,xml文件。

AndroidManifest.xml文件:

應(yīng)用程序配置文件,每個(gè)應(yīng)用都必須定義和包含的,它描述了應(yīng)用的名字、版本、權(quán)限、引用的庫(kù)文件等信息。

classes.dex文件:

可以直接在Dalvik虛擬機(jī)上加載運(yùn)行的文件,由java文件經(jīng)過(guò)IDE編譯生成。

resources.arsc文件>

二進(jìn)制資源文件,包括字符串等。

反編譯APK推薦工具ApkIDE、JEB

1. JEB使用:

JEB直接導(dǎo)入APK,反編譯完成看到smali文件。


Android中怎么進(jìn)行靜態(tài)分析

很多Android逆向工具就反編譯到smali文件這步。

JEB選中smali文件中按Q,就可以看到j(luò)ava文件。


Android中怎么進(jìn)行靜態(tài)分析

優(yōu)點(diǎn):從smali文件反編譯成的java文件代碼結(jié)構(gòu)清晰。

缺點(diǎn):無(wú)法修改。

2. ApkIDE使用:

項(xiàng)目->打開(kāi)Apk

等待反編譯完成。


Android中怎么進(jìn)行靜態(tài)分析

看到smali文件。

Android中怎么進(jìn)行靜態(tài)分析

選擇要java源碼的smali文件,點(diǎn)擊下圖按鈕,打開(kāi)Java源碼。

Android中怎么進(jìn)行靜態(tài)分析

ApkIDE關(guān)聯(lián)了jd-gui,點(diǎn)擊后將跳轉(zhuǎn)到j(luò)d-gui。

Android中怎么進(jìn)行靜態(tài)分析

ApkIDE是將APK反編譯到class再用jd-gui拿到Java源碼。

在ApkIDE的ApkIDE_v3.3\ApkIDE\Worksrc的項(xiàng)目目錄下可以看到反編譯后的class文件。

Android中怎么進(jìn)行靜態(tài)分析

優(yōu)點(diǎn):功能強(qiáng)大,可以修改反編譯出來(lái)的smali文件,重新編譯生成APK。

缺點(diǎn):編譯成后的java代碼不夠清晰。

3.反編譯區(qū)別

Smali文件是由Smali語(yǔ)法編寫,Smali語(yǔ)法寬松式的語(yǔ)法

所以反編譯過(guò)程不同,工具不同,java源碼肯定不同

下面是同一個(gè)APK用上面兩個(gè)工具逆向的結(jié)果:

Android中怎么進(jìn)行靜態(tài)分析

Android中怎么進(jìn)行靜態(tài)分析

斗哥作為一名Java開(kāi)發(fā)的愛(ài)好者喜歡JEB的逆向結(jié)果,看著比較舒服。

類型三:dex文件

推薦工具dex2.jar

classes.dex文件,這個(gè)是Android源碼編譯過(guò)的字節(jié)碼包

嘗試使用dex2.jar工具拿到j(luò)ava源碼命令如下

.\d2j-dex2jar.bat C:\Users\lin\Desktop\classes.dex


Android中怎么進(jìn)行靜態(tài)分析

jar文件可以理解為classes文件的壓縮包,java虛擬機(jī)可以直接運(yùn)行

用Jd-gui打開(kāi)classes-dex2jar.jar就可以看到j(luò)ava源碼


Android中怎么進(jìn)行靜態(tài)分析

類型四:smali文件

當(dāng)只有一個(gè)單獨(dú)的smali文件時(shí)就無(wú)法用上述的工具直接進(jìn)行反編譯

斗哥想到ApkIDE可以對(duì)一個(gè)APK進(jìn)行反編譯到smali文件,對(duì)smali文件進(jìn)行增刪改查的操作

于是用ApkIDE打開(kāi)任意一個(gè)完整的APK然后添加smali文件(APK可以用自己開(kāi)發(fā)的)


Android中怎么進(jìn)行靜態(tài)分析

將smali文件添加ApkIDE項(xiàng)目中。


Android中怎么進(jìn)行靜態(tài)分析

重新編譯生成APK。

Android中怎么進(jìn)行靜態(tài)分析

編譯成功后將在原APK目錄生成一個(gè)APK。


Android中怎么進(jìn)行靜態(tài)分析

再用JEB等工具打開(kāi)就能看到Ezreal.smali文件。


Android中怎么進(jìn)行靜態(tài)分析

其他工具:

編輯器:notepad++、Sublime等

Android模擬器:夜神模擬器等

0X04 例題分析

將應(yīng)用安裝到模擬器查看界面是否有提示。

在文本框輸入字符點(diǎn)擊按鈕提示錯(cuò)誤,猜想是否用來(lái)判斷正確的flag。


Android中怎么進(jìn)行靜態(tài)分析

使用JEB工具編譯成java文件,Android文件下是sdk文件,我們要分析是com包下的源碼文件。


Android中怎么進(jìn)行靜態(tài)分析

代碼量不多就三個(gè)類,先從程序入口MainActivity分析,找到關(guān)鍵代碼塊。

這句if就是判斷flag是否正確。

Android中怎么進(jìn)行靜態(tài)分析

搜索類查看哪里調(diào)用了此方法。

分析得到arg12就是界面要輸入的參數(shù),這時(shí)我們知道了v5的值就是我們要的flag。


Android中怎么進(jìn)行靜態(tài)分析

onCreate函數(shù)調(diào)用了checkSN方法并傳入兩個(gè)參數(shù)為:

MainActivity.this.edit_userName.trim()

MainActivity.this.edit_sn.getText().toString().trim()

//OnCreate是Android中的一個(gè)特別的函數(shù),用來(lái)“表示一個(gè)窗口正在生成”。

//其不產(chǎn)生窗口,只是在窗口顯示前設(shè)置窗口的屬性如風(fēng)格、位置顏色等。

public void onCreate(Bundle arg3) {

   super.onCreate(arg3);

   this.setContentView(0x7F040019);

   this.setTitle(0x7F06001D);

   this.edit_userName = "Tenshine";

   this.edit_sn = this.findViewById(0x7F0C0051);

   this.btn_register = this.findViewById(0x7F0C0052);

   this.btn_register.setOnClickListener(new View$OnClickListener() {

       public void onClick(View arg5) {

           if(!MainActivity.this.checkSN(MainActivity.this.edit_userName.trim(), MainActivity.this.edit_sn.getText().toString().trim())) {

               Toast.makeText(MainActivity.this, 0x7F06001E, 0).show();

           }

           else {

               Toast.makeText(MainActivity.this, 0x7F06001B, 0).show();

               MainActivity.this.btn_register.setEnabled(false);

               MainActivity.this.setTitle(0x7F060019);

           }

       }

   });

}

分析v5的值,v5是由v3和v4生成的,v4是一個(gè)int并直接賦值為0用于循環(huán)就可以直接使用

而v3則是toHexString方法的返回值,并要傳入,v1是v1.update(arg11.getBytes());生成

arg11就是傳入的參數(shù)"Tenshine"

private boolean checkSN(String arg11, String arg12) {

   boolean v7 = false;

   if(arg11 != null) {

       try {

           if(arg11.length() == 0) {

               return v7;

           }

           if(arg12 == null) {

               return v7;

           }

           if(arg12.length() != 22) {

               return v7;

           }

           MessageDigest v1 = MessageDigest.getInstance("MD5");

           v1.reset();

           v1.update(arg11.getBytes());

           String v3 = MainActivity.toHexString(v1.digest(), "");

           StringBuilder v5 = new StringBuilder();

           int v4;

           for(v4 = 0; v4 < v3.length(); v4 += 2) {

               v5.append(v3.charAt(v4));

           }

           if(!"flag{" + v5.toString() + "}".equalsIgnoreCase(arg12)) {

               return v7;

           }

       }

       catch(NoSuchAlgorithmException v2) {

           goto label_40;

       }

       v7 = true;

   }

   return v7;

label_40:

   v2.printStackTrace();

   return v7;

}

將上面的分析結(jié)果,取出生成v5的關(guān)系代碼

都是純java代碼,不需要Android的包引入,只需引入java的依賴包。

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

public class Code {

   static String toHexString(byte[] arg8, String arg9) {

       StringBuilder v3 = new StringBuilder();

       byte[] v0 = arg8;

       int v5 = v0.length;

       int v4;

       for(v4 = 0; v4 < v5; ++v4) {

           String v2 = Integer.toHexString(v0[v4] & 255);

           if(v2.length() == 1) {

               v3.append('0');

           }

           v3.append(v2).append(arg9);

       }

       return v3.toString();

   }

   public static void main(String[] args)throws NoSuchAlgorithmException{

       MessageDigest v1 = MessageDigest.getInstance("MD5");

       v1.reset();

       v1.update("Tenshine".getBytes());

       String v3 = Code.toHexString(v1.digest(), "");

       StringBuilder v5 = new StringBuilder();

       int v4;

       for(v4 = 0; v4 < v3.length(); v4 += 2) {

           v5.append(v3.charAt(v4));

       }

       System.out.println("flag{" + v5.toString() + "}");

   }

}

用IDEA編輯運(yùn)行,拿到flag。


Android中怎么進(jìn)行靜態(tài)分析

讀到這里,這篇“Android中怎么進(jìn)行靜態(tài)分析”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI