使用调试器检测可执行文件中的运行时更改

detect runtime change in executable using debugger

本文关键字:运行时 可执行文件 调试器 检测      更新时间:2023-10-16

我有一个c++的桌面应用程序。我想检查是否使用调试器在可执行文件中进行了任何运行时更改。如果完成,可执行文件将退出。我怎么检查?

我已经使用了CheckRemoteDebuggerPresent,但黑客在exe中做了更改以跳过此语句

编辑:如果调试器存在,我们可以强制停止它吗?如果不存在,它将充当一个虚拟代码。我已经尝试了DebugActiveProcessStop,但它不工作在当前进程,我猜

不幸的是,通常不可能确保您的可执行文件未被修改。你可以选择一个安全的平台(桌面应用程序不是),或者你可以从许多代码混淆/保护包中选择一个;但是可以绕过这些。

我最喜欢的关于这个主题的文章是《让海盗远离海湾》(来源)。

为了检测运行时的变化,你需要一个循环来散列内存的各个区域,以确保它们没有被修改,以及像VirtualQuery这样的东西,以确保页面访问没有被篡改,当然这总是可以被抵消的,只要看看暴雪监守(使用这种方法)。

Veracode的Tyler Shields最近发表的一篇论文提供了相当广泛的技术选择,您可以考虑使用。

http://www.shell-storm.org/papers/files/764.pdf

但是你必须接受这样一个事实:无论你选择做什么,一个老练的攻击者几乎总能找到绕过你的方法。

您可以使用CheckRemoteDebuggerPresent()来检测调试器,但我不知道是否有方法检测是否进行了更改。这里还有一些其他的选项