首頁  >  文章  >  運維  >  Android中怎麼新建一個過工程

Android中怎麼新建一個過工程

王林
王林轉載
2023-05-29 23:37:241436瀏覽

內容

1.一個好用的工具簡單教學(Insight)

你可以學到什麼?

一個超厲害的分析輔助軟體。

2.Android 最佳化流程分析

你可以學到什麼?

1.深度了解Android 最佳化過程
2.近距離觀察Android 原始碼
2.可以見到大佬脫殼下段的函數

3.Android DEX檔解析分析

你可以學到什麼?

1.其他可以下段的函數
2.dex檔案解析的過程
3.脫殼下斷的小知識

4. Android DEX類別載入過程分析

你可以學到什麼?

1.類別載入的完整過程
2.脫殼加固類別的選擇

0x01 一個好用的工具簡單教學(Insight)

這個軟體對於分析c/c 還有java源碼具有很強的輔助功能,之後要進行使用,所以進行簡單的介紹。

工具在附件中找。單獨上傳下載就可以了。

SI3US-205035-36448

這裡提供一個註冊碼。

安裝,next,next就可以了。

Android中怎麼新建一個過工程

新建一個工程

選擇new project。

Android中怎麼新建一個過工程

單機OK
Android中怎麼新建一個過工程

#選擇第一個


Android中怎麼新建一個過工程

選擇Add Tree,意思是說全部加在。
Android中怎麼新建一個過工程

載入完成

Android中怎麼新建一個過工程

#之後我們會用到這個軟體來分析。

Android 最佳化流程分析

我想囉嗦一下,這時候就知道英文的重要性了,當然我的英文也不好,但我會查字典呀。


Android中怎麼新建一個過工程

1.extractAndProcessZip

我們先不說這個內容的事情,先來看看這個函數的名稱。 extract:提取,and 和,Process 過程 Zip,壓縮檔案格式,我們都知道apk其實就是一個zip壓縮包。
那麼這個函數的意思就是提取 zip的過程。

然後我們來一步一步的分析。


Android中怎麼新建一個過工程

這裡是extractAndProcessZip的中間變數定義。不是我們研究的重點。


Android中怎麼新建一個過工程

DexClassVerifyMode verifyMode = VERIFY_MODE_ALL;

這句話定義的是 verifyMode,就是驗證模組,這裡初始化的資料是VERIFY_MODE_ALL,也就是全部都會驗證。

思考

如果我們對這裡進行更改是不是就可以跳過這個驗證。

我們來看看其他的值。


Android中怎麼新建一個過工程

如果有想法可以自己定義這個值。

DexOptimizerMode dexOptMode = OPTIMIZE_MODE_VERIFIED;


Android中怎麼新建一個過工程

我們來接著往下看。
Android中怎麼新建一個過工程

There is a function called dexOptCreateEmptyHeader which, as the name suggests, creates an empty header for dex optimization.。


Android中怎麼新建一個過工程

dexOffset,record the file position so we can get back here later,其實就是讀取dex檔案的起始位置。

接著來看下一個函數。
Android中怎麼新建一個過工程

Open the zip archive, find the DEX entry.
很明顯,這個部分在做的事情就是,從apk中找到dex檔。

接著進行分析。


Android中怎麼新建一個過工程

提取dex的一些偏移的函數。

Android中怎麼新建一個過工程

#

Extract the DEX data into the cache file at the current offset.對dex檔案的一些偏移進行記錄。

接下來要說的是dex odex化的過程。


Android中怎麼新建一個過工程

這裡就是最佳化驗證的地方。

透過這裡就可以修改最佳化的流程,甚至可以移除最佳化驗證。

思考
這裡的資料是哪裡來的,在什麼地方進行比較。 ·
這些資料都是在build.prop中進行比較的。

2.繼續進行最佳化

我們來跟進dvmContinueOptimization這個函數。

PS:
馬上就要接觸到一個非常重要的和脫殼非常相關的地方了

打開dvmContinueOptimization函數

Android中怎麼新建一個過工程

首先是一個判斷。


Android中怎麼新建一個過工程

然後就是dex檔案的一個寫入。

接著往下看(重點要到了)


Android中怎麼新建一個過工程

#dvmDexFileOpenPartial,如果之前看過別人脫殼的教程,一定知道這裡是常用的下端點的時候,以前只知道要下,現在知道,這個函數是存在於原始碼之中的。

我們來查看下dvmDexFileOpenPartial這個函數的呼叫

Android中怎麼新建一個過工程

#這裡呼叫了兩次,還有一次是自己的定義。

