网站首页 > java教程 正文
移动应用代码安全非常重要,代码逆向会导致代码逻辑被获取,进一步导致控制流被hook,安全防线被破,给APP安全带来巨大风险,因此开发者一般都会进行代码混淆保护。本文主要介绍了代码混淆的原理、方法、以及常见代码混淆的方式和工具。
一、代码混淆的原理
代码混淆是将计算机程序的代码,转换成功能上等价,但是难于阅读和理解形式的行为。混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义,通过进行代码混淆可以有效提升应用被逆向破解的难度。
二、代码混淆的方法
字符串加密:对应用程序中使用到的字符串进行加密,防止通过IDA等工具获取关键词定位核心业务代码;
类名、方法名混淆:将代码中类名、方法名、属性名替换为无意义符号,增加代码逆向难度;
程序结构混淆加密:对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低。
三、常见的代码混淆方式
常见的代码混淆方式包括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(优化器),实现多种效果,例如代码控制流扁平化、虚假控制流、字符串加密、符号混淆、指令替换等。
(3)H5 脚本混淆
H5混淆是指从JS的语法和逻辑上进行混淆。H5脚本混淆很多的IDE环境均可配置,这里我不做详细介绍。H5脚本混淆主要提供字符串加密、混淆、去log、变量名处理、压缩、函数名处理、平台识别、防篡改等功能。保护前后区别如下:
代码混淆可以提升逆向分析的难度,但是并不能从跟不上解决逆向破解的问题。开发者可以对应用进行代码混淆,同时配合移动应用加固,以提升应用的安全等级。
猜你喜欢
- 2024-11-08 Java 程序员排行前 10 的错误,你有没有中?
- 2024-11-08 常见面试题之java系列(面试题目java)
- 2024-11-08 Android混淆相关(apk混淆)
- 2024-11-08 Java零基础知识必备「分层概念」(java分层领域模型 太麻烦)
- 2024-11-08 Java面试题分享(java面试题精选)
- 2024-11-08 Java开发必会的反编译知识(附支持对Lambda进行反编译的工具)
- 2024-11-08 JS加密:JavaScript代码加密混淆(js代码加密原理)
- 2024-11-08 Java一键授权方案 离线授权 日期授权 代码授权 代码混淆
- 2024-11-08 Java 基础 - 类与对象(java中类和对象)
- 2024-11-08 Java开发者易犯错误Top10(java: 错误: 不支持发行版本 7)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)