分析Android APK-砸殼-Fdex2

砸殼的工具千千萬,可是FDex2 是最有能耐的,我嘗試過各類殼,都是秒砸的。特別說明一下,360的殼,oncreated 方法仍是空的,可是其餘大部份內容仍是有的,反正是能夠參考一下的。java

 

安裝環境:android

 

1,安卓手機root ,必須root,記住是必須,只支持6.0 或者更低的版本,過高版本也不行。app

Root 手機很好找,淘寶買個nexus 手機,而後家裏用工具就能夠root,爲何不 推薦其餘手機,是由於其餘手機如今root 特別麻煩,買箇舊手機就幾百塊錢。工具

2,安裝virtual xposedcode

Xposed 的安裝,使用,以前已經講過了,這裏不在贅述。blog

3,安裝Fdex2.get

下載地址:連接:https://pan.baidu.com/s/1smxtinr 密碼:dk4vit

 

 

 

4, 激活FDex2 模塊io

 

開始砸殼:class

安裝app 到xposed, 啓動FDex2 ,而後配置須要砸殼的app,

 

 

 

再提示的目錄,就能夠找到脫殼後的dex 文件。

 

 

 

 

Fdex2 的程序代碼:

 

packagecom.ppma.xposed;
importimportimportimportimportjava.io.File;java.io.FileOutputStream;java.io.IOException;java.io.OutputStream;java.lang.reflect.Method;
importimportimportimportimportimportde.robv.android.xposed.IXposedHookLoadPackage;de.robv.android.xposed.XC_MethodHook;de.robv.android.xposed.XSharedPreferences;de.robv.android.xposed.XposedBridge;de.robv.android.xposed.XposedHelpers;de.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     {
new"com.ppma.appinfo""User"        xsp =XSharedPreferences(,);
        xsp.makeWorldReadable();
        xsp.reload();
        initRefect();
"packagename"null        packagename = xsp.getString(,);
"設定包名:"        XposedBridge.log(+packagename);
ifnull       ((!lpparam.packageName.equals(packagename))||packagename==) {
"當前程序包名與設定不一致或者包名爲空"            XposedBridge.log();
return           ;
        }
"目標包名:"        XposedBridge.log(+lpparam.packageName);
"java.lang.ClassLoader"        String str =;
"loadClass"        String str2 =;
 
  
new        XposedHelpers.findAndHookMethod(str, lpparam.classLoader, str2, String.class, Boolean.TYPE,XC_MethodHook() {
protected void afterHookedMethod(MethodHookParam param) throws Throwable            {
super               .afterHookedMethod(param);
                Class cls = (Class) param.getResult();
ifnull               (cls ==) {
//XposedBridge.log("cls == null");                   
return                   ;
                }
                String name = cls.getName();
"當前類名:"                XposedBridge.log(+ name);
bytebytenew0new0               [] bArr = ([]) Dex_getBytes.invoke(getDex.invoke(cls,Object[]),Object[]);
ifnull               (bArr ==) {
"數據爲空:返回"                    XposedBridge.log();
return                   ;
                }
"開始寫數據"                XposedBridge.log();
"/data/data/""/""_"".dex"                String dex_path =+ packagename ++ packagename ++ bArr.length +;
                XposedBridge.log(dex_path);
new                File file =File(dex_path);
ifreturn               (file.exists());
                writeByte(bArr, file.getAbsolutePath());
            }
            } );
    }
 
  
public void initRefect()     {
try       {
"com.android.dex.Dex"            Dex = Class.forName();
"getBytes"new0            Dex_getBytes = Dex.getDeclaredMethod(,Class[]);
"java.lang.Class""getDex"new0            getDex = Class.forName().getDeclaredMethod(,Class[]);
catch        }(ClassNotFoundException e) {
            e.printStackTrace();
catch        }(NoSuchMethodException e) {
            e.printStackTrace();
        }
 
  
    }
 
  
public  void writeByte(byte[] bArr, String str)     {
try       {
new            OutputStream outputStream =FileOutputStream(str);
            outputStream.write(bArr);
            outputStream.close();
catch        }(IOException e) {
            e.printStackTrace();
"文件寫出失敗"            XposedBridge.log();
        }
    }
}
相關文章
相關標籤/搜索