逆向工程防护

逆向工程防护

何为逆向工程

  • 软件逆推,还原成一段段代码,找到其中的关键代码,篡改,破解,发现漏洞
  • 最好的例子就是盗版软件。开发者们累死累活写好的程序,分分钟被人逆向破解,植入广告和木马,重新打包成盗版
  • 正义的逆向者只是做安全研究,而非正义的逆向者却拿着这项技能四处干坏事牟利
    • 一方为防破解使出浑身解数
    • 一方为破解绞尽脑汁

有哪些对抗逆向工程的手段

  • 加密和混淆
  • 反调试:调试器运行时出现错误或停止运行
  • 动态链接库保护
  • 数字签名防篡改,代码完整性保护
  • 运行环境保护:用虚拟化技术对软件运行环境进行保护,如沙箱技术,虚拟机等
  • 法律手段

代码混淆

代码混淆(Obfuscation) 是将电脑程序的原始代码或机器代码,转换成功能上等价,但难以被人阅读和理解的行为。

  • 加大阅读和理解的难度,以此来加强代码的保护
  • 甚至会在代码里加各种多余的垃圾指令和代码,把原来的逻辑拆分成个各种怪癖语法,达到防破解的目的

怎么做?

  • 各种元素命名无意义化(名称混淆)
  • 代码缩减(删除注释,空格等)
  • 等价复杂化
    • 循环改递归
    • 精简中间变量等

和加密的差异

  • 加密顾名思义是将想要隐藏的东西上锁
  • 混淆则不是,处理时,信息保持原样,只是以一种模糊的格式呈现出来。将复杂性提高到难以理解或解析的程度。
    • 逆向工程师死磕到底
    • 放弃破解转去破解更易破解的应用程序
  • 混淆只能增加难度,调试及除错也变得困难起来

防Hook

代码检测完整性,运行环境、框架检测等

加壳

  • 利用特殊算法,对文件里的资源进行压缩,改变其原来的特征码,隐藏字符串等。使得一些资源编辑软件无法正常打开或修改,类似 winrar 的效果。只不过这个压缩后的文件,可独立运行,解压过程完全屏蔽,都在内存中完成
  • 解压原理:在文件头里加了一段指令,告诉 cpu,怎么才能解压自己
  • 相当于给可执行文件加个外衣,用户执行的是这个壳程序,外壳程序会把原来的程序在内存中解开,而后交给真正的程序

App 扫描与加固

  • Android应用安全加固,使用 DEX VMP、DEX函数抽取加密及动态还原,DEX文件加壳,So 文件加固,核心代码转为二进制、H5 文件混淆、SDK 加固,资源文件完整性保护,防调试保护,签名校验,防截屏,防劫持等技术。使加固后的应用具备防逆向分析,防二次代码,防动态测试,防动态注入,防数据篡改等安全防护能力

  • IOS 应用安全加固,使用常量字符串随机加密,等效指令替换,基本块分裂,基本块调度,虚假控制流,控制流扁平化,控制流间接化等技术,对 IPA 文件进行加固,活在 OC/C/C++/Swift代码编译的过程中对源码进行保护,增强加固后的应用的防逆向分析,防二次代码,防动态测试,防动态注入,防数据篡改等安全防护能力

  • SDK 加固使用 DEX 加壳,DEX 源码分析及动态还原,DEX VMP、防调试技术对 AAR、JAR 文件进行加固,使加固后的 AAR,JAR 文件具备防逆向分析,防动态调试等安全防护能力;对于 So 文件,使用 So 加固技术;对于 IOS SDK,使用 IOS 源码混淆技术

    • Java SDK 自定义解释器或用 Java Agent 技术活重写 class loader,对文件,方法进行加载时解密,确定是要修改运行环境,无法被其他项目兼容

    • 安全沙盒技术(virbox protector java VME保护技术):SDK 中的字节码转换为自定义的虚拟机字节码,并将其替换成跳转代码,运行时跳转至自定义虚拟机中解释执行[1]

      VME保护前

VME 保护后

反调试技术有哪些

  • 都可以检测当前进程是否被调试器附加,判定到调试器附加则终止程序

    • 有系统函数或标志位可以判断,有硬件断电检测技术,也可监视特定的库或文件
  • 利用流行调试器的漏洞,让调试器崩溃或无法正常工作(H5 也有类似做法)

  • 使用基于时间的检测技术,比较代码执行的实际时间和预期时间,有显著差异则终止

    • 都可使用硬件断点检测的技术,但实现不同,android 使用寄存器或内存地址来设置断点,IOS 使用调试寄存器来设置断点

前端 H5 代码防护手段

  • 混淆压缩,如控制流混淆
  • 字符串加密,代码整体加密
  • 运行时保护
    • 域名锁定
    • 禁止控制台输出
    • 反调试
      • 无限 debugger,打断、阻止看代码。仅限于防静态分析
      • 禁止打开控制台

参考