使用 windows api 检测模拟器

逆向工程 登录
2021-06-23 05:39:12

我得到了一个模拟 Windows API 的程序。我试图在这个模拟器中找到缺陷:

  1. 无论主机系统如何,始终返回一个常量值(用于指纹识别)
    • 例如,在此模拟器中获取用户名的调用会返回各种随机字符串。但无论主机系统上的实际值如何,获取可用磁盘空间的调用始终返回相同的数字。
  2. 从裸机返回真实值(模拟器泄漏真实信息)
    • 例如,获取 MAC 地址的调用会从主机系统返回值。

我没有编写函数来测试 Windows API 中各种函数的返回值,而是寻找一种方法来自动生成代码(最好使用 C/C++)来查询 WinAPI 提供的大量函数。这样的事情是可能的,还是已经为我可以利用的其他项目完成了?

2个回答

我曾多次使用反病毒引擎进行过同样的练习。一般我使用的步骤是:

  1. 识别 CPU/Windows 模拟器。这通常是最难的部分。查看文件名,并对大型 switch 语句进行反汇编。找到具有 200 个或更多案例的交换机并单独检查它们。其中至少有一个与解码单字节 X86 操作码有关。
  2. 查找 CALL 指令的调度程序。通常它有特殊的处理来确定是否正在调用一个固定地址。如果这种方法没有结果,请查看周围模块中的字符串以查看与某些 Windows API 明显相关的任何内容。
  3. 游戏结束。AV 引擎在许多易于辨别的方面不同于真正的处理器和 Windows 的正版副本。要检查的事情:将虚假参数传递给 API 并查看它们是否正确处理错误条件(它们从不这样做)。查看您的模拟器是否模拟了 AF 标志。查看复杂指令的异常行为,看看您的模拟器是否正确实现了它。具体看一下 GetTickCount 和 GetLastError 的实现,因为它们通常被严重破坏。

之前的回答很好。我会说这取决于机器和模拟器。还有更多的技巧可以识别模拟器。

你可能看一下环境,文件系统里有模拟器吗?正在运行的应用程序数量是否表示虚拟应用程序?

询问操作系统是否调试了应用程序;存在不同的方法,大多数很容易被打败。

我有一个程序可以测量关闭指令之间的执行时间。如果机器没有对仿真的硬件支持,这是非常可靠的。

使用google进行反调试

克里斯·雅各比