目录

  • 一、背景
    • 1.1 Android应用安全存在多重隐患
  • 二、代码混淆
    • 2.1 代码混淆的原理
    • 2.2 代码混淆的方法
    • 2.3 常见的代码混淆方式
  • 三、 C/C++ 代码混淆
  • 3.1 Obfuscator-LLVM实现C/C++混淆
    • 3.1.1 常见的混淆方法
    • 3.1.2其他常见的C/C++混淆手段:
  • 四、代码混淆可能带来的问题

一、背景

1.1 Android应用安全存在多重隐患

  • 代码可逆向:客户端App的逻辑能够被轻易获取和逆向,得到代码和程序中的敏感数据;

  • 功能泄漏:客户端App中高权限行为和功能被其他未授权的应用程序调用访问;

  • 可调试:客户端App能够被调试,动态地提取、修改运行时的程序数据和逻辑;

  • 日志信息泄漏:客户端App将开发时辅助调试信息打印泄露,包含敏感参数等信息;

  • 可二次打包:客户端App可能被修改代码,重新打包发布在市场上供用户下载;

  • 密码学误用:客户端App代码中使用了不安全的密码学实现,例如固定硬编码的对称加密,ECB模式的对称加密,CBC模式中IV固定等;

  • 敏感信息泄漏:客户端App代码中泄漏敏感数据,如认证使用的共享密钥、不应被暴露的后台服务器管理地址等;

  • 通信数据明文传输:客户端App与服务器端交互的数据通过明文的通信信道传输,或者加密传输,但数据依然可以被解密;

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

二、代码混淆

2.1 代码混淆的原理

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

2.2 代码混淆的方法

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

类名、方法名混淆:将代码中类名、方法名、属性名替换为无意义符号,增加代码逆向难度;将有意义的类,字段、方法名称更改为无意义的字符串。生成的新名称越短,字节代码越小。在名称混淆的字节代码中,包,类,字段和方法名称已重命名,并且永远不能恢复原始名称。不过这种方法混淆后,控制流程仍然清晰可见

程序结构混淆加密:对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低。用于if, switch, while,for等关键字,对字节码进行细微的修改,模糊控制流,而不改变代码在运行时的行为。通常情况下,选择和循环等逻辑构造会被更改。流模糊的字节码通常强制反编译器将一系列标签和非法的goto语句插入到它们生成的源代码中。源代码有时会因为反编译错误而变得更加模糊。

2.3 常见的代码混淆方式

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

三、 C/C++ 代码混淆

下图为C++代码的混淆,保护之后控制流大幅度伪造,逆向难度非常高。当然控制流伪造也会影响运营效率,所以一般也只是对核心的一些功能做保护。
混淆的过程中添加的一些字串的保护如下图:
介绍一个c/c++代码混淆工具,逆向对抗利器—LLVM。LLVM不仅仅提供混淆实现,通过多重Optimize(优化器),实现多种效果,例如代码控制流扁平化、虚假控制流、字符串加密、符号混淆、指令替换等。

代码混淆是将计算机程序的代码,转换成功能上等价,但是难于阅读和理解形式的行为。代码混淆可以有效提升反编译的难度。

3.1 Obfuscator-LLVM实现C/C++混淆

3.1.1 常见的混淆方法

利用Obfuscator-LLVM工具实现C/C++混淆方法:

  • 控制流平坦化:在不改变源代码功能的前提下,将C、C++等语言中的if、while、for、do等控制语句转化为switch分支选择语句。控制流平坦化有点像虚拟机保护,case块相当于vmhandlecase值相当于vmopcode

  • 指令替换:生成条件跳转指令有两种方法,一种称为opaque predicate,另一种称为bogus control flow

假设基本块 伪代码如下:

block0;

opaque predicate指令替换后:

/* opaque predicate 指令替换 */
if (恒等式) {block0;
} else {垃圾代码
}
/* 或者另一种方式 */
if (恒不等式) {垃圾代码
} else {block0;
}

bogus control flow指令替换后:

if (随机条件) {block0;
} else {block1; /* 基本块block1复制于block0 */
}
  • 控制流伪造

3.1.2其他常见的C/C++混淆手段:

  • 多重分支

  • 基本块分割:把基本块分成多个基本块。有两种方法:一种是根据概率对基本块的当前指令进行分割;另一种是计算基本块的总指令数,标记为a,随机生成小于a的数,标记为b,基本块b条指令后进行分割,a减掉b,进行多次迭代直至a等于1。

  • 字符串加密

  • 常量隐藏

  • 常量展开

  • 常量数组随机化:让常量在数组中的索引随机化。假设常量数组a[],索引值i,随机生成索引数组b[]、c[]、d[](可生成更多),循环用z[b[c[d[i]]]] = a[i]生成随机后的常量数组z[],然后用z[b[c[d[i]]]]替换a[i]

  • 表达式变换:对逻辑操作not、and、or、xor,可以先把操作数抽取分成多个更小的数进行操作,最后用or连接起来,当然这四个操作可以用与非门或是或非门来完成。还有其它常见的运算可以把操作数看成大数然后进行大数运算,还有一些运算可以转变为SIMD指令进行运算。至于浮点数,有很多浮点数的软件实现可供参考。

四、代码混淆可能带来的问题

被混淆的代码难于理解,因此调试以及除错也变得困难起来。开发人员通常需要保留原始的未混淆的代码用于调试。对于支持反射的语言,代码混淆有可能与反射发生冲突。代码混淆并不能真正阻止反向工程,只能增大其难度。因此,对于对安全性要求很高的场合,仅仅使用代码混淆并不能保证源代码的安全。

