首页
社区
课程
招聘
安卓脱壳机开源-类抽取(nop)填充还原
发表于: 2021-6-8 02:27 9954

安卓脱壳机开源-类抽取(nop)填充还原

2021-6-8 02:27
9954

软件是去年写的,xpu01开源:https://github.com/Gnoliew/xpu01
不需要刷机 - 软件基于Xposed框架安卓脱壳软件

实现与使用
通过反射调用getDex方法取得com.android.dex.Dex类(获取dex),不支持8.0系统以上版本,高系统可以配合虚拟机来使用。

废话不会讲,直接上干货。。。

关于类抽取(nop)填充还原代码实现

 
 
 
private String Ldex(Context mContext,String stord)throws Throwable{//脱壳 保存目录, 脱多个dex 带遍历类 nop 回填
        String[] strArr;
        Log("遍历dump 加载Dex数组...");
        ArrayList arrayList = new ArrayList();
        ClassLoader classLoader = mContext.getClassLoader();
        Field declaredField = classLoader.getClass().getSuperclass().getDeclaredField("pathList");
        declaredField.setAccessible(true);
        Object[] objArr2 = (Object[]) fsd(declaredField.get(classLoader), "dexElements");
        //publishProgress(objArr2);
        Method declaredMethod3 = classLoader.getClass().getSuperclass().getSuperclass().getDeclaredMethod("findClass", new Class[]{String.class});
        declaredMethod3.setAccessible(true);
        for (Object obj : objArr2) {
            Object d = fsd(obj, "dexFile");
            if (d != null) {
                Log("遍历类...");
                Method declaredMethod4 = d.getClass().getDeclaredMethod("entries", new Class[0]);
                if (!(declaredMethod4.invoke(d, new Object[0]) == null || (strArr = (String[]) fsd(declaredMethod4.invoke(d, new Object[0]), "mNameList")) == null || strArr.length == 0)) {
                    Log("提取Dex");
                    for (String str4 : strArr) {
                        try {
                            Class cls2 = (Class) declaredMethod3.invoke(classLoader, new Object[]{str4});
                            Object invoke2 = cls2.getClass().getDeclaredMethod("getDex", new Class[0]).invoke(cls2, new Object[0]);
                            if (!arrayList.contains(invoke2)) {
                                arrayList.add(invoke2);
                            }
                        } catch (Throwable th2) {
                        }
                    }
                    continue;
                }
            }
        }
        if (arrayList.size() == 0) {
            return "找不到Dex!";
        }
        File file = new File(stord);
        file.mkdirs();
        int i = 1;
        Iterator it = arrayList.iterator();
        while (true) {
            int i2 = i;
            if (it.hasNext()) {
                Object next = it.next();
                byte[] bArr2 = (byte[]) next.getClass().getDeclaredMethod("getBytes", new Class[0]).invoke(next, new Object[0]);
                RandomAccessFile randomAccessFile2 = new RandomAccessFile(new File(file, "Dexdump" + (i2 == 1 ? "" : Integer.valueOf(i2)) + ".dex"), "rw");
 
                randomAccessFile2.write(bArr2);
                randomAccessFile2.close();
                i = i2 + 1;
            } else {
                return "脱壳成功,共写出 " + (i2 - 1) + " 个dex,文件夹位于 "+ stord;
            }
        }
 
    }
