移动应用代码安全非常重要,代码逆向会导致代码逻辑被获取,进一步导致控制流被hook,安全防线被破,给APP安全带来巨大风险,因此开发者一般都会进行代码混淆保护。本文主要介绍了代码混淆的原理、方法、以及常见代码混淆的方式和工具。
1.代码混淆的原理
代码混淆是将计算机程序的代码,转换成功能上等价,但是难于阅读和理解形式的行为。混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义,通过进行代码混淆可以有效提升应用被逆向破解的难度。
2.代码混淆的方法:
字符串加密:对应用程序中使用到的字符串进行加密,防止通过IDA等工具获取关键词定位核心业务代码;
类名、方法名混淆:将代码中类名、方法名、属性名替换为无意义符号,增加代码逆向难度;
程序结构混淆加密:对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低。
3.常见的代码混淆方式:
常见的代码混淆方式包括Java代码混淆、C/C++代码混淆以及h5 脚本混淆等。
(1)Java代码混淆
Java代码是比较容易反编译,为了保护Java源代码,开发者通常会对编译好的class文件进行混淆处理。ProGuard就是一个混淆代码的开源项目,能够对字节码进行混淆、缩减体积、优化等处理。
Proguard处理流程包含压缩、优化、混淆、预检四个主要环节,如下图所示:
压缩:检测并移除代码中无用的类、字段、方法和特性(Attribute);
优化:对字节码进行优化,移除无用的指令。优化代码,非入口节点类会加上private/static/final,没有用到的参数会被删除,一些方法可能会变成内联代码;
混淆:使用a、b、c、d这样简短而无意义的名称,对类、字段和方法进行重命名;
预检:在Java平台上对处理后的代码进行预检,确保加载的class文件是可执行的。
Java代码混淆,针对一些逆向的IDE环境是有一定效果的,可以考虑做一些中文混淆,这个很容易实现且有效果。混淆前后效果如下图:
(2)C/C++代码混淆
下图为C++代码的混淆,保护之后控制流大幅度伪造,逆向难度非常高。当然控制流伪造也会影响运营效率,所以一般也只是对核心的一些功能做保护。
混淆的过程中添加的一些字串的保护如下图:
介绍一个c/c++代码混淆工具,逆向对抗利器—LLVM。LLVM不仅仅提供混淆实现,通过多重Optimize(优化器),实现多种效果,例如代码控制流扁平化、虚假控制流、字符串加密、符号混淆、指令替换等。想了解更多c/c++代码混淆方法,点击查看《如何进行 C/C++代码混淆?》
(3)H5 脚本混淆
H5混淆是指从JS的语法和逻辑上进行混淆。H5脚本混淆很多的IDE环境均可配置,这里我不做详细介绍。H5脚本混淆主要提供字符串加密、混淆、去log、变量名处理、压缩、函数名处理、平台识别、防篡改等功能。保护前后区别如下:
代码混淆可以提升逆向分析的难度,但是并不能从跟不上解决逆向破解的问题。开发者可以对应用进行代码混淆,同时配合移动应用加固,以提升应用的安全等级。
相关阅读: