安卓恶意软件混淆技术分享
1. 静态混淆
混淆工具对抗
- ZIP格式字段篡改:通过修改APK文件的ZIP格式字段,绕过基于ZIP格式解析的反编译工具。
- 清单文件混淆:篡改清单文件内容,如stringCount和StringOffsets字段,干扰反编译工具的正常解析。
- 插入脏数据:在文件中插入异常字符或超长字符串,导致解析失败。
- resources.arsc文件混淆:混淆资源文件,增加反编译难度。
代码混淆
- 标识符混淆:将有意义的包名、类名、方法名和变量名替换为无意义、随机生成的名称。
- 字符串加密:对代码中的敏感字符串进行编码或加密,防止在反编译过程中暴露关键信息。
- 控制流混淆:插入无意义的控制结构,改变程序执行路径,增加逆向工程难度。
- 间接调用:通过嵌套调用增加函数调用栈,隐藏真实调用关系。
- 函数重载混淆:利用Java重载特性,为相同名称的方法分配不同参数,增加分析难度。
- 重排序:对字段、方法和指令进行重排序,扰乱代码结构。
2. 动态混淆
动态加载/反射调用
- 本地动态加载:通过加载本地存储的动态库或dex文件,动态调用方法或类。
- 远程动态加载:从远程服务器下载动态库或dex文件并执行,规避静态分析。
- 反射技术:利用反射机制隐藏恶意行为,使静态分析无法识别。
native混淆
- JNI接口混淆:将关键逻辑转移到.so文件中,并通过混淆的JNI接口调用本地代码。
- .so文件加密:对.so文件中的关键方法、常量字符串进行加密,运行时解密执行。
- 花指令和垃圾代码插入:在代码中插入伪指令或无效代码,增加逆向工程复杂性。
壳程序
- 应用壳保护:将整个应用程序打包到壳程序中,壳程序在运行时解密或加载应用程序的核心组件。
- 自定义类加载器:使用自定义类加载器加载dex文件,增加反编译难度。
检测规避
- 模拟器特征隐藏:修改设备信息,隐藏模拟器特征,防止被检测工具识别。
- 系统痕迹清理:清除存储、网络、应用程序等系统痕迹,避免留下恶意行为证据。
高级混淆技术
- LLVM混淆:利用LLVM编译器框架对Native代码进行复杂混淆处理,生成难以阅读的二进制文件。
- 代码虚拟化:将原始代码转换为自定义虚拟机指令,由解释器执行,增加逆向工程难度。
本次组会内容下载链接