private String Ldex(Context mContext,String stord)throws Throwable{//脱壳 保存目录, 脱多个dex 带遍历类 nop 回填
        String[] strArr;
        Log("遍历dump 加载Dex数组...");
        ArrayList arrayList = new ArrayList();
        ClassLoader classLoader = mContext.getClassLoader();
        Field declaredField = classLoader.getClass().getSuperclass().getDeclaredField("pathList");
        declaredField.setAccessible(true);
        Object[] objArr2 = (Object[]) fsd(declaredField.get(classLoader), "dexElements");
        //publishProgress(objArr2);
        Method declaredMethod3 = classLoader.getClass().getSuperclass().getSuperclass().getDeclaredMethod("findClass", new Class[]{String.class});
        declaredMethod3.setAccessible(true);
        for (Object obj : objArr2) {
            Object d = fsd(obj, "dexFile");
            if (d != null) {
                Log("遍历类...");
                Method declaredMethod4 = d.getClass().getDeclaredMethod("entries", new Class[0]);
                if (!(declaredMethod4.invoke(d, new Object[0]) == null || (strArr = (String[]) fsd(declaredMethod4.invoke(d, new Object[0]), "mNameList")) == null || strArr.length == 0)) {
                    Log("提取Dex");
                    for (String str4 : strArr) {
                        try {
                            Class cls2 = (Class) declaredMethod3.invoke(classLoader, new Object[]{str4});
                            Object invoke2 = cls2.getClass().getDeclaredMethod("getDex", new Class[0]).invoke(cls2, new Object[0]);
                            if (!arrayList.contains(invoke2)) {
                                arrayList.add(invoke2);

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2021-6-8 02:34 被Gnoliew编辑 ,原因:
收藏
免费 6
支持
分享
最新回复 (11)
雪    币: 500
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
xpu01这个我有印象,最初发在MT论坛里的
2021-6-8 11:38
0
雪    币: 26
活跃值: (1305)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
快乐小牛 xpu01这个我有印象,最初发在MT论坛里的
是的
2021-6-8 14:10
0
雪    币: 245
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
编译不了啊
2021-6-8 15:36
0
雪    币: 3443
活跃值: (14163)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
5
FunDex比你这个强多了
1,你这个没有子线程遍历会导致卡死很容易&没有做过滤会多次遍历。
2,没支持10.0
3,没有做oat细节优化,导致dex含有odex指令,需要强制解释执行&删掉/data/app/oat文件夹
4,只支持class为纬度,不支持method为纬度,
5,你这个classloader用的全局的classloader,很多方法内部new出来的classloader会导致找不到,正确方法拿到这个class 在拿到 classloader,对classloader进行遍历
2021-6-8 16:09
1
雪    币: 26
活跃值: (1305)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
珍惜Any FunDex比你这个强多了 1,你这个没有子线程遍历会导致卡死很容易&没有做过滤会多次遍历。 2,没支持10.0 3,没有做oat细节优化,导致dex含有odex指令,需要强制解释执行& ...
软件是不打算更新的只是提供思路给大家,但是在8.0一下系统还是挺香的,关于程序执行设计流程我是没考虑那么多,遍历方式之前我使用三种方式,有一种不会触发某壳检测闪退,但是效果差,有些系统版本回填不完整,需要配合其他工具达到完整,
2021-6-8 16:40
0
雪    币: 26
活跃值: (1305)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
1.关于遍历触发某壳检测闪退:这里提供两种方法,一hook检测点,二是指定部分遍厉
2.针对企业壳,关于检测root+xp框架:想简单点,其实可以完全植入到APP内部
2021-6-8 16:52
0
雪    币: 3443
活跃值: (14163)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
8
Gnoliew 1.关于遍历触发某壳检测闪退:这里提供两种方法,一hook检测点,二是指定部分遍厉 2.针对企业壳,关于检测root+xp框架:想简单点,其实可以完全植入到APP内部
https://bbs.pediy.com/thread-255760.htm 可以试试我这个 ,2年前写的。
2021-6-8 16:53
0
雪    币: 26
活跃值: (1305)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
珍惜Any https://bbs.pediy.com/thread-255760.htm 可以试试我这个 ,2年前写的。
2021-6-8 16:54
0
雪    币: 334
活跃值: (392)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
捕捉珍惜大佬
2021-6-8 20:24
0
雪    币: 269
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
fsd(declaredMethod4.invoke(d, new Object[0])  fsd的实现是什么呢
2021-10-18 14:47
0
雪    币: 3212
活跃值: (828)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
珍惜Any FunDex比你这个强多了 1,你这个没有子线程遍历会导致卡死很容易&没有做过滤会多次遍历。 2,没支持10.0 3,没有做oat细节优化,导致dex含有odex指令,需要强制解释执行& ...
没有开源啊
2021-10-19 08:41
0
游客
登录 | 注册 方可回帖
返回
//