- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在编写一个小的 PE 阅读器,所以我在测试应用程序的同时运行 dumpbin 以确认值被正确读取。到目前为止一切正常,除了导出表。
我正在测试的文件是一个 DLL。我的应用程序以字节数组的形式读取文件,该字节数组被传递到我的 PE 阅读器类。这些值与 dumpbin 输出的值一致,包括 RVA 和导出数据目录的大小。
E000 [ 362] RVA [size] of Export Directory
问题是,字节数组的大小只有 42,496。正如您可能想象的那样,当我的 PE 阅读器尝试读取 E000 (57,344) 时,我得到一个 IndexOutOfRangeException
。然而,dumpbin 没有这样的问题,并且可以很好地读取导出目录。是的,整个文件确实被读入了字节数组。
这怎么可能?
最佳答案
PE文件包含“节”,节有独立的基地址。 PE 不是连续的内存镜像。每个部分都是一个连续的内存镜像。
首先,您必须阅读部分信息并制作其布局的内存映射。然后,您将能够将部分偏移量与基于文件的偏移量对齐。
顺便说一句,考虑看看 OllyDbg,它是一个免费的开源 Windows 调试器和反汇编器。它可能会帮助您测试自己的软件,并且可能会达到您试图通过“自己动手”来实现的目的。
dumpbin/all
输出示例:
SECTION HEADER #1 .text name BC14 virtual size 1000 virtual address (00401000 to 0040CC13) BE00 size of raw data 400 file pointer to raw data (00000400 to 0000C1FF) 0 file pointer to relocation table 0 file pointer to line numbers 0 number of relocations 0 number of line numbers60000020 flags Code Execute Read
在这种情况下,我的 .text 部分从 RVA 1000 开始并延伸到 RVA CE00。此部分的文件指针为 400。我可以通过减去 600 的工作将 1000-CDFF 范围内的任何 RVA 转换为文件指针。(所有数值均为十六进制。)
无论何时遇到“RVA”(相对虚拟地址),您都可以使用以下方法将其解析为文件偏移量(或字节数组的索引):
您可能使用的另一种方法是调用 MapViewOfFileEx()
,并在 dwDesiredAccess 参数中设置标志 FILE_MAP_EXECUTE
。该 API 将从 PE 文件中解析节标题,并将节的内容读入它们相对于“模块库”的位置。
模块基址是加载PE头的基地址。当使用 LoadLibrary()
函数加载 DLL 时,这可以通过 GetModuleInformation()
函数的 MODULEINFO
成员 lpBaseOfDll 获得。
当使用 MapViewOfFileEx()
时,模块基础只是 MapViewOfFileEx()
的返回值。
在以这些方式加载模块的设置中,将RVA解析为普通指针值是:
char *
char *
char *
转换为实际数据类型并取消引用。在这些方法中让操作系统映射文件的一个缺点是,如果您使用此工具调查一些可疑文件并且不确定开发人员是否对节标题采取了奇怪的自由,您可能会错过通过让操作系统处理这部分解析来获取一些有值(value)的信息。
关于c# - 当 dumpbin 出现在比文件本身大的文件偏移处时,它如何读取导出表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1569900/
我在以下程序中使用了 Microsoft Visual C++ 的 DUMPBIN 实用程序。我确定 remove 的调用最终会从 kernel32.dll 调用 DeleteFileW 的 Micr
我不明白为什么在 Visual Studio 命令行上执行以下命令时 dumpbin 返回 x64: dumpbin libgmp.lib /HEADERS |more 这是在Cygwin 32位版本
我正在使用 DUMPBIN 实用程序从 c++ dll 中获取损坏的名称以在 c# 应用程序中使用。我正在使用 __declspec(dllexport) 公开一个 C++ 类成员函数,输出的名称结果
我最近一直在使用 dumpbin 来查看一些使用 dumpbin foo.lib/symbols 的静态库中的符号。我想看看它如何用于可执行文件和 DLL。 我的第一个观察结果是 dumpbin fo
dumpbin/imports 显示的Input Address Table 和Input Name Table 是什么? Dump of file c:\windows\System32\kerne
我没有在我的系统上看到 dumpbin.exe。我的系统上有 Visual Studio 2005。当我在命令行中输入 dumpbin 时,它会显示无法识别的命令。 Visual Studio 默认自
在带有/EXPORTS 或/IMPORTS 的 C++ .DLL(或 IMPLIB .LIB 文件)上使用 DUMPBIN 我在输出中看到如下语法: Exports ordinal name
我正在编写一个小的 PE 阅读器,所以我在测试应用程序的同时运行 dumpbin 以确认值被正确读取。到目前为止一切正常,除了导出表。 我正在测试的文件是一个 DLL。我的应用程序以字节数组的形式读取
我下载了 Crypto++ 5.62 并使用默认项目设置构建了它。在我的项目中,我设置了 cryptopp.lib 的路径,并在“附加依赖项”中定义了它的名称。 Crypto++ 和我的项目 - VS
我不确定我的问题在 Linux 方面是否有意义。我正在寻找与 Visual Studio 工具包中的 dumpbin.exe 类似的东西。 基本上,我有一个包含一堆库和一个可执行文件的现有项目。我想弄
这是一个项目 rawinput_latest.zip 目标框架:.Net 4 输出类型:类库 Building Solution 创建 dll 文件。 dumpbin/exports RawInput
我想了解加载可执行文件的机制,所以我用 notepad.exe 做了两个不同的测试 1) 运行转储命令: dumpbin /ALL "C:\Windows\System32\notepad.exe"
这是我从 dumpbin AchievementsTable.obj /HEADERS 得到的输出 Microsoft (R) COFF/PE Dumper Version 8.00.50727.76
1)在 dll 的 dumpbin 输出中,我在代码部分看到下面的属性“虚拟地址” 第 1 节标题 .文本名称 100C virtual size 1000 virtual address (1C00
我在 visual studio 2010 中编写了一个包含大量函数和类的 .dll 库。当我查看文件的内容时: dumpbin.exe /EXPORTS myDll.dll 我得到带有某种函数位置指
这是我遵循的步骤。 1) 我从 Kip Irvine 的《x86 处理器的汇编语言》一书中获取了三个不同小程序的汇编语言代码。 2) 我组装、链接以生成有效的可执行文件,在每种情况下都没有错误。 3)
我们都知道我们可以对 .obj 文件使用 dumpbin 来显示所有符号,包括外部符号。 dumpbin /symbols ExternCTest.ob 00F 00000000 UNDEF not
我对C的了解非常有限。我正在尝试升级我的项目中使用的库。我用更新的文件替换了旧的静态库和头文件。当我尝试构建项目时,收到“无法解析的外部符号”错误。 我使用dumpbin检查了旧的和新的lib文件,发
我以前没有使用 .dll 或 .lib 文件的经验,我需要查看这些文件中的函数代码。我不知道该看哪一个,在 stackoverflow 中四处搜索让我找到了 dumpbin,我可以使用 dumpbin
假设这是我的程序 simpleCsharp.exe: namespace simpleCsharp { public class Program { pu
我是一名优秀的程序员,十分优秀!