【问题标题】:How to know the assembly code of a Windows system call using Visual Studio?如何使用 Visual Studio 知道 Windows 系统调用的汇编代码?
【发布时间】:2019-01-21 07:24:06
【问题描述】:

我有兴趣找出timeGetTime()GetTickCount() Windows API 函数之间的差异(实现方式),因为源代码不会公开,我正在考虑使用它们在 Visual Studio 中的汇编代码来分析它们的实现, 谁能提出更好的主意?

【问题讨论】:

  • 是的,在调用它的测试程序上使用调试器单步进入它。您可以很容易地看到函数的用户空间部分,但内核端(由syscall 调用)会比较棘手。不过,有些 API 函数不涉及实际的系统调用。希望大多数时间函数不涉及用户->内核->用户往返;他们不在Linux上。 (感谢在 VDSO 中导出到用户空间的内核数据。blog.packagecloud.io/eng/2016/04/05/…

标签: windows visual-studio x86 operating-system


【解决方案1】:

为用户模式代码使用调试器,如 Ollydbgx64dbgIDA pro 或 Visual Studio 本身。 如果您需要跨入内核模式端,请使用WinDBG

制作一个尽可能简单的程序,然后调用您要分析的 API:

  1. 如果它不是系统范围的调试器,请将其加载到调试器中。
  2. 在 API 上设置断点。
  3. 运行程序。
  4. 一旦中断,根据需要单步执行。

调试器对 Windows 的了解越多(阅读更多调试符号),分析就越容易。
WinDBG 有丰富的符号库,但使用起来有点硬件。


要了解像 GetTicksCount 这样的 API,您可能会发现此页面很有用:

正如Peter Corders 所假设的那样,Windows 在所有用户模式进程共享的内存区域中公开频繁访问信息,例如滴答计数。
GetTicksCount 仅从中复制数据(有一些同步) .

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 1970-01-01
  • 2018-10-01
  • 2018-03-21
相关资源
最近更新 更多