首页
社区
课程
招聘
[原创]如何充分发(白)挥(嫖)360加固onCreate的VMP保护特性
发表于: 2025-1-15 14:56 49398

[原创]如何充分发(白)挥(嫖)360加固onCreate的VMP保护特性

2025-1-15 14:56
49398

献丑了,下面不用看了,原来免费版支持通过注解 @QVMProtect 来定制化VMP保护的函数,我一直以为这个功能是付费的....emmmm

众所周知,360加固仅对Activity的onCreate函数进行了vmp加强保护,但一般我们的核心代码都不在该函数里,这样就起不到应有的保护作用了,那怎样才能把核心代码放到onCreate里呢?

首先分析,360加固识别onCreate规则,一个继承Activity的类,并且该类下实现了Activity的onCreate函数,并在AndroidManifest.xml里注册该activity

但是这样的实现IDE会提示,无法通过编译

直接加个注解即可,让它不提示

360成功加固了该onCreate函数

图片描述

然后是调用,一般常规的调用就是startActivity->进入系统代码->然后由系统实例化Activity->最后调用app里实现的onCreate函数,但其实app也可以自己实例化该activity,直接new Request()即可,但该实例化不要放在子线程里,否则会报

activity对象实例化后,就可以去调onCreate函数了,这里调用onCreate函数就没有线程限制了,任意线程都可以调用

这样就实现在任意线程主动调用onCreate函数了,虽然onCreate没有返回值,但是有Bundle参数,直接把返回值放在Bundle参数里即可

比如核心代码是一个网络请求

由于android系统限制,网络请求需要放在子线程里

这样就实现了核心代码的vmp保护

不过这样使用起来肯定是不太方便的,比如函数参数和返回值的处理,为此笔者优化了下代码,封装了一个库: VMP361

使用时,直接继承其中的VMP361.Method类,把要保护的核心代码放入onCreate方法,然后在 AndroidManifest.xml 里注册即可

其中super.onCreate(args)调用父类的onCreate,参数交给父类解析,然后就可以用getArg(0)可以获取对应索引的参数,返回值为泛型,可以自动转换类型,result(result)将处理后的结果返回

接下来就可以调用了

一行代码搞定:

将要想保护的函数或类加上注解,比如

然后通过AS插件,自动化提取被注解的函数的代码,放到一个以<类名>+<函数名>命名的Activity里的onCreate方法里,并将该Activity注册到AndroidManifest.xml里,最后再通过上面说的一行代码调用即可

当然,这只是一种最简单的函数,实际函数可能要复杂的多,比如涉及外部变量和函数调用等等

还有一种方式不是基于AS插件,而是直接对apk进行操作,通过dexlib等类似的工具直接解析重构dex和AndroidManifest.xml文件。

不过不确定360加固保护onCreate的个数有没有限制,有知道的大佬可以评论区说下

声明:转载请注明出处,原帖地址:kanxue & shlu's note

public class Request extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
    }
}
public class Request extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
    }
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <application>
        <activity android:name="xxx.xxxx.Request" />
    </application>
 
</manifest>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <application>
        <activity android:name="xxx.xxxx.Request" />
    </application>
 
</manifest>
Overriding method should call super.onCreate
Overriding method should call super.onCreate
public class Request extends Activity {
    @SuppressLint("MissingSuperCall")
    protected void onCreate(Bundle savedInstanceState) {
    }
}
public class Request extends Activity {
    @SuppressLint("MissingSuperCall")
    protected void onCreate(Bundle savedInstanceState) {
    }
}
public class Request extends Activity {
    @SuppressLint("MissingSuperCall")
    protected void onCreate(Bundle savedInstanceState) {
        String urlString = "https://note.shlu.fyi";
        StringBuilder result = new StringBuilder();
        HttpsURLConnection urlConnection = null;
 
        try {
            URL url = new URL(urlString);
            urlConnection = (HttpsURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.setConnectTimeout(10000); // 10秒
            urlConnection.setReadTimeout(10000); // 10秒
 
            int responseCode = urlConnection.getResponseCode();
            if (responseCode == HttpsURLConnection.HTTP_OK) {
                InputStream in = urlConnection.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                String line;
 
                while ((line = reader.readLine()) != null) {
                    result.append(line);
                }
 
                reader.close();
                in.close();
            } else {
                result.append("响应码:").append(responseCode);
            }
 
        } catch (Exception e) {
            e.printStackTrace();
            result.append("异常:").append(e.getMessage());
        } finally {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
        }
        System.out.println(result);
    }
 
}
public class Request extends Activity {
    @SuppressLint("MissingSuperCall")
    protected void onCreate(Bundle savedInstanceState) {
        String urlString = "https://note.shlu.fyi";
        StringBuilder result = new StringBuilder();
        HttpsURLConnection urlConnection = null;
 
        try {
            URL url = new URL(urlString);
            urlConnection = (HttpsURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.setConnectTimeout(10000); // 10秒
            urlConnection.setReadTimeout(10000); // 10秒
 
            int responseCode = urlConnection.getResponseCode();
            if (responseCode == HttpsURLConnection.HTTP_OK) {
                InputStream in = urlConnection.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                String line;
 
                while ((line = reader.readLine()) != null) {
                    result.append(line);
                }
 
                reader.close();
                in.close();
            } else {
                result.append("响应码:").append(responseCode);
            }
 
        } catch (Exception e) {
            e.printStackTrace();
            result.append("异常:").append(e.getMessage());
        } finally {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
        }
        System.out.println(result);
    }
 
}
public class Main extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button request= findViewById(R.id.request);
        Request requestObj=new Request();//UI主线程实例化activity对象
        request.setOnClickListener(v->{
            new Thread(()->requestObj.onCreate(null)).start();//子线程里调用onCreate函数
        });
    }
}
public class Main extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button request= findViewById(R.id.request);
        Request requestObj=new Request();//UI主线程实例化activity对象
        request.setOnClickListener(v->{
            new Thread(()->requestObj.onCreate(null)).start();//子线程里调用onCreate函数
        });
    }
}
public class Request extends VMP361.Method {
 
