【问题标题】:DUMPBIN doesnt show all functionsDUMPBIN 不显示所有功能
【发布时间】:2018-07-13 23:39:33
【问题描述】:

我在以下程序中使用了 Microsoft Visual C++ 的 DUMPBIN 实用程序。我确信对remove 的调用最终会从kernel32.dll 调用DeleteFileW 的Microsoft 系统调用(我用另一个工具确认了这个调用)。 那么为什么当我在以下程序的.EXE 上应用DUMPBIN /imports 时,我没有看到DeleteFileW 系统调用?

如何使用DUMPBIN查看DeleteFileW的系统调用?

谢谢, 吉拉德

#include "stdafx.h"
#include <iostream>
#include <chrono>
#include <thread>

using namespace std;

int main()
{
    const char* fileName = "gilad.txt";

    this_thread::sleep_for(chrono::milliseconds(10*1000));

    if (remove(fileName) != 0)
        cout << "Remove operation failed" << endl;
    else
        cout << *fileName << " has been removed." << endl;
    return 0;
}

【问题讨论】:

标签: c++ windows dll system-calls dumpbin


【解决方案1】:

您的代码不调用DeleteFileW,而是调用remove。大概来自msvcrt.dll。是的,之后msvcrt.dll 会为您调用DeleteFileW,但该部分不会出现在您的可执行文件中。

(而dumpbin 作用于单个文件,它不跟踪其他文件的依赖关系)

如何在 DUMPBIN 输出中看到“DeleteFileW”的系统调用?

您必须在实际引用DeleteFileW 的文件上运行dumpbin。这不是上面的代码,而是您可以使用 WinAPI 创建的另一个代码,或者只是作为实验,在 msvcrt.dll 上运行它。

【讨论】:

    【解决方案2】:

    想提一下我用来解决这个问题的另一种“方法”:

    (使用 VS 2017 的开发人员命令提示符)

    1) 使用cl命令编译上述代码:

    cl main.cpp

    注意:为了直接从开发人员命令提示符编译它,我删除了第一行代码 (#include "stdafx.h")。

    2) 输出 使用以下命令“几乎”所有可能的dumpbin 实用程序输出(假设您的 exe 名为 main.exe 并且您创建了一个名为 myDumpbinOutput.txt 的输出文本文件) 使用命令:

    dumpbin /ALL /RAWDATA:NONE /OUT:myOutput.txt main.exe

    注意:/RAWDATA:NONE 消除了 /ALL 选项包含的 RAWDATA(不需要)。

    3) 使用文本编辑器(Notepead++)的“naive ctrl+f”来搜索,并且确实看到了对您正在寻找的系统调用的调用,DeleteFileW 在输出的 KERNEL32.dll 导入部分下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      • 2011-06-07
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      相关资源
      最近更新 更多