逆向工程 --- 什么是加固
加固是保护软件代码不被安全分析的一种手段。加固技术有强弱,加固是一种不断对抗升级的过程,今天的加固明天就会被人解开。
加固有两种形式,
一个是第三方加固,加固的是apk文件
加固多存在于国内
最常见的是063,常见于打车软件和银绗类软件居多
一次是i加密。i加密在guo有资产或者天意软件较多。
还有一个是自定义加固,加固的是源码文件
比如mt管理器,因为开发这个软件的同样也是密码学专家,他的软件加固比商业加固都强悍。
常见的加密的方法有,
混淆,签名验证,dex和so加密保存,vmp指令虚拟化等技术。
-
反调试(Anti-Debugging)
-
目的:防止攻击者使用调试器(如GDB, IDA Pro)动态跟踪和分析应用逻辑。
-
方法:检查进程状态(如
ptrace
跟踪)、TracerPid
等,发现被调试则触发退出或执行错误逻辑。
-
-
环境检测(Environment Detection)
-
目的:判断应用是否运行在危险或非官方环境中。
-
方法:
-
Root/越狱检测:检查SuperSU、Magisk、特定目录或文件是否存在。
-
模拟器检测:检查模拟器特有的硬件信息(如IMEI、IMSI)、传感器、驱动程序等。
-
Hook框架检测:检测Xposed、Frida、Cydia Substrate等常用Hook框架的存在。
-
-
-
代码混淆(Obfuscation)的细分
-
命名混淆:将类、方法、字段名改为无意义的
a
,b
,c
等。这是最基础的。 -
控制流混淆:改变代码的执行流程,添加大量的
if-else
、switch
和无用代码块(死代码),使控制流图变得极其复杂,难以理解。 -
字符串加密:将代码中的明文字符串加密存储,运行时再解密使用,防止静态分析时直接搜索关键词定位关键代码。
-
指令替换:将简单的指令序列替换为功能相同但更复杂的指令。
-
-
完整性校验(Integrity Checks)
-
目的:防止应用被篡改(如修改Smali代码后重打包)。
-
-
方法:在运行时计算Dex文件、So库或关键资源的CRC或哈希值,与预埋的正确值比对。不符则退出。
-
-
-
白盒加密(White-Box Cryptography)
-
目的:将加密算法和密钥融为一体,在内存中从不出现完整的密钥,即使逆向分析加密函数本身,也无法提取出密钥。常用于保护App内的敏感数据和安全通信。
-
-
碎片化执行(Fragmented Execution)
-
目的:将一段核心算法的代码拆分成多个碎片,分散在不同的地方(如不同Dex、甚至网络端),在运行时再组合执行,增加静态分析的难度。
-
-
服务器协同(Server-Side Coordination)
-
目的:将最核心的业务逻辑放在服务器端,客户端只是一个“界面”。即使客户端被完全破解,攻击者也拿不到核心算法。这是最有效的保护,但依赖于网络。
-
总结:加固的本质与选择
正如您精辟地总结的:加固是一种不断对抗升级的过程,本质是“增加攻击成本”和“拖延时间”。
-
对于大多数应用:选择一款主流的第三方加固服务(如腾讯、360、梆梆、爱加密) 是最经济实惠的方案。它们提供了均衡的保护强度和兼容性,能有效对抗自动化攻击和普通破解者。
-
对于超高安全要求的应用(如数字钱包、核心金融功能):往往会采用 “第三方加固 + 自定义加固” 的多层混合方案。在通用保护的基础上,对最关键的业务代码进行自定义的、更深度的保护(如强大的VMP、白盒加密、自研反调试)。
-
对于MT管理器这类特殊应用:其开发者本身就是安全专家,且应用用户很多是逆向爱好者,攻击者水平极高。因此,高度定制化、不断创新的自研加固方案是其生存之本。