    @Override
    protected void onCreate(Bundle args) {//这里建议设为 protected, 防止被外部调用
        super.onCreate(args);//调用父类的onCreate解析参数
        String urlString = "https://note.shlu.fyi?arg0="+getArg(0);//获取参数
        StringBuilder result = new StringBuilder();
        HttpsURLConnection urlConnection = null;
 
        try {
            URL url = new URL(urlString);
            urlConnection = (HttpsURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.setConnectTimeout(10000); // 10秒
            urlConnection.setReadTimeout(10000); // 10秒
 
            int responseCode = urlConnection.getResponseCode();
            if (responseCode == HttpsURLConnection.HTTP_OK) {
                InputStream in = urlConnection.getInputStream();
                BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                String line;
 
                while ((line = reader.readLine()) != null) {
                    result.append(line);
                }
 
                reader.close();
                in.close();
            } else {
                result.append("响应码:").append(responseCode);
            }
 
        } catch (Exception e) {
            e.printStackTrace();
            result.append("异常:").append(e.getMessage());
        } finally {
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
        }
        result(result);//返回结果
    }
 
}

[注意]看雪招聘,专注安全领域的专业人才平台!

最后于 2025-1-17 17:21 被逆向涉猎编辑 ,原因: fix error
收藏
免费
支持
分享
最新回复 (10)
雪    币: 8085
活跃值: (5832)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
之前就想过怎么才能白嫖360,有时间试试
2025-1-16 17:25
0
雪    币: 2723
活跃值: (11446)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
new Thread(()-> System.out.println("qqqq:"+VMP361.createMethod(Request.class).call("aaa"))).start();这个案例中,怎么拿到返回的结果呢
2025-1-17 09:36
0
雪    币: 721
活跃值: (548)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
你瞒我瞒 new Thread(()-> System.out.println("qqqq:"+VMP361.createMethod(Request.class).call(&quo ...
从call的返回值就是结果,泛型的,自动转换类型
2025-1-17 10:36
0
雪    币: 721
活跃值: (548)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
简单的简单 之前就想过怎么才能白嫖360,有时间试试
你这个白嫖形容的很贴切
2025-1-17 10:38
0
雪    币: 2723
活跃值: (11446)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
逆向涉猎 从call的返回值就是结果,泛型的,自动转换类型
3q
2025-1-17 10:43
0
雪    币: 446
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
人才
2025-1-17 15:16
0
雪    币: 1464
活跃值: (2379)
能力值: ( LV4,RANK:49 )
在线值:
发帖
回帖
粉丝
8
https://bbs.360.cn/thread-15265524-1-1.html
2025-1-17 15:17
1
雪    币: 721
活跃值: (548)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
userapp https://bbs.360.cn/thread-15265524-1-1.html
360也太好了吧,我一直以为这种定制性的都是付费功能,白忙活一场
2025-1-17 16:44
1
雪    币: 721
活跃值: (548)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
userapp https://bbs.360.cn/thread-15265524-1-1.html
360还有其它的注解吗?有没有那种就是纯VMP指定函数的,不进行整体加固dex的,反正都会脱壳,整不整体加固区别不大,反而整体加固会有副作用,比如Xposed模块没法使用
2025-1-17 17:03
2
雪    币: 1842
活跃值: (1150)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
userapp https://bbs.360.cn/thread-15265524-1-1.html
哇,以前一直以为免费的只能对onCreate进行native,原来免费的也能白嫖,牛蛙
2025-4-12 17:05
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册