1625-5 王子昂 总结《2018年3月1日》 【连续第516天总结】
A. 防范算法求逆(3)
B.
游击战术
将验证函数F分解成多个互不相同的Fi,然后将Fi尽可能地隐藏到程序里去
层层叠叠
通过任意一个Fi的验证都只是注册码合法的必要条件,而非充分条件。真正合法的注册码能够通过所有的Fi的验证。而仅仅通过部分验证的R会在其他通不过的验证处被发现。
这种方法虽然比较麻烦,但是相对的破解者针对起来也会更加麻烦。因为不清楚在哪里会分布着校验,例如
- 软件入口处
- 每个关键功能使用时
- 定时器计时校验
虚虚实实
每个地方放置的校验函数并不一定是真实的,甚至可以在某些地方调取验证码,但其实做了反向的校验(正确的验证码会返回False,而破解者若不注意校验码的真实值则会被误导将这里也期望返回True,导致被发现验证码不正确,或者造成无解等情况)
另一方面,分函数的方法可以使用线性方程组、平面/曲面/曲线方程组等。如果破解者没有看穿分函数之间的联系,将会一样苦于应付方程组。
战略转移
破解者为了快速找到对验证码的调用,通常会使用访问断点。
对于游击战术,这个方法是致命的:一次性找到所有对验证码的调用,将使得四处分布的Fi暴露无遗。
为了应对这一点,可以不断地将注册码转移:
- 内存拷贝,单一的内存拷贝难度较低,容易被破解;因此可以一次将注册码拷贝到多个地址
- 写入注册表或文件
上述所有手段都只是增加破解者的破解成本,而不是为了让破解者无法(理论上的)破解。使用多种恶心的手段来增加破解者的时间成本和心态,将大大提高防御成功的成功率。
C. 明日计划
抵御静态分析