一個超厲害的分析輔助軟體。
1.深度了解Android 最佳化過程
2.近距離觀察Android 原始碼
2.可以見到大佬脫殼下段的函數
1.其他可以下段的函數
2.dex檔案解析的過程
3.脫殼下斷的小知識
1.類別載入的完整過程
2.脫殼加固類別的選擇
這個軟體對於分析c/c 還有java源碼具有很強的輔助功能,之後要進行使用,所以進行簡單的介紹。
工具在附件中找。單獨上傳下載就可以了。
SI3US-205035-36448
這裡提供一個註冊碼。
安裝,next,next就可以了。
選擇new project。
單機OK
#選擇第一個
選擇Add Tree,意思是說全部加在。
載入完成
#之後我們會用到這個軟體來分析。
我想囉嗦一下,這時候就知道英文的重要性了,當然我的英文也不好,但我會查字典呀。
我們先不說這個內容的事情,先來看看這個函數的名稱。 extract:提取,and 和,Process 過程 Zip,壓縮檔案格式,我們都知道apk其實就是一個zip壓縮包。
那麼這個函數的意思就是提取 zip的過程。
然後我們來一步一步的分析。
這裡是extractAndProcessZip的中間變數定義。不是我們研究的重點。
DexClassVerifyMode verifyMode = VERIFY_MODE_ALL;
這句話定義的是 verifyMode,就是驗證模組,這裡初始化的資料是VERIFY_MODE_ALL,也就是全部都會驗證。
思考
如果我們對這裡進行更改是不是就可以跳過這個驗證。
我們來看看其他的值。
如果有想法可以自己定義這個值。
DexOptimizerMode dexOptMode = OPTIMIZE_MODE_VERIFIED;
我們來接著往下看。
There is a function called dexOptCreateEmptyHeader which, as the name suggests, creates an empty header for dex optimization.。
dexOffset,record the file position so we can get back here later,其實就是讀取dex檔案的起始位置。
接著來看下一個函數。
Open the zip archive, find the DEX entry.
很明顯,這個部分在做的事情就是,從apk中找到dex檔。
接著進行分析。
提取dex的一些偏移的函數。
Extract the DEX data into the cache file at the current offset.對dex檔案的一些偏移進行記錄。
接下來要說的是dex odex化的過程。
這裡就是最佳化驗證的地方。
透過這裡就可以修改最佳化的流程,甚至可以移除最佳化驗證。
思考
這裡的資料是哪裡來的,在什麼地方進行比較。 ·
這些資料都是在build.prop中進行比較的。
我們來跟進dvmContinueOptimization這個函數。
PS:
馬上就要接觸到一個非常重要的和脫殼非常相關的地方了
打開dvmContinueOptimization函數
首先是一個判斷。
然後就是dex檔案的一個寫入。
接著往下看(重點要到了)
#dvmDexFileOpenPartial,如果之前看過別人脫殼的教程,一定知道這裡是常用的下端點的時候,以前只知道要下,現在知道,這個函數是存在於原始碼之中的。
我們來查看下dvmDexFileOpenPartial這個函數的呼叫
#這裡呼叫了兩次,還有一次是自己的定義。
先來看看dvmDexFileOpenPartial的原型
int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex)
參數1:載入的DEX檔在記憶體中的基址.(也就是DEX.035)
參數2:載入的DEX檔的檔案長度,
參數3:出參, DEX 檔轉成DvmDex結構,裡麵包含Dex檔的類,字段,方法,字串資訊。 Dalivk操作Dex檔的物件這是結構結構體
#最後在這裡寫入頭部的資訊。
dvmRawDexFileOpen() 這個函數是我們要關鍵要了解的函數,它在RawDexFile .cpp函數中。
先定義基本變數。
都知道檔案格式一個很重要的東西就是魔數,那麼這裡就是先判斷魔數,verifyMagicAndGetAdler32。這裡的magic就是魔數。
這裡是對時間,以及檔案大小的驗證。
這個函數是一個重點函數,也是我們要著重分析的一個函數,它的主要功能就是產生dex對應的odex文件,也就是所謂的odex化。我們跟進函數進行查看。
以下是dexOptGenerateCacheFileName()函數的一部份。我們主要的是看它輸出的位置是什麼地方。
在這裡可以看到是在data目錄下生成, ALOGV("Cache file for '%s' '%s' is '%s'" , fileName, subFileName, nameBuf);
這個樣子的格式。
也就是說這裡已經產生我們的odex檔了。
然後要做的事情就是這個函數了dvmDexFileOpenFromFd(),進一步進行最佳化,完成映射,設為可讀檔案。打開這個函數。位置是在DvmDex.cpp裡。
我們先來看看呼叫這個函數的地方。
呼叫這個函數的地方,就是我們的重點函數dvmRawDexFileOpen,這個函數先呼叫dexOptGenerateCacheFileName產生odex,然後再呼叫dvmDexFileOpenFromFd進行再一次最佳化。
優化中的最後一步就是dexFileParse(),也就是解析DEX。這個位置在DexFile
dvmRawDexFileOpen()主控函數-dexOptGenerateCacheFileName()產生對應的odex-dvmDexFileOpenFromFd()進一步最佳化-dexFileParse()解析dex。
dexfileopenpartial在下段的時候,可能會發現沒有辦法斷下來,那麼我們就可以選擇dexOptGenerateCacheFileNamePKcS0,dvmdexfileopenfromfd 等函數來進行下段。
一般來說dexfileopenpartial處理有殼的東西會比較好一點。
其他原始碼都是由一個主控函數來進行指引,引導其他關鍵函數進行運作,dex類別載入過程也是這個樣子的。
它的主控函數就是Dalvik_dalvik_system_DexFile_defineClassNative()
還有一個需要注意的函數Dalvik_dalvik_system_DexFile_openDexFileNative
這裡要注意的是有兩個可以dump的地方。
還是接著來看我們的主控函數。
在主控函式裡有這樣一個呼叫。
這個呼叫是驗證cookie,但是這個cookie很有可能是解密後的dex的cookie,所以也可以在這裡把這個cookie dump下來。
接著往下看。
dvmDefineClass這個函數,這個函數就是確認類別載入的一個函數。
函數自己做了一個判斷,但是return回傳的東西確是一個大頭。我們跟進這個函數進行查看。
#這裡最重要的就是clazz,而這個就是動態載入的類別。
他的值是由loadClassFromDex這個函數進行回傳的,所以我們就進行進一步的檢視。
這裡看到這樣的一個結構。
來看看這個結構的詳細內容。
這個結構是不是跟dex的結構一模一樣,說明了這裡就是我們需要東西。
以上是Android中怎麼新建一個過工程的詳細內容。更多資訊請關注PHP中文網其他相關文章!