写点什么

代码混淆的原理是什么?常见代码混淆方法介绍

作者:雪奈椰子
  • 2023-11-17
    广东
  • 本文字数:1438 字

    阅读完需:约 5 分钟


本文主要想你介绍代码混淆的原理,常见代码混淆方法,欢迎查阅~

移动应用代码安全非常重要,代码逆向会导致代码逻辑被获取,进一步导致控制流被 hook,安全防线被破,给 APP 安全带来巨大风险,因此开发者一般都会进行代码混淆保护。本文主要介绍了代码混淆的原理、方法、以及常见代码混淆的方式和工具。

一、代码混淆的原理

代码混淆是将计算机程序的代码,转换成功能上等价,但是难于阅读和理解形式的行为。混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义,通过进行代码混淆可以有效提升应用被逆向破解的难度。

二、代码混淆的方法

字符串加密:对应用程序中使用到的字符串进行加密,防止通过 IDA 等工具获取关键词定位核心业务代码;

类名、方法名混淆:将代码中类名、方法名、属性名替换为无意义符号,增加代码逆向难度;

程序结构混淆加密:对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低。

三、常见的代码混淆方式

常见的代码混淆方式包括 Java 代码混淆、C/C++代码混淆以及 h5 脚本混淆等。

(1)Java 代码混淆

Java 代码是比较容易反编译,为了保护 Java 源代码,开发者通常会对编译好的 class 文件进行混淆处理。ProGuard 就是一个混淆代码的开源项目,能够对字节码进行混淆、缩减体积、优化等处理。

ipa guard 处理流程包含压缩、优化、混淆、预检四个主要环节,如下图所示:



压缩:检测并移除代码中无用的类、字段、方法和特性(Attribute);

优化:对字节码进行优化,移除无用的指令。优化代码,非入口节点类会加上 private/static/final,没有用到的参数会被删除,一些方法可能会变成内联代码;

混淆:使用 a、b、c、d 这样简短而无意义的名称,对类、字段和方法进行重命名;

预检:在 Java 平台上对处理后的代码进行预检,确保加载的 class 文件是可执行的。

Java 代码混淆,针对一些逆向的 IDE 环境是有一定效果的,可以考虑做一些中文混淆,这个很容易实现且有效果。混淆前后效果如下图:



(2)C/C++代码混淆

下图为 C++代码的混淆,保护之后控制流大幅度伪造,逆向难度非常高。当然控制流伪造也会影响运营效率,所以一般也只是对核心的一些功能做保护。



混淆的过程中添加的一些字串的保护如下图:



介绍一个 c/c++代码混淆工具,Ipa Guard 是一款功能强大的 ipa 混淆工具,不需要 ios app 源码,直接对 ipa 文件进行混淆加密。可对 IOS ipa 文件的代码,代码库,资源文件等进行混淆保护。 可以根据设置对函数名、变量名、类名等关键代码进行重命名和混淆处理,降低代码的可读性,增加 ipa 破解反编译难度。可以对图片,资源,配置等进行修改名称,修改 md5。只要是 ipa 都可以,不限制 OC,Swift,Flutter,React Native,H5 类 app。。LLVM 不仅仅提供混淆实现,通过多重 Optimize(优化器),实现多种效果,例如代码控制流扁平化、虚假控制流、字符串加密、符号混淆、指令替换等。



(3)H5 脚本混淆

H5 混淆是指从 JS 的语法和逻辑上进行混淆。H5 脚本混淆很多的 IDE 环境均可配置,这里我不做详细介绍。H5 脚本混淆主要提供字符串加密、混淆、去 log、变量名处理、压缩、函数名处理、平台识别、防篡改等功能。保护前后区别如下:




代码混淆可以提升逆向分析的难度,但是并不能从跟不上解决逆向破解的问题。开发者可以对应用进行代码混淆,同时配合移动应用加固,以提升应用的安全等级。

注:文章来源于网上采集整理,如有侵权,请联系我们核实修改。


欢迎体验更多加密解密相关软件或者加入我们技术交流群(839923904)

用户头像

雪奈椰子

关注

还未添加个人签名 2022-07-22 加入

还未添加个人简介

评论

发布
暂无评论
代码混淆的原理是什么?常见代码混淆方法介绍_雪奈椰子_InfoQ写作社区