我正在为共享库的演示版本添加版权保护。我似乎有一些建议可以在许可证违规检测代码周围添加计时——这将是调试器 + 补丁目标——例如 RDTSC、GetTickCount() 等。不幸的是,这个共享库没有与计时相关的代码,所以添加会脱颖而出并使它们相对容易找到(我看到 IDAPro 可以找到所有出现的单个指令,例如 RDTSC,所以我认为 OllyDbg 也可以)。另一个建议是去除节头,但这似乎只适用于 exe,不适用于共享库。
目前,阻止调试器处理共享库或检测正在调试的库内部的前沿方法是什么?
我正在为共享库的演示版本添加版权保护。我似乎有一些建议可以在许可证违规检测代码周围添加计时——这将是调试器 + 补丁目标——例如 RDTSC、GetTickCount() 等。不幸的是,这个共享库没有与计时相关的代码,所以添加会脱颖而出并使它们相对容易找到(我看到 IDAPro 可以找到所有出现的单个指令,例如 RDTSC,所以我认为 OllyDbg 也可以)。另一个建议是去除节头,但这似乎只适用于 exe,不适用于共享库。
目前,阻止调试器处理共享库或检测正在调试的库内部的前沿方法是什么?
我不知道我给您的建议是否是“前沿方法”,但我将描述您可以执行的一些步骤,以保护您的软件。
不,重要的是要知道这一点并记住,您真正想要做的是尽可能地使其难以破解,并阻止潜在的违规者这样做。因此,您想让它变得如此复杂和模糊,以至于在静态和运行时更改任何内容都需要大量工作。
软件断点检测
您可能知道,要触发软件断点,调试器使用int 3指令,即当您在某个地址放置软件断点时,调试器会将该地址的字节覆盖为0xCC(int 3操作码),当该指令触发中断时,调试器将恢复之前存在的字节。这意味着每个软件断点都会更改代码部分中的某个字节,因此要检测它,您可以创建一个函数来搜索0xCC.
控制和检查
它是对先前技术的概括。0xCC您将检测代码中所做的任何更改,而不是仅检测 ,包括由NOPs替换的片段。您希望在保护过程结束时应用它,这样您就不需要在代码中进行每次更改时更改所需的控制和值。我建议您在代码中的许多不同位置放置检查校验和的函数,如果可能,使它们中的每一个都略有不同(以便一次找到它们并不容易)。
硬件断点检测
由于硬件断点不需要对过程映像进行任何更改,因此无法使用上述方法检测到它们。它们是使用DR寄存器实现的,并且可以4在给定时刻将它们创建为最大值。为了抵御它们,您可以不时重置它们的值。有关调试寄存器的更多信息。
时间/周期检查
由于您拥有源代码,因此您甚至可以在运行时导入其他库。在 Linux 上,您可以通过dlopen(加载库)并dlsym从中获取特定程序。当然,您应该加密每个字符串,以便找出您使用哪些函数来测量经过的时间并不容易。
内联每个函数
这将阻止调试器识别库函数,因此对于想要分析您的代码的每个人来说都会非常烦人。当然,使用C++模板也会有所帮助。;)
插入垃圾代码
您可以放置(当然也可以内联)许多不会改变程序行为的垃圾函数,但对于分析反汇编的人来说,这并不明显。您不必自己编写它们 - 您也可以使用库函数。
讨厌
当然,如果有人足够坚定,他最终会找到你所有的控制和/断点检查函数并将NOP它们找出来。但是,如果您在那里放置一些会对应用程序的其余部分产生影响的代码呢?考虑:
bool isBeingDebugged
{
if (controlSum(address) & rand() == requiredValue)
return true;
return false;
}
上述函数不仅检查代码完整性,还修改程序的全局状态。例如,如果您稍后使用某些依赖于rand()结果的字符串解码函数,那么如果该函数被简单地替换为NOPs ,应用程序的行为可能会有所不同。
有创意
最好的反调试技术是没有人期望的,所以搜索、试验和应用你自己的想法。