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

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

2021-6-8 02:27
9043

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

 

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

 

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

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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;
            }
        }
 
    }

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

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