Android逆向 Dex文件

Android 逆向?qū)W習(xí)指南
Android 可執(zhí)行文件-dex 文件
uleb128 數(shù)據(jù)類型
SourceInsight 源碼分析工具
解決修改 dex 文件之后的錯誤
修復(fù) dex 文件的原理

  1. Android SDK 知識 1(環(huán)境搭建,SDK 工具(adb 和 monitor))
  2. Android UI 界面編程(基本控件)
  3. Android 四大組件(activity,service,broadcastreceiver,contentprovider)
  4. Andriod 消息機制和網(wǎng)絡(luò)多線程(Thread,Runnable,Handler)
  5. Android 逆向(基本逆向工具,Smali 語言)
  6. Android 逆向(集成逆向工具摔蓝,捕魚游戲的破解,Smali 代碼修改逗噩,Smali 代碼注入荣倾,動態(tài)調(diào)
    試 smali)
  7. Android 逆向(病毒分析关拒,Android 病毒的常見行為桌硫,鎖機病毒的分析)
  8. Android 逆向(Hook 框架沛豌,Cydia 和 Xposed趋箩,Xposed 插件應(yīng)用)
  9. Android 逆向(可執(zhí)行文件格式, dex 文件, source insight 源碼分析,010Editor 文件分析)

Android 逆向?qū)W習(xí)指南
Android SDK 學(xué)習(xí)《第一行代碼第 2 版》
Android NDK 學(xué)習(xí)《Android C++ NDK 高級編程》前 3 章加派,Linux 相關(guān)的 API(動態(tài)加載叫确、文
件操作)
Android Java 層逆向 工具+資料+文檔+baksmali 源碼,不斷的練習(xí)和破解
Android 逆向應(yīng)用 游戲破解芍锦、病毒分析
Android Hook 框架 Cydia,Xposed娄琉,frida, 學(xué)習(xí) Java 反射相關(guān)的編程
Android 文件格式 ELF 文件格式(C++代碼編譯成.so 文件)孽水,DEX 文件格式(Java 編譯)
Android ARM 匯編 ARM 指令集(算數(shù)指令、邏輯運算指令杏慰、跳轉(zhuǎn)指令等等)
Android 動態(tài)調(diào)試 smali 動態(tài)調(diào)試炼鞠、so 文件動態(tài)調(diào)試
Android 加固脫殼 先學(xué)習(xí)開源代碼(加固流程),再學(xué)習(xí) android 源碼(dex 文件加載谒主、so 文
件加載)
Android 源碼學(xué)習(xí) 《Android 系統(tǒng)源碼情景分析》羅升陽,csdn 博客(虛擬機加載霎肯、app
加載擎颖、系統(tǒng)加載)
Android 協(xié)議分析 抓包 http 協(xié)議的數(shù)據(jù)(Charles榛斯、Fiddler),分析其中的加密參數(shù)

Android 可執(zhí)行文件-dex 文件
最簡單的一個 dex 文件-HelloWorld
① 編譯 smali 為 dex
java -jar smali-2.1.3.jar -o classes.dex HelloWorld.smali
② 查看設(shè)備信息
adb devices
③ 上傳文件
adb push HelloWorld.zip /data/local
④ 執(zhí)行程序
adb shell dalvikvm -cp /data/local/HelloWorld.zip HelloWorld

最簡單的 dex 文件的分析肠仪,主要分為三大塊:
① Dex 文件頭
② 各種數(shù)據(jù)的數(shù)組肖抱,包括字符串、類型异旧、方法原型意述、字段、方法
③ 類數(shù)據(jù)
④ 其他

image.png
  1. Dex 文件頭


    image.png

字段 1:dex_magic吮蛹,表示 dex 文件的文件標識荤崇,特征字符串
字段 2:checksum, 表示校驗和,對文件求了 32 位的 hash 值(從字段 3 開始到文件末尾)
字段 3:signature[], 表示 SHA1(沙 one),對文件求 hash 值(從字段 4 開始到文件末尾)
字段 4:file_size潮针, 表示文件大小

image.png

字段 5:dex 文件頭大小
字段 6:數(shù)據(jù)排列方式-小端方式


image.png

各種表的大小以及偏移
① string_ids_size 和 string_ids_off ,字符串表的大小和偏移
② type_ids_size 和 type_ids_off术荤,類型表的大小和偏移
③ proto_ids_size 和 proto_ids_off,原型表的大小和偏移
④ field_ids_size 和 field_ids_off每篷,字段表的大小和偏移
⑤ method_ids_size 和 method_ids_off瓣戚,方法表的大小和偏移
⑥ class_defs_size 和 class_defs_off,類數(shù)據(jù)表的大小和偏移

  1. 各種數(shù)據(jù)的數(shù)組焦读,包括字符串子库、類型、方法原型矗晃、字段仑嗅、方法
    ① 字符串表


    image.png

