前言
? ?????為了方便新手理解加殼挡育,本篇文章打算從反編譯入手,通過場景問答的形式來講解加殼驱还。
場景一
? ?????? 如果一個Android新手渊鞋,想要查看一個APK的代碼,他會怎么做基跑?
? ? ? ? ?搜索引擎走起:通過Google/Baidu婚温,發(fā)現(xiàn)一堆"反編譯APK"的文章。
? ? ? ? ?這些文章基本思路:
????????????1:解壓縮APK包媳否,獲取Dex文件栅螟,通過dex2jar,轉(zhuǎn)換成jar文件
????????????2:上面獲取到的jar文件篱竭,通過 JD-GUI進(jìn)行查看
????????????3:通過ApkTool反編譯APK力图,獲取到資源文件,再重新打包掺逼,簽名
? ? ? ? ?那么走一遍吃媒,嘗試一下(新建APP,走一遍工具,得到如下圖)
場景二
? ?????? 不想APK源碼被查看赘那,能怎么辦惑朦?
? ?????? 整理下反編譯代碼鏈路:APK->DEX->JAR>JD-GUI查看
? ?????? 思路一:在APK->DEX這一步的時候,能不能讓DEX文件獲取不到漓概?
? ?????? 嘗試:把DEX文件干掉漾月,重新簽名->安裝->安裝失敗(否定)
? ?????? 嘗試:把DEX文件放到assets下胃珍,重新簽名->安裝->安裝失斄褐住(否定)
? ?????? 結(jié)論:APK按照一定的格式才能被安裝
? ???????發(fā)散思路:能不能把DEX文件藏起來,用其他的DEX文件代替觅彰?
? ???????嘗試:新建工程B吩蔑,把A的DEX文件放到assets下,再把B的DEX放到A中填抬,重新簽名->安裝->安裝成功
? ???????打開崩潰烛芬?A中類找不到?
? ???????解決:可以通過B的DEX飒责,反射加載A中的DEX文件赘娄,這邊先給出代碼截圖。
? ???????具體思路會在文章:<APK中類的查找與加載>中講解)
? ???????那么走一遍宏蛉,嘗試一下
? ? ? ? ? 1:B工程新建Application遣臼,在onCreate里面通過反射加載assets里面的classes.dex文件(見上2張截圖)
? ? ? ? ? 2:A工程先生成一個Release包,再提取classes.dex放到A工程assets里面
? ? ? ? ? 3:A工程在AndroidManifest.xml里面拾并,添加B的Application
? ? ? ? ? 4:A工程打包揍堰,用B工程的classes.dex替換掉A的classes.dex,A重新打包嗅义,安裝屏歹,正常加載
????????????(見截圖)
? ???????思路與結(jié)果:
? ???????????APP啟動時,先加載B的Application之碗,在通過B的Application加載A的Dex文件蝙眶,達(dá)到加殼的目的
? ???????????這樣可以讓用戶不能直接反編譯源碼,這就是最簡單的加殼(具體代碼:見Gitlab)
總結(jié)與拓展? ??
? ???????上面雖然說明了最簡單的加殼继控,但如果想實用的話械馆,還有非常多的問題。
? ???????例如:
? ???????????1:對殼DEX進(jìn)行反編譯武通,查看代碼霹崎,還能找到真正的DEX,怎么處理冶忱?
? ???????????2:怎么去加殼支付寶APK尾菇?
? ???????????3:這只是最基本的代碼加殼了,那資源能加殼嗎?
? ???????????4:上面只是在APK->DEX這一步做文章派诬,那么能不能讓DEX轉(zhuǎn)換成JAR的時候失斃拖?能不能讓JAR文件不能被JD-GUI查看默赂?
歡迎查看加殼系列文章
1:自動加殼工具
2:加殼后APP啟動優(yōu)化
3:加殼二代之殼加解密
4:dex2jar原理與破壞
5:加殼之SO庫加殼
6:加殼三代之指令抽離
7:加殼四代之指令轉(zhuǎn)換
相關(guān)文章
1:APK中類的查找與加載
2:最簡單的插件
3:最簡單的熱更新
4:Tinker原理講解一
5:Tinker原理講解二
6:Tinker原理講解三