我有一个用c ++编写的桌面应用程序。我想检查使用调试器的可执行文件中是否有任何运行时更改已完成。如果完成可执行文件将退出。我怎么检查它?
我已经使用了CheckRemoteDebuggerPresent,但黑客在exe中进行了更改以跳过此声明
编辑: 我们是否可以强制停止调试器(如果存在),如果不存在则只会充当虚拟代码。我已经尝试过DebugActiveProcessStop,但它不能用于当前的进程我猜
答案 0 :(得分:2)
不幸的是,通常无法确保不修改您的可执行文件。您可以选择安全平台(桌面应用程序不是),或者您可以获得许多代码混淆/保护包之一;但是可以绕过这些。
我最喜欢的关于这个主题的文章是“让海盗留在海湾”(source)。
答案 1 :(得分:1)
要检测运行时更改,您需要一个循环来对所有内存区域进行哈希处理,以确保它们不会像VirtualQuery
那样进行修改,以确保页面访问权限不会被篡改,当然这总是可以被反击,只看暴雪守望者(使用这种方法)。
答案 2 :(得分:1)
Veracode的Tyler Shields最近的论文提供了大量您可以考虑使用的技术。
http://www.shell-storm.org/papers/files/764.pdf
但你必须接受一个老练的攻击者几乎总能找到解决你选择的方法。
答案 3 :(得分:-1)
您可以使用CheckRemoteDebuggerPresent()来检测调试器,但我不知道是否有办法检测是否已进行更改。还有一些其他选项here。