字符串表項,是一個字符串?dāng)?shù)據(jù)的偏移张症,偏移指向的是一個 string_data 結(jié)構(gòu)仓技。
String_data 結(jié)構(gòu)中有兩個字段:
字段 1: 代表長度,數(shù)據(jù)類型是 uleb128俗他,變長的數(shù)據(jù)類型(1-5 字節(jié))
字段 2: 存儲數(shù)據(jù)脖捻,字符串以 0 結(jié)尾郭变。
② 類型表


image.png

類型表表項,是一個索引值周伦,類型描述符字符串在字符串表中的索引专挪,圖中的索引是 1,表
示在字符串表中的數(shù)組索引 1 中的元素率寡。

image.png

類型描述符包括基本數(shù)據(jù)類型的描述符和類類型的描述符冶共。
LHelloWorld; 是 HelloWorld 類的類描述符捅僵。

③ 原型表


image.png

原型表項中存儲的是函數(shù)原型的各部分描述信息庙楚。包括短類型(shorty_idx)馒闷、返回類型
(return_type_idx)纳账、參數(shù)的類型(parameters_off塞祈,最終還是一個指向字符串表的數(shù)組下標)
注意:字段為返回類型(return_type_idx)的值议薪,是類型表中的索引斯议。

④ 字段表


image.png

字段表項中內(nèi)容存儲的是字段的信息。包括字段所在類(class_idx)焊唬、字段的類型(type_idx)赶促、
字段的名稱(name_idx), class_idx 是類型表中的索引鸥滨,type_idx 是類型表中的索引,字段名稱
的索引是字符串表的數(shù)組下標老速。

⑤ 方法表


image.png

方法表項中存儲的是方法的信息额湘,包括方法所在的類(class_idx)缩挑、方法的原型(proto_idx)供置、方
法的名稱(name_idx)芥丧,其中 class_idx 是類型表中的索引坊罢,proto_idx 是在原型表中的索引活孩,方
法名稱的索引是字符串表的數(shù)組下標憾儒。

  1. 類數(shù)據(jù)
    類數(shù)據(jù)也是一個數(shù)組起趾,每一個元素就是一個類的相關(guān)信息训裆。


    image.png

在表項中的 class_data 中存儲的是類數(shù)據(jù)属百,包括類名索引诸老、訪問屬性别伏、父類索引厘肮、接口偏移类茂、
源碼索引托嚣、注解偏移示启、類數(shù)據(jù)偏移夫嗓。


image.png

在類數(shù)據(jù)中有存儲類中的字段和方法信息矩父,在每一個方法中的 code_item 結(jié)構(gòu)中有一個字段
insns 數(shù)組窍株,存儲的是 dalvik 虛擬機指令球订。指令可以使用 baksmali 反匯編成 smali 代碼辙售。
ushort insns[8] = 62 00 00 00 1A 01 00 00 6E 20 01 00 10 00 0E 00
第一字節(jié):


image.png

指令 1:62 00 00 00 sget-object v0,field@0000

image.png

偽代碼:sget-object v0,out
Smali 代碼:sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
Java 代碼:System.out

image.png

指令 2:1A 01 00 00 const-string v1,string@0000

image.png

偽代碼:const-string v1,string[0]
Smali 代碼:const-string v1,“Hello World!”
指令 3:6E 20 01 00 10 00 invoke-virtual {v0,v1} , method@0001

image.png

偽代碼:invoke-virtual {v0, v1}, method[1]

image.png

Smali 代碼:invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
更詳細的需要查看 baksmali 的源代碼士八。

指令 4:0E 00 return-void


image.png

uleb128 數(shù)據(jù)類型
特點:變長婚度,(1-5 字節(jié))蝗茁,每一個字節(jié)最高位表示標志位,可以理解為是是否下一字節(jié)有數(shù)
據(jù)颈嚼。
范圍:整型阻课,最大表示一個 32 位的無符號數(shù)據(jù)
舉例:
整型數(shù)據(jù):16 進制:0x180 二進制:0000 0001 1000 0000
小端方式二進制:1000 0000 0000 0001
Uleb128 : 1000 0000 0000 0011
查看源碼讀取信息

