如何在代码中对测试进行模糊处理以防止篡改响应处理?

Dub*_*ron 7 c++

我正在寻找一种方法来混淆(在目标代码中)一个测试 - 就像检查许可证密钥是否有效一样.我想要防止的是有人在图像二进制文件中搜索处理响应的代码.

bool checkError = foo();
if ( checkError ) // I'd like to avoid making a simple check like this one.
{
   // process response
}
Run Code Online (Sandbox Code Playgroud)

这是一个简单的例子,但不是推荐的方法:

int check = 71 * 13;
check += 35 * isValid(); // will only return 0 or 1

//later (delayed execution of response)
if ( check % 71 )
{
   //process response
}
Run Code Online (Sandbox Code Playgroud)

编辑:只是为了澄清,实际测试已经完成,我正在通过/失败返回.我的响应处理将是一个基本的jmp,并且会对如何混淆jmp位置的指针感兴趣.

Kel*_*nch 6

一种方法是将执行许可证检查的代码放入单独的DLL中.在主应用程序中,在运行时加载DLL并计算DLL本身的校验和.该应用程序存储了在构建DLL时计算的校验和.如果校验和不匹配,你有几个选项,显示错误版本的消息 - 有点明显; 不要调用许可证检查 - 不太明显但是当攻击者想知道为什么许可证检查没有被调用时会被注意到; 调用与真实许可检查功能名称相似的功能.

可以将其视为使用公钥加密.使用公钥作为配置的一部分,并在应用程序中内置私钥.如果他们弄乱公钥,应用程序的数字签名将以可检测的方式受到损害.

我同意@camccann,它有助于理解你期望的那种攻击.作为最后的手段,将许可证检查分成尽可能多的部分,以便通过更改单个分支点来更难以绕过.

[编辑]

另一个想法是使用状态机.请参阅此问题的最佳答案中的命令结构示例.将许可证检查的评估形式与散列查找和一组虚拟函数调用一起放入一个数组中.将许可证检查评估为适当函数的表/散列查找的决策代码看起来不像典型

if(){ pass;} else { fail; } 
Run Code Online (Sandbox Code Playgroud)

构造.

两个好处,
1)没有布尔条件绕过和
2)他们不知道要传递控制的函数的地址/名称,不能做一个简单的JMP指令.

SO螺纹状态机turorial.
SO线程在状态机实现上

  • 不幸的是,我觉得这错过了OP关注的领域.他并不担心检查许可证的实际过程.相反,他得到一个表示通过/失败的布尔值,并且需要根据该条件操作特定代码.然而,这归结为程序集中一个非常简单的jmp,一个简单的十六进制编辑器可以轻易地破坏条件检查,如果它们知道它在哪里.他想混淆这个jmp(if语句)的位置,而不是实际的许可证检查本身. (3认同)

C. *_*ann 5

混淆不会阻止,只是劝阻.一个足够熟练和坚定的攻击者将始终能够规避你使用的任何混淆,所以你首先需要知道的是:你想在这里挫败什么样的人?