砸殼的工具千千萬,但是FDex2 是最有能耐的,我嘗試過各種殼,都是秒砸的。特別說明一下,360的殼,oncreated 方法還是空的,但是其他大部分內容還是有的,反正是可以參考一下的。
安裝環境:
1,安卓手機root ,必須root,記住是必須,只支持6.0 或者更低的版本,太高版本也不行。
Root 手機很好找,淘寶買個nexus 手機,然后家里用工具就可以root,為什么不 推薦其他手機,是因為其他手機現在root 特別麻煩,買個舊手機就幾百塊錢。
2,安裝virtual xposed
Xposed 的安裝,使用,之前已經講過了,這里不在贅述。
3,安裝Fdex2.
下載地址:鏈接:https://pan.baidu.com/s/1smxtinr 密碼:dk4v

4, 激活FDex2 模塊
開始砸殼:
安裝app 到xposed, 啟動FDex2 ,然后配置需要砸殼的app,

再提示的目錄,就可以找到脫殼后的dex 文件。

Fdex2 的程序代碼:
package com.ppma.xposed;
importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.OutputStream;importjava.lang.reflect.Method;
importde.robv.android.xposed.IXposedHookLoadPackage;importde.robv.android.xposed.XC_MethodHook;importde.robv.android.xposed.XSharedPreferences;importde.robv.android.xposed.XposedBridge;importde.robv.android.xposed.XposedHelpers;importde.robv.android.xposed.callbacks.XC_LoadPackage;
publicclass MainHook implements IXposedHookLoadPackage{
XSharedPreferences xsp;
Class Dex;
Method Dex_getBytes;
Method getDex;
String packagename;
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable{
xsp =newXSharedPreferences("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,newXC_MethodHook() {
protected void afterHookedMethod(MethodHookParam param) throws Throwable{
super.afterHookedMethod(param);
Class cls = (Class) param.getResult();
if(cls ==null) {
//XposedBridge.log("cls == null");
return;
}
String name = cls.getName();
XposedBridge.log("當前類名:"+ name);
byte[] bArr = (byte[]) Dex_getBytes.invoke(getDex.invoke(cls,newObject[0]),newObject[0]);
if(bArr ==null) {
XposedBridge.log("數據為空:返回");
return;
}
XposedBridge.log("開始寫數據");
String dex_path ="/data/data/"+ packagename +"/"+ packagename +"_"+ bArr.length +".dex";
XposedBridge.log(dex_path);
File file =newFile(dex_path);
if(file.exists())return;
writeByte(bArr, file.getAbsolutePath());
}
} );
}
public void initRefect(){
try{
Dex = Class.forName("com.android.dex.Dex");
Dex_getBytes = Dex.getDeclaredMethod("getBytes",newClass[0]);
getDex = Class.forName("java.lang.Class").getDeclaredMethod("getDex",newClass[0]);
}catch(ClassNotFoundException e) {
e.printStackTrace();
}catch(NoSuchMethodException e) {
e.printStackTrace();
}
}
public void writeByte(byte[] bArr, String str){
try{
OutputStream outputStream =newFileOutputStream(str);
outputStream.write(bArr);
outputStream.close();
}catch(IOException e) {
e.printStackTrace();
XposedBridge.log("文件寫出失敗");
}
}
}
