首页 > 其他分享 >实现Android深度加固:代码、资源、so库加密隐藏。兼容unity引擎和各种机型

实现Android深度加固:代码、资源、so库加密隐藏。兼容unity引擎和各种机型

时间:2022-10-14 19:35:48浏览次数:39  
标签:加密 解密 apk unity so context 加固 Android

1.为什么做加固

因为不想辛辛苦苦做的东西,被别人拿去改成各种版,半路摘我的桃子。

2.怎么加固

2.1 简单的加固

三方加固,有些三方会有免费版本的加固服务
比如 腾讯加固

2.2 深度复杂加固,

为啥要深度复杂加固呢,因为三方的免费版的简单加固只会对代码进行加固,资源和so库还是一目了然的放在那里。
如果想将资源和so库加固,可以使用三方付费版,
当然也可以自己做
为啥要自己做呢?
因为贵啊,n * W/年/APP,一个应用一年就要几万。

3.自己做加固

花了些时间,参考各种资料,实现了代码APP加固。

3.1 主要原理

3.1.1 代码加固

Android能够使用apk文件或dex文件动态加载Classloader
实现原理:将代码dex加密,使用时解密,然后加载成Classloader使用。

/**
     * 将dex注入dexElements数组中
     * @param context
     * @param str
     * @throws ClassNotFoundException
     * @throws NoSuchFieldException
     * @throws IllegalAccessException
     */
    public static void changeAppClassLoader(Context context, String str) throws Throwable {
        PathClassLoader pathClassLoader = (PathClassLoader) context.getClassLoader();
        PathClassLoader classLoader = new PathClassLoader(str,null,context.getClassLoader());
        Object a = combineArray(getDexElements(getPathList(pathClassLoader)), getDexElements(getPathList(classLoader)));
        Object a2 = getPathList(pathClassLoader);
        setField(a2, a2.getClass(), "dexElements", a);
    }

3.1.2 资源加固

Android同样提供了api,开发者能使用apk路径加载成resource
实现原理:将资源apk加密,使用时解密,然后加载成Resource使用

private Resources preloadResource(Context context, String apkFilePath) {
        try {
            Class<? extends AssetManager> AssetManagerClass = AssetManager.class;
            AssetManager assetManager = AssetManagerClass.newInstance();
            @SuppressLint("DiscouragedPrivateApi")
            Method addAssetPathMethod = AssetManagerClass.getDeclaredMethod("addAssetPath", String.class);
            addAssetPathMethod.setAccessible(true);
            addAssetPathMethod.invoke(assetManager, apkFilePath);
            Resources baseResources = new Resources(assetManager, context.getResources().getDisplayMetrics(), context.getResources().getConfiguration());
            return baseResources;
        } catch (Throwable e) {
        }
        return null;
    }

3.1.3 so库加固

实现原理:将so加密,使用时解密。需要动态替换应用so路径为解密后的so路径

    private void changeFilePath(Context context, String newSoPath) {
        try {
            Class<?> contextImplClass = classNamefor("android.app.ContextImpl");
            Class<?> loadedApkClass = classNamefor("android.app.LoadedApk");
            Object mPackageInfo = getFieldValue(contextImplClass, "mPackageInfo", context);
            ApplicationInfo mApplicationInfo = null;
            mApplicationInfo = (ApplicationInfo) getFieldValue(loadedApkClass, "mApplicationInfo", mPackageInfo);
            mApplicationInfo.nativeLibraryDir = newSoPath;
        } catch (Throwable emApplicationInfo) {

        }
    }  

3.2 整体实现

将真实的apk(子包)进行加密,壳包启动时,动态根据子包apk解密,加载出Classloader和Resource,并获得so路径(可以将so库单独抽出来)
将系统的Classloader,Resource,so路径替换为生成的。

4 总结

目前已实现,并在多个包上使用这套技术。

5 联系作者

期待你的点赞和关注!如有疑问,联系作者。
在这里插入图片描述

标签:加密,解密,apk,unity,so,context,加固,Android
From: https://www.cnblogs.com/Yongersblog/p/16792753.html

相关文章

  • 邮件相关一:SO00
    SCOT的邮箱配置一般有basis处理,这里不做介绍tcode:SO00:SO零零点击执行后,还并没有发送过去进入scot发送成功......
  • Scan ABAP Report Sources:RS_ABAP_SOURCE_SCAN
    群里有朋友问一个问题,想根据已知字符串查找所有用到的程序。以前用过,记不住了,还好有朋友提到了。这里做个记录:SE38执行:RS_ABAP_SOURCE_SCAN界面如下做个最简单的测试结果:......
  • unity 高斯模糊shader
    闲着没事,写了个高斯模糊的shader,有用的到的可以markShader"Unlit/GaussionBlur"{Properties{_MainTex("Texture",2D)="white"{}//值......
  • PHP低版本 json_encode 保留中文字符
     1.几乎所有版本可以用,而且能解决中文乱码的问题publicfunctionmainLogic(){$arr=['a'=>'测试1','b'=>'测试2',];//jso......
  • android:加载PDF几种方法汇总对比
    在安卓项目中,加载PDF文件,是一个比较常见的需求。又分为两大类,1.加载网络PDF2.加载一个本地静态PDF。查阅资料,纵观网上在安卓中打开PDF的各种方式,大致可以分为以下几类......
  • Android加载PDF方案(pdf.js,支持缩放)
    都知道,Android本身的webview是不支持pdf加载的(比不上iOS的webview,谁让人家NB呢),因此通过连接Google的一个服务器转换成功后返回给WebView显示。但是,但是,但是呢,大家都懂的,天......
  • Solution Set - 杂题题解(二)
    目录「CF1726E」AlmostPerfect「CF95E」LuckyCountry「CF1245F」DanielandSpringCleaning「CF1372E」OmkarandLastFloor「AGC038C」LCMs/「LG-P3911」最小公倍数......
  • Flutter开发Cannot run with sound null safety报错
    问题描述今天在学习别人代码时,报了一个如下错误:/D:/flutter/.pub-cache/hosted/pub.dartlang.org/video_player_platform_interface-2.2.0/lib/messages.dart:4:1:Error:......
  • 远程桌面连接工具Microsoft Remote Desktop for Mac
    microsoftremotedesktopmac版,是一款运行在Mac平台上的微软远程桌面连接工具,配置连接时,允许您决定应使用的分辨率,颜色质量,全屏模式,是否要全屏启动会话,是否使用所有监视器......
  • P4053 [JSOI2007] 建筑抢修
    [JSOI2007]建筑抢修题目描述小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有Z部落的入侵者。但是T部落的基地里已经有......