【问题标题】:How do I know which DLL a syscall belongs to?我如何知道系统调用属于哪个 DLL?
【发布时间】:2011-02-04 22:53:30
【问题描述】:

我有一长串程序调用的列表。我需要知道的是每个调用属于哪个 DLL。我怎么会发现这个?

谢谢,

【问题讨论】:

标签: windows winapi dll system-calls


【解决方案1】:

嗯...你的标题和你的问题指向不同的东西。系统调用意味着一些非常具体的东西,对操作系统内核的调用(那些在 dll 中不是)。

事实上,Windows 不会直接公开这些 API,而是公开系统 DLL 中的 API,这些 API 负责自己调用系统调用。

假设您实际上没有系统调用列表,而是调用列表。这个列表是从二进制生成的吗?二进制文件实际上有一个它们所依赖的 dll 列表,dumpbin /imports binary.exe 实际上会准确列出您所要求的内容。

【讨论】:

  • 实际上是,系统调用的所有用户模式部分都在 ntdll.dll 中
【解决方案2】:

鉴于可执行文件,最简单的方法可能是dumpbin /imports <exe_name>。这将产生如下输出:

KERNEL32.dll
           405020 Import Address Table
           4060FC Import Name Table
                0 time date stamp
                0 Index of first forwarder reference

             126 GetModuleHandleA
             150 GetStartupInfoA

USER32.dll
           405480 Import Address Table
           40655C Import Name Table
                0 time date stamp
                0 Index of first forwarder reference

              F0 GetClientRect
             17A InvalidateRect
              B7 EnableWindow
             291 UpdateWindow

GDI32.dll
           405000 Import Address Table
           4060DC Import Name Table
                0 time date stamp
                0 Index of first forwarder reference

              37 CreateFontIndirectA
             1AF Rectangle
              4D CreateSolidBrush
              44 CreatePen
             1C7 SelectObject
              53 DeleteObject
             14F GetObjectA

根据您的可执行文件,您很有可能会获得更多无关信息。由于您已经有一个您关心的函数列表,因此应该很容易对其进行过滤以获取您需要的信息并忽略其余部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 2017-11-06
    • 2016-08-28
    相关资源
    最近更新 更多