【问题标题】:How to Set Breakpoint in WinDbg on api-ms-* Calls in Windows 10如何在 Windows 10 中的 api-ms-* 调用上在 WinDbg 中设置断点
【发布时间】:2017-10-18 00:02:53
【问题描述】:

例如 IDA Pro 在库 api-ms-win-security-base-l1-2-0 中显示包含函数 CheckTokenMembership 的导入表

检查 API 调用的 MSDN 信息 https://msdn.microsoft.com/en-us/library/windows/desktop/aa376389(v=vs.85).aspx 它说它在 advapi32.dll 中

不过尝试

bp advapi32!CheckTokenMembership

导致错误无法解决“advapi32!CheckTokenMembership”处的错误

【问题讨论】:

    标签: winapi windbg


    【解决方案1】:

    CheckTokenMembership 将始终由 advapi32.dll 导出。问题是如果您有所述模块的符号,WinDbg 会使用符号名称。

    我要做的是输入bp ADVAPI32!CheckTokenMembership,然后按Tab,你应该会得到bp ADVAPI32!CheckTokenMembershipStub。这个技巧并不适用于所有情况,有时您必须自己弄清楚转发或查看 ntdll.dll 和 kernelbase.dll 导出。

    api- 文件不包含代码,它们只是微软出于某种原因强加给每个人的分层练习。我相信它们是MinWin 实验的结果,它们可能有一天会包含代码,但即便如此,kernel32 和朋友仍然会有转发器来保持兼容性,因此微软以外的任何人都没有理由使用 api- 文件(恕我直言)。

    【讨论】:

    • 将用户(和内核)导出分解为 api-ms-*.dll 文件是建立 API 集的一部分。这是一项工程工作,为让 Windows 在任何设备上运行奠定了基础,它本质上是启用通用 Windows 平台的原因。它允许在 PC、平板电脑、手机、HoloLens、IoT 设备、Xbox 等设备上运行相同的代码。
    • API 集通常不作为真实文件实现。加载器根据 apisetschema.dll 中的映射将它们映射到实现 DLL。 (目前在 Windows 10 系统上,apisetschema.dll 通常是 System32 中唯一的“api*.dll”文件。)与 mincore.lib 或 onecore.lib 链接将使用 API 集。
    【解决方案2】:

    我在故障转储文件上验证了 advapi32.dll 导出 CheckTokenMembership 函数,因此应该可以设置断点。在您的场景中,模块可能尚未加载,那么尝试使用 'bu' 怎么样?来自 WinDbg 帮助:

    • bu(设置未解决的断点)命令设置延迟或未解决的断点。 bu 断点设置在对命令中指定的断点位置的符号引用上(而不是在地址上),并在解析具有引用的模块时激活。有关这些断点的更多信息,请参阅未解决的断点 (bu Breakpoints)。

    76b51ca2 advapi32!CheckTokenMembership()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 2020-08-20
      相关资源
      最近更新 更多