细说arm反类ollvm混淆-基本思想
从最简单开始 先从一个简单的函数开始 1 2 3 4 5 6 7 8 9 10 11 12 int main ( int argc, const char **argv) { int a = atoi (argv[1]); if (a > 5) { a = a+1; printf ( "a %d" , a); } else { a *= 2; printf ( "a %d" , a); } return 0; } 直接正常编译,ida cfg如下 如果用ollvm加上fla(这里为了简单说明问题,只加fla,加了其他混淆并不改变反混淆的原理) 可以看到,加入了很多小块,而原来真正跟原程序相关的块,这里已经用浅蓝色标出,先来看看这样子直接F5的结果。 可以看到原来非常直接的顺序执行逻辑,现在变成非常不直观的平坦化逻辑,每一个真实逻辑执行完,无法直观地知道下一个真正要执行的地方是哪里。造成这种效果的罪魁祸首就是加上去的小块. 观察一下一个真实块的逻辑 这个块对应的是原程序a变量与5比较的逻辑,只不过做完a跟5的比较判断之后,将一个很大的数字mov到R0寄存器. 继续看看这个块的目的地loc_738所做的事情。 这个块做的事情只有一个,根据之前的真实块(loc_70E)mov到R0的结果,决定需要跳转到哪个块。中间可能经过其他白色块的中转,但是最终的结果肯定是另外一个真实块。