我最近发现了一个不错的破解版,它使用 VMProtect 3.x 作为防御。在网上做了一些研究后,我发现有几个 API 的 VMProtect 用作反调试方法。
我在这些函数上设置了软件断点,但不幸的是我没有命中它们。我 100% 确定在程序运行期间会调用 API。
这些API包括(CheckRemoteDebuggerPresent,IsDebuggerPresent,等...)。
如果有人知道这是什么原因或 VMProtect 使用什么规避方法,如果他们能分享它,我会更高兴。
我最近发现了一个不错的破解版,它使用 VMProtect 3.x 作为防御。在网上做了一些研究后,我发现有几个 API 的 VMProtect 用作反调试方法。
我在这些函数上设置了软件断点,但不幸的是我没有命中它们。我 100% 确定在程序运行期间会调用 API。
这些API包括(CheckRemoteDebuggerPresent,IsDebuggerPresent,等...)。
如果有人知道这是什么原因或 VMProtect 使用什么规避方法,如果他们能分享它,我会更高兴。
VMProtect 使用了一些反调试技术。首先,您不会想要自己解决它们,因为有一套非常详尽的技术来检测调试器。考虑使用反反调试插件(ScyllaHide)
您可能会遇到一个难以解决的问题是 rdtsc 指令。
rdtsc 本质上允许应用程序测量在一系列指令执行之间经过的时间。调试器的步进行为将使这段时间变长,从而通过某些应用程序逻辑触发对调试器存在的检测。使用大量代码混淆,您无法手动解决这些问题。您将需要使用 find 一些自动化方法(但是,由于 rdtsc 不是特权指令,因此绕过这可能是一个巨大的痛苦。)
这里最好的方法可能是编写一个自定义的 Intel PIN 工具来在使用指令时修改 CPU 状态(参见https://github.com/jingpu/pintools/blob/master/source/tools/InstLib/time_warp.H) . 还有其他方法(包括使用内核级驱动程序,但 IIRC 这种方法可能非常慢且难以工作。)
就您对 VMProtect 采取的总体方法而言,混淆是相当复杂的,如果您之前从未对代码进行过去虚拟化,那么您会想先尝试一个简单的 VM。去虚拟化代码和逆向工程虚拟机,尤其是像 VMProtect 这样混淆的虚拟机,可能是一个需要一周时间的项目。
VMProtect 本身也有多个不同的 VM“原型”。有一些更简单的虚拟机,在其他领域有更严重的混淆,还有一些非常重量级的虚拟机或多层虚拟化。因此,在不了解其他代码混淆技术(控制流扁平化、错误谓词和虚拟化)的实际应用的情况下,这绝对不是您想要接近的项目