如何提升代码的安全性 —— 代码混淆相关推荐

  1. nodejs代码保护方式--加密、混淆、编译、打包成exe

    如何保护价值上千万的Node.js源代码? - 掘金 甲方突然要求做私有化部署 项目是用Node.js做的,Node.js代码需要保护吗? 一般情况下不需要,因为代码跑在云端服务器上啊.只要服务器安全 ...

  2. python混淆ios代码_XSDK——iOS代码混淆原理

    我们在XSDK的iOS版本中, 除了AppStore官方支付之外还集成了第三方支付(微信支付H5和支付宝支付H5版本). 如果用于企业签,不需要做处理,直接使用即可. 但是如果需要上架AppStore ...

  3. 在线 OJ 项目(三) · 处理项目异常 · UUID · 校验代码的安全性 · 阶段性总结

    一.处理异常 二.区分不同请求的工作目录 UUID 对 Task 类进行重构 三.校验代码的安全性 四.阶段性总结 书接上回,我们自己测试没问题,是因为使用了正常数据:万一用户输入的是非法的请求,该咋 ...

  4. 如何提升程序员的代码编写能力

    啊呀妈呀,那个熟悉的阿朱又回归了,呕心之作,跪了. 一.先列三个常见的开发场景: 1.拿到一个模块详细设计文档,大部分程序员的通常做法就是开始搭建界面代码,然后从第一个按钮点击事件或页面Load事件开 ...

  5. 说说代码质量、代码安全和软件测试那些事

    作者 | 灰狐 来源 | 灰狐 最近工作需要,把代码质量.代码安全和软件测试做了一下梳理,并思考将它们更好的融入日常研发和 DevOps 流水线. 今天,就和大家简单聊聊代码质量.代码安全和软件测试的 ...

  6. 四、CLR执行程序集中代码和IL代码简介

    三.加载公共语言运行时中介绍了在安装了.Net Framework中加载公共语言运行时,公共语言运行时加载程序集的过程.以及通过vs stdio设置源码编译的目标平台的过程. 本问主要介绍公共语言加载 ...

  7. 一文看懂:零代码、0代码、无代码平台是什么?怎么选?

    注:零代码.0代码.无代码平台,指的基本是同一个意思,即不用代码开发.就能实现应用搭建的平台 以前想要P一张好看的图片或者做一个很燃的视频,只能交给设计师&摄影师用专业的软件,但现在有了美图秀 ...

  8. 【加密】各种加密(打乱)易语言代码的sdk代码

    [部分内容来自互联网] VMP保护------------------------------------------------------------------------------- 置入代 ...

  9. 低代码和无代码哪个好用?

    编者按:日益火爆的低代码和无代码,究竟是什么?它们有什么区别?哪个比较好用,用户该怎么选择?本文介绍了低代码和无代码的概念,分析了二者的优势和劣势,并进一步为用户在平台选型时提出了建议. 概要: (1 ...

  10. 一文说透低代码平台/无代码平台

    一.低代码/无代码平台是什么 二.低代码/无代码平台是怎么产生的 三.低代码/无代码平台应具备哪些能力 四.主流的低代码/无代码平台有哪些 五.低代码/无代码平台典型应用场景 六.低代码/无代码平台有 ...

最新文章

  1. pandas数据预处理(标准化归一化、离散化/分箱/分桶、分类数据处理、时间类型数据处理、样本类别分布不均衡数据处理、数据抽样)
  2. static string java_java:String类、static关键字、Arrays类、 Math类
  3. 【IntelliJ IDEA】快捷键
  4. 计算机实验11公式与函数,《大学计算机基础》实验报告十一——Excel2003公式与函数的应用.doc...
  5. elasticearch 多种查询参数用法:
  6. Linux命令学习,学习这20条Linux命令,玩转你的树莓派!
  7. mysql 分区表优化_Sql优化之Mysql表分区
  8. html中颜色的编号,html中各种颜色的编号.doc
  9. oracle_数据库对象
  10. python白森_氧气恋人
  11. java 图像处理两例:图像缩放与圆角图片的制作
  12. 做一个聪明的前端开发者
  13. 12月第三周各国域名总量榜:中国729万居全球第二
  14. Kafka从上手到实践 - Kafka CLI:Consumer CLI Producer CLI | 凌云时刻
  15. MathType7数学公式编辑使用计算详细教程
  16. 文件后缀名修改重命名,两种更改的小技巧
  17. JSAPI微信支付java
  18. win7系统如何加速计算机启动,如何在win7中启动3D加速|在win7中启动3D加速的详细步骤...
  19. 【java】714. 买卖股票的最佳时机含手续费-----动态规划!!!
  20. 阿尔泰数据采集卡模拟量采集演示

热门文章

  1. 《深入理解Windows操作系统》笔记1
  2. 如何绘制高质量业务流程图
  3. jieba分词错误_jieba分词处理
  4. ios13 无法传参_Win版iOS13越狱最新消息汇总丨拼音字体更新
  5. Swift 包管理器教程
  6. matlab语句运算相关论文,毕业论文MATLAB在复变函数中的应用.doc
  7. 极域九法——小白看得懂的退出极域电子教室教程
  8. 计算机怎样双面打印,电脑双面打印机怎么打印双面_电脑如何设置自动双面打印-win7之家...
  9. DWS自动化包裹称重扫码测体积快手台的开发和源码
  10. MVC模式中Controller控制器为什么是Servlet?怎么理解?