我正在寻找一种方法来混淆(在目标代码中)测试 - 类似于检查许可证 key 是否有效的方法。我试图阻止的是有人在图像二进制文件中搜索处理响应的代码。
bool checkError = foo();
if ( checkError ) // I'd like to avoid making a simple check like this one.
{
// process response
}
这是一个简单的例子,但不是推荐的方法:
int check = 71 * 13;
check += 35 * isValid(); // will only return 0 or 1
//later (delayed execution of response)
if ( check % 71 )
{
//process response
}
编辑: 澄清一下,实际测试已经完成,我得到了通过/失败的返回。我的响应处理将是一个基本的 jmp,并且会对有关如何混淆 jmp 位置的指示感兴趣。
最佳答案
一种方法是将执行许可证检查的代码放入单独的 DLL 中。在主应用程序中,在运行时加载 DLL 并计算 DLL 本身的校验和。该应用程序存储使用构建的 DLL 计算的校验和。如果校验和不匹配,您有多种选择,显示错误版本消息 - 有点明显;不要调用许可检查——不太明显,但当攻击者想知道为什么不调用许可检查时会注意到;调用与真实许可检查函数具有相似名称的函数。
将其视为使用公钥加密。使用公钥作为配置的一部分,并将私钥内置到应用程序中。如果他们弄乱了公钥,应用程序的数字签名将以可检测的方式受到损害。
我同意@camccann 的观点,它有助于了解您预期的攻击类型。作为最后的手段,将许可检查分成尽可能多的部分,以使其更难通过更改单个分支点来绕过。
[编辑]
另一个想法是使用状态机。请参阅 this question 的最佳答案中的命令结构示例.将许可证检查的评估放入散列查找的形式,并将一组虚拟函数调用与适当的函数一起放入数组中。将许可证评估为适当功能的表/哈希查找的决策代码看起来不像您的典型
if(){ pass;} else { fail; }
构造。
两个好处,
1) 没有 bool 条件可以绕过并且
2) 在不知道要将控制权传递给的函数的地址/名称的情况下,他们无法执行简单的 JMP 指令。
SO thread on a state machine turorial .
SO thread on state machine implementations
关于c++ - 如何混淆代码中的测试以防止篡改响应处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1890555/