Android APK脫殼--騰訊樂固、360加固一鍵脫殼
102018.09.28 17:22:18字數 478閱讀 81,487
概述
現在使用Proguard進行混淆的代碼,也很容易被破解,所以就出現了加固工具,讓反編譯的難度更大。但是有了加固技術,就會有反加固技術,正所謂道高一尺魔高一丈。
經過加固后的apk,通過dex2jar反編譯:
騰訊樂固:
legu.png
360加固:
360jiagu.png
從上面可以看出,經過加固后的apk,通過常規方法反編譯無法獲取到源碼。
下載工具
脫殼工具FDex2
通過Hook ClassLoader的loadClass方法,反射調用getDex方法取得Dex(com.android.dex.Dex類對象),在將里面的dex寫出。
下載地址:
鏈接:https://pan.baidu.com/s/1smxtinr 密碼:dk4v
VirtualXposed
VirtualXposed:無需root手機即可使用xp框架。
下載地址:
脫殼
Step1:
將VirtualXposed、FDex2和需要脫殼的應用都安裝到手機上。
Step2:
啟動VirtualXposed,並在VirtualXposed中安裝FDex2:
vp-install-fdex2.gif
Step3:
在VirtualXposed中激活FDex2:
active-fdex2.gif
Step4:
在VirtualXposed中安裝要脫殼的應用,方法和Step2一樣。
Step5:
啟動VirtualXposed中的FDex2,並配置要脫殼的應用。
fdex2-config.png
Step6:
在VirtualXposed中運行要脫殼的應用。
Step7:
脫殼后的dex文件:
shelling-dex.png
導出脫殼的dex文件:
root設備:
adb root
adb pull /data/user/0/iv.va.exposed/virtual/data/user/0/{packageName} {電腦上的目錄}
未root設備:
在VirtualXposed中,設置-->高級設置-->文件管理,安裝文件管理器,然后通過文件管理器進入到指定的目錄,通過分享功能發到電腦上。
Step8:
通過dex2jar對 脫殼的dex進行反編譯:
shelling-dex2jar.png
從上圖就可以看到脫殼后的dex文件被成功的反編譯。
FDex2核心代碼MainHook
package com.ppma.xposed; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.lang.reflect.Method; import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XSharedPreferences; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage; public class MainHook implements IXposedHookLoadPackage { XSharedPreferences xsp; Class Dex; Method Dex_getBytes; Method getDex; String packagename; public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { xsp = new XSharedPreferences("com.ppma.appinfo", "User"); xsp.makeWorldReadable(); xsp.reload(); initRefect(); packagename = xsp.getString("packagename", null); XposedBridge.log("設定包名:"+packagename); if ((!lpparam.packageName.equals(packagename))||packagename==null) { XposedBridge.log("當前程序包名與設定不一致或者包名為空"); return; } XposedBridge.log("目標包名:"+lpparam.packageName); String str = "java.lang.ClassLoader"; String str2 = "loadClass"; XposedHelpers.findAndHookMethod(str, lpparam.classLoader, str2, String.class, Boolean.TYPE, new XC_MethodHook() { protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param); Class cls = (Class) param.getResult(); if (cls == null) { 
