如何绕过或阻止 GetSystemTime?
我将在不做任何假设的情况下回答这个问题。之前我不得不为一个客户做这件事,因为它是关于非版权放弃软件的。您的结果可能会有所不同。
至于您的具体问题,是的,这是可能的,但可能不是您想要实现的最佳(或最简单)解决方案。无论如何,请考虑以下事项,记住这些只是潜在的解决方案:
1.读入codecaves。这种非常常见的技术可以利用内存和功能来制作、注入、重定向和执行您编写的自定义代码。
2.跟踪该例程的执行。请注意驻留在寄存器和/或堆栈中的任何您感兴趣的值,尤其是call指令的返回值。根据您发现的内容,您可以创建仅修改现有字节的注入。
例如,也许来自1009A467-的字节1009A474足以创建一个自定义mov指令,eax在mov指令之前将您想要的值放入1009A477。
或者,如果您已经对那部分代码进行了足够的研究,也许您可以在另一个寄存器中指定某些内容 at 1009A477、 iemov [ebp+var_4], ebx或mov [ebp+var_4], edx等。
3.如果你nop这两jz条指令会发生什么?看看他们是如何跳转到那段代码的loc_1009A467?请注意,可能会出现意外结果,例如立即触发试用期结束或损坏数据。这是它可以帮助在安装应用程序时监控应用程序的足迹的时候,以便您可以确定它如何通过激活等功能保持持久性。也许它是一个临时文件、一个注册表项或其他东西。
最后,两个and你指向的指令1009A442和1009A446被引用时被清零的内存地址[ebp+offsets]分别。这只是将它们设置为以后在某处使用。任何and带有 0 的值都将等于 0。这是 Assembly 中用于清除寄存器的常用方法,就像您xor自己注册时一样,即xor eax, eax. 您可以and 在此处阅读有关二元运算的更多信息。
这是一个例子。
我和一个朋友很久以前就做了这个,以绕过对某个程序的试用(不命名)。它修改GetSystemTimeAsFileTime返回的值。