先來看看dvmDexFileOpenPartial的原型

int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex)
參數1:載入的DEX檔在記憶體中的基址.(也就是DEX.035)
參數2:載入的DEX檔的檔案長度,
參數3:出參, DEX 檔轉成DvmDex結構,裡麵包含Dex檔的類,字段,方法,字串資訊。 Dalivk操作Dex檔的物件這是結構結構體


Android中怎麼新建一個過工程

#最後在這裡寫入頭部的資訊。


Android中怎麼新建一個過工程

0x03 Android DEX檔解析分析

dvmRawDexFileOpen() 這個函數是我們要關鍵要了解的函數,它在RawDexFile .cpp函數中。


Android中怎麼新建一個過工程

先定義基本變數。


Android中怎麼新建一個過工程

都知道檔案格式一個很重要的東西就是魔數,那麼這裡就是先判斷魔數,verifyMagicAndGetAdler32。這裡的magic就是魔數。


Android中怎麼新建一個過工程

這裡是對時間,以及檔案大小的驗證。


Android中怎麼新建一個過工程

這個函數是一個重點函數,也是我們要著重分析的一個函數,它的主要功能就是產生dex對應的odex文件,也就是所謂的odex化。我們跟進函數進行查看。

Android中怎麼新建一個過工程

以下是dexOptGenerateCacheFileName()函數的一部份。我們主要的是看它輸出的位置是什麼地方。

Android中怎麼新建一個過工程

在這裡可以看到是在data目錄下生成, ALOGV("Cache file for '%s' '%s' is '%s'" , fileName, subFileName, nameBuf);
這個樣子的格式。

也就是說這裡已經產生我們的odex檔了。

然後要做的事情就是這個函數了dvmDexFileOpenFromFd(),進一步進行最佳化,完成映射,設為可讀檔案。打開這個函數。位置是在DvmDex.cpp裡。

Android中怎麼新建一個過工程

我們先來看看呼叫這個函數的地方。

Android中怎麼新建一個過工程

#

呼叫這個函數的地方,就是我們的重點函數dvmRawDexFileOpen,這個函數先呼叫dexOptGenerateCacheFileName產生odex,然後再呼叫dvmDexFileOpenFromFd進行再一次最佳化。

優化中的最後一步就是dexFileParse(),也就是解析DEX。這個位置在DexFile

Android中怎麼新建一個過工程

做一個簡單的總結。

dvmRawDexFileOpen()主控函數-dexOptGenerateCacheFileName()產生對應的odex-dvmDexFileOpenFromFd()進一步最佳化-dexFileParse()解析dex。

PS:小技巧

dexfileopenpartial在下段的時候,可能會發現沒有辦法斷下來,那麼我們就可以選擇dexOptGenerateCacheFileNamePKcS0,dvmdexfileopenfromfd 等函數來進行下段。

一般來說dexfileopenpartial處理有殼的東西會比較好一點。

0x04 Android Dex類別載入過程

其他原始碼都是由一個主控函數來進行指引,引導其他關鍵函數進行運作,dex類別載入過程也是這個樣子的。

它的主控函數就是Dalvik_dalvik_system_DexFile_defineClassNative()


Android中怎麼新建一個過工程

還有一個需要注意的函數Dalvik_dalvik_system_DexFile_openDexFileNative

這裡要注意的是有兩個可以dump的地方。


Android中怎麼新建一個過工程

還是接著來看我們的主控函數。

在主控函式裡有這樣一個呼叫。
Android中怎麼新建一個過工程

這個呼叫是驗證cookie,但是這個cookie很有可能是解密後的dex的cookie,所以也可以在這裡把這個cookie dump下來。

接著往下看。


Android中怎麼新建一個過工程

dvmDefineClass這個函數,這個函數就是確認類別載入的一個函數。

Android中怎麼新建一個過工程

函數自己做了一個判斷,但是return回傳的東西確是一個大頭。我們跟進這個函數進行查看。

Android中怎麼新建一個過工程

Android中怎麼新建一個過工程

#這裡最重要的就是clazz,而這個就是動態載入的類別。

他的值是由loadClassFromDex這個函數進行回傳的,所以我們就進行進一步的檢視。

Android中怎麼新建一個過工程

這裡看到這樣的一個結構。

Android中怎麼新建一個過工程

來看看這個結構的詳細內容。

Android中怎麼新建一個過工程

這個結構是不是跟dex的結構一模一樣,說明了這裡就是我們需要東西。

以上是Android中怎麼新建一個過工程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除