Android代码保护与反调试方案

news2025/1/23 7:20:39

1、代码保护方案

1.1、Proguard代码混淆

ProGuard是一个开源的Java代码收缩器,优化器,混淆器和预校验器,ProGuard的作用如下:
(1)压缩(Shrink):检查并移除代码中无用的类、字段、方法;
(2)优化(Optimize):对字节码进行优化,移除无用的指令;
(3)混淆(Obfuscate):使用a,b,c,d这样简短而无意义的名称,对类、字段和方法进行重命名;
(4)预检(Preverify):在Java平台上对处理后的代码进行预检;

经过Proguard处理后的程序逻辑与之前完全一致,而混淆后的代码即便反编译也很难阅读。同时,在混淆过程中对于一些不影响正常运行的信息将永久丢失,这些信息的丢失使得程序更加难以理解。Proguard代码混淆并不能完全避免反编译,经过apktool、dexToJar、jd-gui等反编译工具依然能得到大部分源码。

1.2、Dex加壳

加固方案

  1.源APK文件存放在壳APK的资源目录asset下;

  2.使用DexClassLoader动态加载源APK,并运行;

步骤如下:

1、重写Application

默认情况一个android 应用程序启动一个默认的Application 对象, 我们需要在壳apk启动时动态加载源apk。因此我们需要重写Application的attachBaseContext或者onCreate,在其中加载源apk。

2、释放资源中源APK到目标目录下

在Application的attachBaseContext或者onCreate中拷贝asset中的源apk到目标目录下。

3、在壳apk中通过DexClassLoader加载源apk并运行目标activity,同时销毁壳apk中的activity

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        String dexPath = "";
        String optimizedDirectory = "";
        String librarySearchPath = "";
        ClassLoader parent = getClassLoader();
        DexClassLoader dexClassLoader = new DexClassLoader(dexPath,optimizedDirectory,librarySearchPath,parent);
        try {
            //启动源apk中的目标activity
            Class desActivity = dexClassLoader.loadClass("destination.destActivity");
            Intent intent = new Intent(this,desActivity);
            startActivity(intent);
            //销毁壳apk中的activity
            finish();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

1.3、虚拟机源码保护

虚机源码保护为用户提供一套完整的工具链,首先把用户待保护的核心代码编译成中间的二进制文件,随后生成独特的虚机源码保护执行环境和只能在该环境下执行的运行程序。

虚机源码保护会在App内部隔离出独立的执行环境,该核心代码的运行程序在此独立的执行环境里运行。即便App本身被破解,这部分核心代码仍然不可见。

undefined

 

2、反调试方案

2.1、Debug#isDebuggerConnected是否有调试器挂载到程序上

    /**
     * Determine if a debugger is currently attached.
     */
    public static boolean isDebuggerConnected() {
        return VMDebug.isDebuggerConnected();
    }

isDebuggerConnected函数用于检测此刻是否有调试器挂载到程序上,如果返回值为true则表示此刻被调试中。

if (Debug.isDebuggerConnected()){
            android.os.Process.killProcess(android.os.Process.myPid());
}

2.2、AndroidManifest.xml清单文件中加入android:debuggable="false"属性,使程序不能被调试

2.3、APK签名检测

Android SDK中有apk 签名检测的方法,Framework的PackageManager类提供了getPackageInfo()函数,

第二个参数传入GET_SIGNATURES时,返回对象的signature字段就是签名信息,计算其hash值,前后对比hash值。实际可用的两种方案:

(1)在本地Java代码里进行校验,不一致则强退应用;

(2)把签名信息发到服务器后台,服务器后台记录着正确的签名信息,比对后不一致则返回一个错误给错误

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/105391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一键回复聊天软件

不论是何种行业,高效工作都是企业一直在追求的,如果在为客户提供服务的过程中,有一个趁手的好工具是可以带来事半功倍的效果的。 前言 随着互联网的发展,越来越多的工作开始转向线上化,通过网络可以满足客户的多种需求…

手写Srping10(实现容器事件监听)

文章目录目标设计项目结构一、实现1、定义事件接口--ApplicationEvent1、定义通用应用上下文事件--ApplicationContextEvent2、定义刷新和关闭事件--ContextClosedEvent、ContextRefreshedEvent2、定义事件监听--ApplicationListener3、定义事件广播器--ApplicationEventMultic…

audio_open函数分析

audio_open() 的作用,就如同它的名字那样,就是打开音频设备。流程图如下: SDL 库播放音频数据有两种方式。 1,调用层定时往 SDL 接口塞数据。 2,设置SDL回调函数,让 SDL 来主动执行回调函数来取数据。 第…

ABAP 字符处理

场景1:是否只包含数字 str1 CO 0123456789 涉及关键字:CO,使用公式 str1 CO str2 。表示 str1 中 的每个字符 在 str2 中都能找到 类比:无 场景2:字符串1 是否 包含 字符串2 DATA str1 TYPE STRING VALUE hello world. DATA …

Pytest测试框架搭建需求及实现方案

目录 框架需求及实现方案 框架需求 实现方案 支持接口自动化、Web UI自动化及App自动化 可以批量运行用例并生成测试报告 测试完成发送邮件 提供灵活的运行方式,如按功能模块运行、按脚本运行、按用例等级运行等等 提供运行日志方便定位问题 支持切换环境 …

李沐精读论文:MAE 《Masked Autoencoders Are Scalable Vision Learners》

论文:Masked Autoencoders Are Scalable Vision Learners 别再无聊地吹捧了,一起来动手实现 MAE(Masked Autoencoders Are Scalable Vision Learners) 玩玩吧! - 知乎 参考博文:MAE 论文逐段精读【论文精读】 - 哔哩哔哩 神洛华…

QT 学习笔记(十)

文章目录一、绘图1. 理论知识储备2. 画背景图3. 简单绘图4. 手动刷新窗口二、绘图实现代码1. 主窗口头文件 widget.h2. 主窗口头文件 widget.cpp由于每次代码都是在原有程序上修改,因此除了新建项目,不然一般会在学完后统一展示代码。 提示:具…

【Python机器学习】卷积神经网络卷积层、池化层、Flatten层、批标准化层的讲解(图文解释)

卷积神经网络 卷积神经网络(convolutional neural network, CNN)在提出之初被成功应用于手写字符图像识别,2012年的AlexNet网络在图像分类任务中取得成功,此后,卷积神经网络发展迅速,现在已经被广泛应用于…

怎样在Odoo 16中启用完整的财务功能

Odoo是目前市场上最好的ERP软件之一。Odoo提供两种类型的版本,社区版和企业版。Odoo社区版是由开源软件支持的免费基本版。Odoo社区版本中没有一些模块和功能。但企业版付费版,升级版更适合更高的价值。Odoo企业版具有无限的功能支持和完整的功能。性能和…

「集合底层」深入浅出HashMap底层源码

「集合底层」深入浅出HashMap底层源码 一、HashMap介绍 HashMap底层采用了哈希表,而哈希表是由数组和链表实现的。数组和链表各有自己的特点: 数组:占用空间连续。 寻址容易,查询速度快。但是,增加和删除效率非常低…

倒序打印链表

在做这个题的时候我闹了一个大笑话,我用了反转链表做,哈哈哈哈, 这个题目思路很简单,用到了数组的头插法,注意题目要求返回数组 遍历链表,将链表的val放到数组中 下面来看代码 import java.util.ArrayLis…

flash基础知识

flash基础手册一、flash概念(一)特性(二)FLASH的块/扇区/页关系(三)常用FLASH型号大小(四)常用FLASH擦写规则(五)存储器类型参考二、与其他类型存储器件对照&…

PDF文件怎么加密?推荐3种方法给你

在我们的工作学习上,应该有不少人都需要使用到PDF文件格式,毕竟这个格式它兼容性较广,且不易编辑,能较好的保存文件。不过,我们有时为了不让它被其它人随意查看,会给这个文件进行加密的操作。那你们知道如何…

python实现基于TNDADATASET的人体行为识别

首先来看下TNDADATASET: 随便打开一个文件简单看下如下所示: 可以大概推测出来,这里面不同维度的数据集应该是由不同的穿戴式传感器采集得到的,最后一列的class表示的是当前的行为类型。 在我之前的博文里面已经做过了相关的工作…

计算机毕设Python+Vue养老机构管理信息系统(程序+LW+部署)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Sigrity常见问题解决方法(持续更新)

Sigrity常见问题解决方法(持续更新) 1.使用SpeedEM仿真时,报placement error 错误信息如下: 该问题是因为Mesh设置的过大,导致via和note在同一个mesh网格上存在粘连 解决方法是:将mesh进行auto设置 2…

鲍鱼年龄预测 knn svm 逻辑回归

数据: M,0.455,0.365,0.095,0.514,0.2245,0.101,0.15,15 M,0.35,0.265,0.09,0.2255,0.0995,0.0485,0.07,7 F,0.53,0.42,0.135,0.677,0.2565,0.1415,0.21,9 M,0.44,0.365,0.125,0.516,0.2155,0.114,0.155,10 I,0.33,0.255,0.08,0.205,0.0895,0.0395,0.055,7 I,0.425…

基于pytorch搭建CNN 人像口罩识别检测项目

项目介绍 我们将使用 CNN (卷积神经网络)和机器学习分类器创建一个检测一个人是否戴着口罩的分类器。它将检测一个人是否戴着口罩。 我们将从头开始学习,我将对每一步进行解释。我需要你对机器学习和数据科学有基本的了解。我已经在本地 Windows 10 机器上实现了它,如果你…

深入浅出JVM(七)之执行引擎的解释执行与编译执行

执行引擎 hotspot执行引擎结构图 执行引擎分为解释器、JIT即时编译器以及垃圾收集器 执行引擎通过解释器/即时编译器将字节码指令解释/编译为对应OS上的的机器指令 本篇文章主要围绕解释器与即时编译器,垃圾收集器将在后续文章解析 解释执行与编译执行 Java虚拟机…

方向图与天线增益

目录 一、方向图 二、增益 一、方向图 天线的方向性是指天线向一定方向辐射电磁波的能力。对于接收天线而言,方向性表示天线对不同方向传来的电磁波具有不同的接收能力。天线的方向性通常用方向图来表示。 在数学里,球坐标系是一种利用球坐标表示一个点…