1

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

如何查看DeleteFileWusing的系统调用DUMPBIN

谢谢,吉拉德

#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;
}
4

2 回答 2

2

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

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

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

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

于 2018-02-03T17:55:12.330 回答
1

想提一下我为解决此问题而采取的另一种“方法”:

(使用 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+ ”进行搜索,确实在输出的导入部分下看到了对您正在寻找的系统调用的调用。fDeleteFileWKERNEL32.dll

于 2018-04-13T13:38:24.673 回答