type
status
date
slug
summary
tags
category
icon
password
什么是常量替代
- 常量替代指将二元运算指令(如加法、减法、异或等等)中使用的常数,替换为等效而更复杂的表达式,以达到混淆计算过程或某些特殊常量的目的
- 例如将 TEA 加密中使用的常量 0x9e3779b 替换为 1216716715+1885832146-643678438
- 同指令替代,目前仅支持整数常量的替换,因为替换浮点数会造成舍入的错误和误差。
- 且仅支持 32 位整数的替换
- 不过是可以拓展到任意位数整数的替换
- 和指令替代很像
常量替代的混淆效果
- 类似于指令替代,函数的控制流没有发生变化,但是运算过程变得难以分析
拓展能力强
- 常量替代可进一步拓展为常量数组的替代和字符串替代
- 常量数组替代可以抹去 AES, DES 等加密算法中特征数组,字符串替代可以防止攻击者通过字符串定位关键代码
替换思路
- 扫描所有指令,对目标指令(操作数类型为 32 位整数)进行替换
- 线性替换:val -> ax + by + c
- 其中 val 为原常量 a, b 为随机常量 x, y 为随机全局变量 c = val - (ax+by)
- 按位运算替换:val -> (x << 5 | y >> 3) ^ c
- 其中 val 为原常量 x, y 为随机全局变量 c = val ^ (x << 5 | y >> 3)
- 还有许多自定义方案