DEX_INLINE int readUnsignedLeb128(const u1** pStream) {
const u1* ptr = *pStream;
int result = *(ptr++); // 取出一個字節(jié)
if (result > 0x7f) { // 判斷第一個字節(jié)的最高位是否有值
int cur = *(ptr++); // 取出第二個字節(jié)
result = (result & 0x7f) | ((cur & 0x7f) << 7); // 第一個字節(jié)留 7 位限煞,第二字節(jié)留 7 位
// 字節(jié) 2 會左右 7 位署驻,與第一字節(jié) 做 或操作
// 舉例: uleb128: 1000 0000 0000 0011
// &0x7F 0000 0000 0000 0011
// A | B<<7 0000 0000 | (0000 0011<<7)
// 0000 0000 | 110000000
// = 1 1000 0000=0x180
if (cur > 0x7f) {
cur = *(ptr++);
result |= (cur & 0x7f) << 14;
if (cur > 0x7f) {
cur = (ptr++);
result |= (cur & 0x7f) << 21;
if (cur > 0x7f) {
/

  • Note: We don't check to see if cur is out of
  • range here, meaning we tolerate garbage in the
  • high four-order bits.
    */
    cur = *(ptr++);
    result |= cur << 28;
    }
    }
    }
    }
    *pStream = ptr;
    return result;
    }

SourceInsight 源碼分析工具
新建工程硕舆,導(dǎo)入源碼


image.png
image.png

使用指南

image.png

如果需要查找,使用菜單中的搜索功能即可凌节。
解決修改 dex 文件之后的錯誤
當(dāng)我們修改 dex 文件之后倍奢,即使再簽名卒煞,再打包叼架,最終還是無法安裝乖订,因為 dex 文件對文件
有校驗,安裝時會讀取 dex 文件頭部的 hash 值和重新計算的值進行比對甜无,完成校驗岂丘。


image.png

使用修復(fù)工具畔乙,修復(fù)之后翩概,再次安裝


image.png

此時模擬器中有安裝殘留钥庇,需要在/data/data/目錄中刪除對應(yīng)的安裝目錄
重新安裝咖摹,即可完成。

修復(fù) dex 文件的原理 DexRepairTools
將 dex 文件頭部的兩個 Hash 值重新計算吐句,然后寫回去店读。
① 先計算 SHA-1 值,修改值
② 再計算 CheckSum 值文虏,修改值

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末氧秘,一起剝皮案震驚了整個濱河市丸相,隨后出現(xiàn)的幾起案子灭忠,更是在濱河造成了極大的恐慌,老刑警劉巖更舞,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缆蝉,死亡現(xiàn)場離奇詭異黍瞧,居然都是意外死亡原杂,警方通過查閱死者的電腦和手機穿肄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門咸产,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人僵朗,你說我怎么就攤上這事验庙》嘌Γ” “怎么了膳沽?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵陨界,是天一觀的道長痛阻。 經(jīng)常有香客問我,道長俏扩,這世上最難降的妖魔是什么录淡? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任嫉戚,我火速辦了婚禮,結(jié)果婚禮上帆啃,老公的妹妹穿的比我還像新娘努潘。我一直安慰自己坤学,他們只是感情好拥峦,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布略号。 她就那樣靜靜地躺著洋闽,像睡著了一般诫舅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上这弧,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音卷哩,去河邊找鬼。 笑死冷溶,一個胖子當(dāng)著我的面吹牛逞频,可吹牛的內(nèi)容都是我干的苗胀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼励堡,長吁一口氣:“原來是場噩夢啊……” “哼应结!你這毒婦竟也來了鹅龄?” 一聲冷哼從身側(cè)響起扮休,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤玷坠,失蹤者是張志新(化名)和其女友劉穎八堡,沒想到半個月后兄渺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汰现,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡口叙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年企软,在試婚紗的時候發(fā)現(xiàn)自己被綠了形庭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萨醒。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡富纸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出堵漱,到底是詐尸還是另有隱情勤庐,我是刑警寧澤愉镰,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布丈探,位于F島的核電站碗降,受9級特大地震影響遗锣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嗤形,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弧圆。 院中可真熱鬧赋兵,春花似錦、人聲如沸搔预。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拯田。三九已至历造,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間船庇,已是汗流浹背吭产。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工窃爷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留医吊,地道東北人束莫。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓挟裂,卻偏偏與公主長得像暑脆,于是被迫代替她去往敵國和親沥曹。 傳聞我的和親對象是個殘疾皇子鲤孵,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,116評論 25 707
  • 文件頭(File Header) Dex文件頭主要包括校驗和以及其他結(jié)構(gòu)的偏移地址和長度信息漆际。 字段名稱偏移值長度...
    朱立志閱讀 941評論 0 0
  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料浩销? 從這篇文章中你...
    hw1212閱讀 12,723評論 2 59
  • 四、幼兒認知的發(fā)展 1太防、記憶的發(fā)展 2、思維的發(fā)展 3酿愧、心理理論 四汇恤、幼兒認知的發(fā)展 1仁连、記憶的發(fā)展 (1)記憶容...
    趙淇竹閱讀 1,365評論 0 1
  • 習(xí)慣了每天有你陪伴在身邊患朱,可忽然有一天你轉(zhuǎn)身便要離開冰沙,我難過地抱著你哭袋励。 你轉(zhuǎn)過身捧著我的臉深情地說道:“傻瓜,我...
    年槿悠閱讀 836評論 0 1