type
status
date
slug
summary
tags
category
icon
password
什么是指令替代
- 指令替代是指将一些运算指令(如加法、减法、异或等等),替换为等效而更复杂的指令序列,以达到混淆计算过程的目的 例如将上面的简单异或运算改成下面的等价运算
再说一个简单一点的,例如将 a+b 替换为 a - (-b) ,将 a ^ b 替换为 (~a & b) | (a & ~b) 等等
需要注意的是这些替换仅支持整数运算的替换,因为替换浮点指令会造成舍入的错误和误差
指令替代不会影响程序的控制流,但反编译出来的式子难以分辨,所以我们可以用这个来改掉一些加密算法的特征值比如 tea 系列算法的魔数,AES 和 DES 的加密盒
指令替代实现
步骤
步骤很简单,只需要一步,扫描所有指令,对需要进行替换的指令(加法、减法、与或非、异或)进行替换
加法(+)指令替换
a = b + c,一共有四种替代方案
第一种AddNeg
第二种 AddDoubleNeg
第三种 AddRand1
第四种AddRand2
减法(-)指令替代
a = b - c,一共有三种替换方案
第一种 subNeg
第二种 subRand1
第三种 subrand2
与 (&) 运算指令替换
a = b & c,一共有两种替换方案
第一种 andSubstitute
第二种 andSubstituteRand
这里举例较为复杂,用代码举例吧
或(|)运算指令替换
a = b | c,一共有两种替换方案
第一种 orSubstitue
第二种 orSubstitueRand
一样上代码
异或(^)指令替换
a = b ^ c,一共有两种替换方案
第一种 xorSubsititute
第二种 xorSubsitituteRand
上代码