混淆技术研究-混淆技术简介(1)

背景

在实际的移动安全分析过程中,遇到的混淆防护技术越来越多,因此分析难度逐渐增大,本系列技术研究主要通过对目前已有的混淆技术进行详细的技术分析,包括原理分析、反混淆技术等。本文是此系列的第一篇,主要是介绍目前市场上存在的混淆技术及其简单原理概述。

混淆技术概述

代码混淆技术是一种软件保护技术,它通过对程序代码进行变换和加密来增加逆向分析的难度,从而提高软件的安全性。

具体来说,代码混淆技术可以将程序代码中的函数、变量名替换成无意义的字符,使得逆向分析者难以理解源代码的含义。同时,混淆技术还可以对代码进行重组、插入假代码、修改逻辑等操作,从而使得程序的行为变得更加复杂和难以理解。此外,混淆技术还可以对程序中的字符串、常量和数据进行加密处理,以增加破解难度。

代码混淆技术广泛应用于各种软件,尤其是移动应用和游戏等领域,可以有效地防止软件被盗版、破解和篡改。

混淆手段

  1. 标识符重命名:
    标识符重命名技术将程序中的变量、函数、类等标识符修改为无意义的名称。例如,将"username"重命名为"a",将"calculateSalary"重命名为"b"。这样做可以增加代码的可读性和理解难度。以下是一个示例:
// 混淆前的代码
int calculateSalary(int hoursWorked) {
    return hoursWorked * hourlyRate;
}

// 混淆后的代码
int a(int b) {
    return b * hourlyRate;
}
  1. 控制流平坦化:
    控制流平坦化技术通过将条件分支语句展开为多个基本块,并重新组合这些基本块来创建新的程序流程图。以下是一个例子:
// 混淆前的代码
void processInput(int input) {
    if (input > 10) {
        System.out.println("Large input!");
    } else {
        System.out.println("Small input!");
    }
}

// 混淆后的代码
void processInput(int input) {
    switch(input) {
        case 0: {
            System.out.println("Small input!");
            break;
        }
        case 1: {
            System.out.println("Small input!");
            break;
        }
        // ...
        case 100: {
            System.out.println("Large input!");
            break;
        }
        // ...
    }
}
  1. 字符串加密:
    字符串加密技术将程序中的字符串进行加密处理,可以使用对称或非对称加密算法来保护字符串内容免受直接查看。以下是一个示例:
// 混淆前的代码
String secretKey = "mySecretKey";
System.out.println("Encryption key: " + secretKey);

// 混淆后的代码
String encryptedKey = encryptString("mySecretKey");
System.out.println("Encryption key: " + decryptString(encryptedKey));

// 加密和解密函数实现略过
  1. 代码插入:
    代码插入技术向程序中插入一些可执行代码,增加程序的复杂度,使得程序的行为变得更难以理解和分析。以下是一个示例:
// 混淆前的代码
int calculate(int x, int y) {
    return x + y;
}

// 混淆后的代码
int calculate(int x, int y) {
    if (x > 10) {
        return x - y;
    } else {
        return x + y;
    }
}

Java混淆

混淆工具

  1. ProGuard:
    ProGuard 是 Android SDK 自带的默认混淆工具,可以在编译过程中对代码进行优化和混淆。它可以删除未使用的代码、重命名类和方法、压缩代码等操作,以减小应用的大小并增加代码的安全性。

  2. DexGuard:
    DexGuard 是商业化的混淆工具,专门为保护Android应用程序而设计。它提供更高级的代码保护功能,包括类似ProGuard的混淆和优化功能,以及额外的加密、反调试、反逆向工程等特性。

  3. Zelix KlassMaster:
    Zelix KlassMaster 是另一个商业化的Java混淆工具,支持Android平台。它提供了广泛的代码混淆和优化选项,包括重命名、字段混淆、控制流和数据流混淆等功能。

  4. Allatori:
    Allatori 是一款针对Java和Android的商业化混淆工具。它提供了多种代码混淆技术,例如名称混淆、字符串加密、控制流混淆等,以保护应用程序的源代码。

  5. R8:
    R8 是Google开发的Java字节码优化器和混淆工具,用于替换传统的ProGuard。它能够在编译期间对代码进行优化、压缩和混淆,以减小应用的大小并提高执行效率。

混淆分类

  1. 字符串混淆
  • 技术原理

Java字符串混淆的核心思想是将明文字符串进行加密处理,并在运行时动态解密。具体实现方式有以下两种:

(1)使用加密算法对字符串进行加密,然后将加密后的结果存储到代码中,运行时再通过解密算法进行解密。例如,可以使用AES或者DES等加密算法对字符串进行加密,然后在代码中存储加密后的密文。在运行时,通过调用解密算法进行解密,获取明文字符串。

(2)使用自定义的加密转换函数对字符串进行加密,然后将加密后的结果存储到代码中,运行时再通过解密函数进行解密。例如,可以定义一个简单的加密规则,如每个字符加上一个随机数,然后在代码中存储加密后的字符串。在运行时,通过调用解密函数进行解密,获取原始字符串。

  • 破解原理

寻找核心的解密函数,并还原解密算法,一般解密算法是在Java层实现,比较好分析

  1. 控制流混淆
  • 技术原理

Java控制流混淆的核心思想是通过改变程序的控制流程,使得源代码的逻辑结构变得模糊。具体实现方式有以下几种:

(1)条件语句重组:
将原始的条件语句进行重组,改变其执行顺序,增加分支和嵌套,使得逻辑关系变得复杂,增加逆向分析的难度。例如,将if语句和else语句进行交换、嵌套等操作。

(2)循环展开和优化:
对循环进行展开和优化,增加循环次数、调整循环结构等操作,使得循环逻辑变得复杂和不易识别。例如,将for循环展开成多个语句块,使用随机数作为循环条件等。

(3)插入冗余代码:
在源代码中插入一些无意义的冗余代码,增加代码量和复杂性,干扰逆向工程者分析程序的真正逻辑。例如,插入大量的空语句、无用的条件判断等。

(4)代码混淆器:
使用专门的代码混淆工具,对源代码进行自动化混淆处理,包括变量重命名、方法内联、代码拆分等操作。这些操作会改变源代码的结构和流程,增加逆向分析的难度。

  • 破解原理
    • 反混淆工具
    • Dex2Jar/通过转成ir,并优化ir的思路进行破解。dex -> ir > opt(ir) -> dex
  1. 名称混淆

Native混淆 (WIP)

  1. ollvm混淆
    在这里插入图片描述
  2. 其他混淆

资源混淆

  1. AndroidManiFest.xml混淆
  2. assert混淆

参考

dex-oracle
ollvm_deobf_fla.py

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值