Android应用安全:实现apk加固:代码、资源、so全加密隐藏。防标记,防报毒,防篡改,防破解,防逆向。批量自动改包,自动打包。附免费加固工具。

0.工具最终效果

0.1.可自动批量循环改包

改包包括:自动换包名(可选),自动改类,清单处理等
使用场景:原包为母包,争取处理出来的包没有容易被标记的地方

0.2.可自动批量循环加固,改包后自动加固

使用场景:原包为母包,争取处理出来的包每个包都不一样

0.3 改包加固效果

原包代码不可见,原包so不可见,原包assets不可见,原包resource不可见
每次加固结果,代码,so,assets,代码运行逻辑都不一样.
安全性增加,签名校验,运行环境检测.

0.4防标记,防报毒

对原android工程,进行下列操作(工具里支持一键自动)
自动混淆类名和方法名
自动生成不会垃圾类垃圾代码,
自动插入运行垃圾代码,
自动插入生成不会运行的垃圾方法,
每次代码运行逻辑不一样.

这样生成的包差异性就会很大.再进行加固,就会非常安全和唯一了

1.为什么做加固

因为不想辛辛苦苦做的东西,被别人拿去改成各种版,半路摘我的桃子。
所以需要将原包的一些核心东西进行加密影藏。
市面上比较好的解决方案就是进行加固,能提升apk安全性。

2.怎么加固

2.1 简单的加固

三方加固,有些三方会有免费版本的加固服务
比如 腾讯加固
免费版简易加固,只进行了代码加密影藏,资源和so库都没有处理

2.2 深度复杂加固,

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

3.自己做加固

花了些时间,参考各种资料,实现了代APP深度加固。
实现效果:
代码加密隐藏:原包代码加密隐藏不可见。
资源加密隐藏:原包资源加密隐藏不可见,包括res下和assets下的资源。当然,清单文件引用的资源无法隐藏。
so库加密隐藏:原包so库加密隐藏不可见。

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 加固工具

应用安全工具

使用方法:

1.打开工具,账号设置,注册账号(注,注册的新账号为测试账号,加固的包有运行时效限制,勿正式发布)
2.点击选择需要加固的包(路径不能包含空格等特殊字符)
3.没有签名就勾选自动签名

点击 begin 会出现加载图片卡死的现象,别着急,这是在进行加固。静静等待即可。

mac打开App遇到恶意软件的处理方式

1.下载打开压缩包.
2.双击加固App,Apple会提示"无法打开,恶意软件字样"
3.打开电脑系统设置-隐私与安全性-安全性:会有刚才打开软件的提示,点击仍然打开就行.

App环境部署.

App需要Python3 和 openjdk的环境,
如果电脑已经装好,可以直接使用,如果没有,可以安装.
上述下载地址的百度网盘下载地址,里面有我使用的jdk版本,可以下载使用.
上述下载地址的百度网盘下载地址,里面有apk查看工具,可以查看对比加固前后apk的信息.

6 联系作者

期待你的点赞和关注!如有疑问,联系作者。

要在Android应用实现止DEX注入,可以采取以下措施: 1. 检测应用签名:在应用启动时,可以检查应用的签名是否与预期的签名一致。如果签名不匹配,可能意味着应用已被篡改。 ```java public static boolean isSignatureValid(Context context) { try { PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES); Signature[] signatures = packageInfo.signatures; // 验证签名与预期签名是否一致 // ... } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return false; } ``` 2. 检测应用运行环境:可以检查应用是否在预期的运行环境中执行。例如,可以检测当前应用是否在模拟器或Root设备上运行。 ```java public static boolean isEmulator() { return Build.FINGERPRINT.startsWith("generic") || Build.FINGERPRINT.startsWith("unknown") || Build.MODEL.contains("google_sdk") || Build.MODEL.contains("Emulator") || Build.MODEL.contains("Android SDK built for x86") || Build.MANUFACTURER.contains("Genymotion") || (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic")) || "google_sdk".equals(Build.PRODUCT); } public static boolean isRooted() { String[] paths = {"/system/bin/", "/system/xbin/", "/sbin/", "/system/sd/xbin/", "/system/bin/failsafe/", "/data/local/xbin/", "/data/local/bin/", "/data/local/"}; for (String path : paths) { if (new File(path + "su").exists()) { return true; } } return false; } ``` 3. 内存完整性检测:可以定期检查应用的内存完整性,以止DEX文件被恶意注入。可以使用一些第三方库或自行实现内存完整性检测的算法。 4. 加密DEX文件:可以使用加密算法对DEX文件进行加密,然后在运行时解密并加载。这样可以增加DEX文件的安全性,止被恶意注入。 5. 应用签名校验:可以在应用启动时,对APK文件进行签名校验,确保APK文件没有被篡改。 这些措施并不是绝对的,但可以提高应用安全性,止DEX注入攻击。需要根据具体场景和需求选择合适的措施来保护应用安全
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这个我知道诶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值