分析Android APK-砸殼-Fdex2


砸殼的工具千千萬,但是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;
 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) {
                    //XposedBridge.log("cls == null");
                    return;
                }
                String name = cls.getName();
                XposedBridge.log("當前類名:" + name);
                byte[] bArr = (byte[]) Dex_getBytes.invoke(getDex.invoke(cls, new Object[0]), new Object[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 = new File(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", new Class[0]);
            getDex = Class.forName("java.lang.Class").getDeclaredMethod("getDex", new Class[0]);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
 
    }
 
    public  void writeByte(byte[] bArr, String str) {
        try {
            OutputStream outputStream = new FileOutputStream(str);
            outputStream.write(bArr);
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
            XposedBridge.log("文件寫出失敗");
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM