Android混淆技术综述

news2024/11/18 13:45:14

1. 引入

大量的恶意软件都使用了混淆技术来逃检测。查了下Android混淆技术,看了如下两篇资料:

  • Understanding Android Obfuscation Techniques: A Large-Scale Investigation in the Wild
  • https://github.com/ClaudiuGeorgiu/Obfuscapk

对Android的混淆方法(Obfuscation)与 混淆检测方法有了基本的理解,记录如下。

2. Android的混淆方法

2.1 四大混淆方法

这是第一篇论文中写的,四种比较流行的混淆方法

  • identifier renaming:标识符重命名,比如改变 变量名、函数名、class名
  • string encryption:字符串加密
  • Java reflection:反射机制(很多恶意软件会对函数名加密后再利用反射,进一步提高检测难度)
  • packing:加壳

这里提到的四种方法,前三种是比较常用的混淆方式,比较特别的是他把加壳也算作混淆的一种

2.2 更工程化的混淆方法

第二个链接进去是Obfuscapk加壳工具的readme,Obfuscapk有如下更多的工程上常用的混淆方法:

  1. Trivial: as the name suggests, this category includes simple operations (that do not modify much the original application), like signing the apk file with a new signature.

这是比较简单的对原始APK做些小改变,所谓小改变就是不改动原始代码(DEX),比如重新对APK签名。

  1. Rename: operations that change the names of the used identifiers (classes, fields, methods).

改变标识符的名字(class,fields,methods)。

  1. Encryption: packaging encrypted code/resources and decrypting them during the app execution. When Obfuscapk starts, it automatically generates a random secret key (32 characters long, using ASCII letters and digits) that will be used for encryption.

对 代码、资源文件 加密(笔者理解就是第一代加壳)。

  1. Code: all the operations that involve the modification of the decompiled source code.

对DEX中的“源代码”(smali)做改动

  1. Resources: operations on the resource files (like modifying the manifest).

对资源文件、manifest文件做改动。比如对manifest中的item做重新排列。

2.3 更细节的混淆方法

这也是Obfuscapk的github中提到的,可以认为是Android混淆方法的具体指导方针:

  1. AdvancedReflection [Code]
  • 使用反射机制来调用dangerous API(比如获取手机电话号码),这是改动code的一种方式。
  1. ArithmeticBranch [Code]
  • 插入垃圾代码(无意义的代码),类似花指令
  1. AssetEncryption [Encryption]
  • 加密asset文件
  1. CallIndirection [Code]
  • 保持代码逻辑不变的前提下,改变控制流图(CFG)
  • 比如为要调用的method增加一些wrapper methods
  1. ClassRename [Rename]
  • 改变package的名字
  • 改变class的名字
  1. ConstStringEncryption [Encryption]
  • 对代码中的常量字符串进行加密(dex string)
  1. DebugRemoval [Code]
  • 移除调试信息
  1. FieldRename [Rename]
  • 对field进行重命名
  1. Goto [Code]
  • 在method中插入一些goto
  • 这是改变CFG的一种方法
  • 比如,给定一个method,先插入goto跳转到method尾部,然后再从尾部插入goto跳转到method真正的起始位置
  1. LibEncryption [Encryption]
  • 加密 native libs(so文件)
  1. MethodOverload [Code]
  • 使用java的overloading机制
  • 比如,建立新的同名函数,插入随机arguments
  1. MethodRename [Rename]
  • 改变函数名
  1. NewAlignment [Trivial]
  • Realign the application.
  1. NewSignature [Trivial]
  • 对应用重新签名
  1. Nop [Code]
  • 随机插入NOP指令
  1. RandomManifest [Resource]
  • 对manifest文件中的内容进行重新随机排列
  • xml文件中的item以及属性是无序的,可以任意排列
  1. Rebuild [Trivial]
  • 重新build为新的apk文件
  1. Reflection [Code]
  • 反射机制
  1. Reorder [Code]
  • 改变代码块的顺序
  1. ResStringEncryption [Encryption]
  • 加密资源文件中的字符串
  1. VirusTotal [Other]
  • 混淆后发给VT扫描(以检测混淆后的效果,对恶意软件来源是有效的)

3. 混淆检测方法

第一篇paper中提到了简单的混淆检测方法,能用于检测 标识符重命名,字符串加密,反射,加壳 这四种情况。

  1. 带label的样本来源
  • APK使用公开数据集,比如F-Droid
  • 用不同的混淆方法,对数据集中的样本,使用不同的工具做混淆后,打label
  • label为这四种其中之一:标识符重命名,字符串加密,反射,加壳
  1. 特征提取
  • 对于标识符重命名分类
    • 提取所有标识符
    • 对标识符按字符提取3-gram
    • 所有标识符按照3-gram组成固定长度的向量
  • 对于字符串加密 分类
    • 和上面类似,也是对字符串提取3-gram组成固定长度的向量
  1. 分类方法(混淆检测方法)
  • 标识符重命名,和 字符串加密,提取特征后,使用SVM进行分类
  • 反射:按照pattern进行检测,比如: [Class.forName() → getMethod() → invoke()].
  • 加壳:按照如下pattern,能检测6中常用壳
    • 壳1:Ali
      • 文件pattern:lib/armeabi/libmobisec.so | aliprotect.dat
      • 代码pattern:com.ali.fixHelper | com.ali.mobisecenhance.StubApplication
    • 壳2:Tencent
      • 文件pattern:lib/armeabi/libmain.so | lib/armeabi/libshell.so | lib/armeabi/mix.dex
      • 代码pattern:com.tencent.StubShell
    • 壳3:Qihoo
      • 文件pattern:assets/libjiagu.so
      • 代码pattern:com.qihoo.util.StubApplication
    • 壳4:iJiami
      • 文件pattern:assets/ijiami.dat | */armeabi/libexec.so | */armeabi/libexecmain.so`
      • 代码pattern:com.shell.SuperApplication
    • 壳5:Bangcle
      • 文件pattern:assets/bangcle_classes.jar | lib/armeabi/libsecexe.so | lib/armeabi/libsecmain.so
      • 代码pattern:com.secshell.shellwrapper.SecAppWrapper | com.bangcle.protect.ApplicationWrapper
    • 壳6:Baidu
      • 文件pattern:assets/baiduprotect.jar | lib/armeabi/libbaiduprotect.so
      • 代码pattern:com.baidu.protect.StubApplication

pattern简单来说就是字符串匹配、文件名匹配,或者正则匹配这样的匹配技术。

4. 不同数据集下的混淆技术使用分布

第一篇参考文章还有个比较有意思的事情,他统计了不同混淆技术在不同数据集下的使用分布:

在这里插入图片描述

可见,这四种混淆技术,都被恶意软件大量使用。而且,像标识符重命名/反射这样的机制也被大量正常样本(Google Play)使用。

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

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

相关文章

logging日志管理

1.日志作用 不管是在项目开发还是测试过程中,项目运行一旦出现问题日志信息就非常重要了。日志是定位问题的重要手段,就像侦探人员要根据现场留下的线索来推断案情。 2.日志级别 脚本运行会有很多的情况,比如调试信息、报错异常信息等。日…

渣土车空车未盖盖识别系统 OpenCv

渣土车空车未盖盖识别系统通过OpenCvyolo网络模型实时检测路过的渣土车情况,发现空车未盖盖立即进行抓拍回传。OpenCV基于C实现,同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是OpenCV的Python API,结合了OpenCV CAPI和Python语言…

Android开发中的线程池使用

一、前言 既然Android中已经有了线程的概念,那么为什么需要使用线程池呢?我们从两个方面给出使用线程池的原因。 首先线程的新建和销毁都是存在性能上的消耗的,如果一个时间段有大量的网络请求,那么就需要多个线程的创建与销毁&am…

NSGA and NSGA-II

目录1 NSGA1.1 传统多目标优化方法1.2 多目标转为单目标的缺点1.3 权重向量距离说明1.4 NSGA方法1.4.1 流程1.4.2 关键步骤1.5 注意2 NSGA-II2.1 NSGA的缺点2.2 NSGA-II在NSGA上的变动2.3 NSGA-II流程1 NSGA 1.1 传统多目标优化方法 使用权重向量,将多目标问题转化…

Java入门练习题及其答案第一弹

Java入门练习题及其答案第一弹 文章目录Java入门练习题及其答案第一弹素数打印乘法口诀表最大公约数水仙花数二进制中1的个数二进制奇偶数位素数打印 只能被1和自己整除 import java.util.Scanner;public static void main(String[] args) {Scanner scanner new Scanner(Sys…

UI自动化测试-第一个测试脚本

前提 我们在进行UI自动化测试时,一般采用javaselenium或者pythonselenium的方式。由于python比较简单,上手快,因此建议大家采用pythonselenium的方式来进行UI自动化。 1、安装pycharm PyCharm是一种Python IDE(Integrated Deve…

【OpenCV-Python】教程:7-5 理解SVM

OpenCV Python SVM 学习 【目标】 直观理解 SVM 【理论】 线性可分 下图有两种类型的数据,红色和蓝色。在kNN中,对于一个测试数据,我们用来测量它与所有训练样本的距离,并取距离最小的一个。测量所有的距离需要大量的时间&am…

计算距离春节还有多长时间

你知道距离春节,还剩下多少时间吗? 或许你已经在默默心算了。 可是,如果我想要精确一点的结果,比如精确到多少分钟、多少秒呢? 要怎么计算呢? 这里可以使用Python进行计算。 首先,需要导入…

Opencv项目实战:18 人体姿态检测

目录 0、项目介绍 1、效果展示 2、项目搭建 3、项目代码讲解与介绍 Basics.py PoseModule.py Example.py 人体姿态图​编辑 4、项目资源 5、项目总结 0、项目介绍 mediapipe中有人体姿态检测的功能,今天我们就将实现最最基础的人体姿态估计项目,它…

【C++】深拷贝和浅拷贝

目录 浅拷贝 深拷贝 字符串的构造 例有两个类的深拷贝: 浅拷贝 在类中,若我们不写拷贝构造函数,则程序会提供一个默认的拷贝构造函数,该函数为浅拷贝。 //默认拷贝构造 ---浅拷贝--值复制 类名(const 类名& 形参名) {成…

【实时数仓】DWS层之商品主题计算、地区主题表(FlinkSQL)

文章目录一 DWS层-商品主题计算1 把JSON字符串数据流转换为统一数据对象的数据流(1)转换订单宽表流数据(2)转换支付宽表流数据2 把统一的数据结构流合并为一个流(1)代码(2)测试3 设定…

216. 组合总和 III

216. 组合总和 III 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。 示例 1: 输入: k 3, n 7 输…

3.2 Static Terrestrial Laser Scanners 静态地基激光扫描仪

本章节介绍的静态地基激光扫描系统指的是那些在一个固定位置的位置上对周边场景地物特征进行扫描的设备。该类型设备的扫描测量机制是,通过激光测距仪进行斜距测量,与此同时通过水平和竖直两个方向上同步运动的角度编码器来记录角度变化值(如…

编译原理——正规式、NFA构造DFA

一、DFA和NFA的区别 NFA:非确定有限自动机 DFA:确定有限自动机 NFA在同一状态,可以有多条出边,DFA在同一状态,只能有一条出边; NFA的初态可以具有多个,DFA的初态是唯一的; 比如这个…

数据结构入门——栈和队列详解

栈和队列详解1 栈1.1 栈的概念及结构1.2 栈的实现1.3 支持动态增长的栈1.3.1 结构声明1.3.2 栈的初始化和销毁1.3.3 入栈和出栈操作1.3.4 栈的判空和元素个数2 队列2.1 队列的概念及结构2.2 队列的实现2.3 链表实现队列2.3.1 结构声明2.3.2 队列的初始化和销毁2.3.3 队列入队和…

【工作流Activiti7】4、Activiti7 结束/终止流程

1. 结束/终止 正在运行的流程实例 思路:跟回退一样的思路一样,直接从当前节点跳到结束节点(EndEvent) /*** 结束任务* param taskId 当前任务ID*/ public void endTask(String taskId) {// 当前任务Task task taskService…

Tomcat学习

文章目录1、Tomcat是什么?2、Tomcat安装部署java环境部署tomcat目录结构介绍webapps目录bin目录tomcat启停方式3、Tomcat配置文件tomcat-users.xmlserver.xml结构组件详情配置文件注释4、Tomcat端口5、JVM调优6、Tomcat启动慢解决7、Tomcat面试题目1.Tomcat的默认端…

npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

一、问题描述 首次用vscode运行vue项目时,报错: npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 二、解决 我的解决过程:检查是否安装node.js环境 已安装node 这样一来,真不知道怎么回事了。环境也没有…

五、Arduino IDE开发esp8266环境搭建

1、安装驱动程序 (1)安装USB转串口驱动程序。 (2)根据板载的USB转串口驱动芯片选择合适驱动安装。USB转串口芯片负责和电脑之间进行数据通信。 (3)常见USB转串口驱动 CP210x驱动:CP210x USB 至 UART 桥 VCP 驱动器 - 芯科科技 CH340驱动 2、Arduino IDE环境搭建 要想使用Ar…

数据结构与算法java实战篇--高级排序

目录 一.希尔排序 二.划分 三.快速排序 1. 快速排序的算法 2.选择枢纽 一.希尔排序 希尔排序是基于插入排序的算法来实现的,不同的是希尔排序是采用n-增量来实现排序,如下是希尔排序的图解: 希尔排序会先以n个增量对元素进行划分&#xf…