c++ - 如何混淆代码中的测试以防止篡改响应处理?

标签 c++

我正在寻找一种方法来混淆(在目标代码中)测试 - 类似于检查许可证 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/

相关文章:

c++ - SFINAE 的类型名称关键字

c++ - 将 remove_if 与 C 空终止字符串一起使用

c++ - 使用 DevIL 和 Visual Studio 2010 加载图像时出现问题

c++ - 使用 >> 运算符设置对象

android - 对现有方法的 undefined reference

c++ - 如何使用vc++找出当前线程堆栈上还剩下多少空间?

c++ - 如何初始化二维 vector

c++ - 如何在我的应用程序中嵌入自定义字体

c++ - 如何使用数据字段获取组合框显示值?

c++ - 在 MaxOSX10.12.4 上成功安装 OpenCV3 但它不起作用