移动安全面试题—混淆

Java 层混淆和 so 层混淆的发展,介绍一下:

  • Java 层混淆:主要通过修改类、方法和变量名称,以及插入无关代码等手段,使得逆向分析变得困难。常见的 Java 层混淆工具有 ProGuard、DexGuard 等。这些工具在 Android 开发中得到了广泛应用,以保护应用的源代码和逻辑。
  • so 层混淆:主要针对 Native 代码(C/C++)进行混淆,包括改变函数名、变量名、数据结构等,以及插入无关代码等。so 层混淆可以进一步提升应用的安全性,防止攻击者轻易分析应用的内部结构和逻辑。

Java 层混淆如何进行反混淆:Java 层反混淆的方法包括:

  • 根据代码逻辑和调用关系,推测原始的类、方法和变量名称。
  • 使用反编译工具(如 jadx、JD-GUI 等)和调试器(如 Android Studio 的调试功能)进行代码分析。
  • 分析应用的行为,推断出关键功能和逻辑。
  • 如果有 ProGuard 的映射文件(mapping.txt),可以使用它还原混淆后的代码。

ollvm混淆的原理,手段,列举指令替换的例子,如何实现的控制流平坦化

ollvm(Obfuscator-LLVM)是一个基于 LLVM 编译器基础结构的开源代码混淆器。它的主要目标是提高逆向工程的难度,以保护软件的知识产权。ollvm 通过引入多种混淆技术来实现这一目标。以下是 ollvm 的一些主要混淆手段:

  1. 指令替换:ollvm 通过替换常见的指令,使得生成的二进制代码更难以分析。例如,将一个简单的加法操作替换为多个异或、与、或操作。具体来说,ollvm 可以将一个加法操作替换为以下形式:

    a + b = ((a ^ b) ^ (a & b) << 1)

    这样的替换会增加逆向分析的难度,同时不影响程序的功能。

  2. 控制流平坦化:控制流平坦化是一种流行的混淆技术,它通过将程序的控制流程结构转换为一个状态机,使得代码更难以阅读和分析。在 ollvm 中,控制流平坦化的实现方法如下:通过这种方法,原始程序的控制流结构被扁平化,变得难以分析。

    • 将原始程序的基本块(basic blocks)转换为状态机的状态;
    • 在每个基本块的末尾添加一个跳转指令,根据当前状态(一个变量)跳转到下一个状态;
    • 将所有基本块的跳转指令统一放在一个“调度器”(dispatcher)中,根据当前状态选择执行哪个基本块。

ollvm 的混淆原理基于 LLVM 编译器的中间表示(Intermediate Representation,IR)。在将源代码编译为目标代码的过程中,ollvm 修改了 LLVM IR,以实现上述混淆手段。具体地说,ollvm 在 LLVM 优化阶段之后添加了自定义的混淆转换(pass),以实现指令替换和控制流平坦化等混淆技术。

ollvm 混淆及实现

ollvm(Obfuscator-LLVM)是一个基于 LLVM 编译器框架的混淆器,主要有以下几种混淆技术:控制流平坦化(Control Flow Flattening)、指令替换(Instruction Substitution)、不透明谓词(Opaque Predicate)等。ollvm 通过在编译阶段将这些混淆技术应用于源代码,以增加代码的复杂度和难以分析性。

ollvm 分析方法

针对 ollvm 混淆的代码,可以尝试使用以下方法进行分析:

  • 静态分析:使用反编译工具(如 JADX、Ghidra 等)还原代码,然后通过人工分析或者脚本辅助去识别和还原混淆部分。
  • 动态分析:使用动态分析工具(如 Frida、GDB 等)在运行时 Hook 或者调试目标应用,以观察和修改混淆的行为。

解决 ollvm 的初步思路

要解决 ollvm 混淆,首先需要对混淆技术有深入的理解。针对不同的混淆方法,可以尝试以下策略:

  • 控制流平坦化:通过分析虚假控制流,还原真实的控制流图。
  • 指令替换:识别并还原被替换的指令,以恢复原始语义。
  • 不透明谓词:识别不透明谓词,将其替换为真实的条件表达式。

ollvm 中的困难点

ollvm 的混淆技术使代码变得更难以阅读和分析。其中,控制流平坦化和不透明谓词可能是比较困难的点,因为它们涉及到复杂的控制流和条件逻辑。

控制流平坦化的解决

  • 通过静态分析,识别虚假跳转和分支,还原真实的控制流图。
  • 使用动态分析工具(如 Frida、GDB 等),在运行时观察控制流的行为,辅助还原控制流图。

符号执行解决虚假控制流

符号执行是一种程序分析技术,可以处理虚假控制流。它通过将程序的输入表示为符号变量,生成约束条件,并求解这些约束,以确定真实的控制流路径。

针对 SO 里的点字符加密解决

  • 静态分析:分析加密算法,编写脚本对密文进行解密。
  • 动态分析:使用动态分析工具(如 Frida、GDB 等),在运行时 Hook 加密解密函数,获取解密后的内容。

ollvm 中的不透明谓词及解决

不透明谓词是一种混淆技术,它在控制流中插入始终为真或始终为假的条件,以迷惑分析者。要解决不透明谓词,可以尝试以下方法:

  • 静态分析:识别不透明谓词的特征,将其替换为真实的条件表达式。
  • 动态分析:使用动态分析工具(如 Frida、GDB 等),在运行时观察条件表达式的行为,辅助识别和还原不透明谓词。

SO 层 OLLVM 反混淆

  • 静态分析:使用反编译工具(如 Ghidra、IDA Pro 等)对 SO 文件进行静态分析,识别混淆模式并尝试还原。
  • 动态分析:使用动态分析工具(如 Frida、GDB 等)在运行时观察和修改混淆行为,辅助反混淆。

除了使用 ollvm 混淆,还可以尝试以下方法来保护代码,同时避免性能损失:

  • 代码混淆:通过对代码进行简单的混淆,如变量名替换、函数重排等,可以提高分析难度,但不会对性能产生显著影响。
  • 加密算法优化:选择性能较高的加密算法,如 AES、ChaCha20 等,可以在保证安全的同时减少性能损失。
  • 白盒加密:使用白盒加密技术将关键算法和数据嵌入到程序中,使得即使在被逆向分析的情况下,攻击者也难以获取关键信息。这种方法对性能的影响相对较小。
    推荐阅读:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g

file

你可能感兴趣的:(人工智能)