逆向工程防护
逆向工程防护
DiffDay何为逆向工程
- 软件逆推,还原成一段段代码,找到其中的关键代码,篡改,破解,发现漏洞
- 最好的例子就是盗版软件。开发者们累死累活写好的程序,分分钟被人逆向破解,植入广告和木马,重新打包成盗版
- 正义的逆向者只是做安全研究,而非正义的逆向者却拿着这项技能四处干坏事牟利
- 一方为防破解使出浑身解数
- 一方为破解绞尽脑汁
有哪些对抗逆向工程的手段
- 加密和混淆
- 反调试:调试器运行时出现错误或停止运行
- 动态链接库保护
- 数字签名防篡改,代码完整性保护
- 运行环境保护:用虚拟化技术对软件运行环境进行保护,如沙箱技术,虚拟机等
- 法律手段
代码混淆
代码混淆(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]
-
反调试技术有哪些
-
都可以检测当前进程是否被调试器附加,判定到调试器附加则终止程序
- 有系统函数或标志位可以判断,有硬件断电检测技术,也可监视特定的库或文件
-
利用流行调试器的漏洞,让调试器崩溃或无法正常工作(H5 也有类似做法)
-
使用基于时间的检测技术,比较代码执行的实际时间和预期时间,有显著差异则终止
- 都可使用硬件断点检测的技术,但实现不同,android 使用寄存器或内存地址来设置断点,IOS 使用调试寄存器来设置断点
前端 H5 代码防护手段
- 混淆压缩,如控制流混淆
- 字符串加密,代码整体加密
- 运行时保护
- 域名锁定
- 禁止控制台输出
- 反调试
- 无限 debugger,打断、阻止看代码。仅限于防静态分析
- 禁止打开控制台
参考
- 1.sohu Java虚拟化加密保护 ↩