如果您使用 ILDasm(.NET Framework SDK 的一部分),它将显示相应的代码字节。
要显示它们,您需要在显示方法之前选择 View -> Show Bytes。我整理了一个小示例应用程序来测试它,并得到以下结果:
为了使用这些数据,重要的是要知道“|”左边的字节 在 .dll/.exe 中按顺序出现,而右边的则以 little-endian 编码。考虑到这一点,我在 .exe 中搜索了以下内容(请注意,我已突出显示以 little-endian 顺序排列的字节):
00 02 7b 03 00 00 04 0a 2b 00 06 2a
在我的(虽然很小)测试可执行文件中,这个字节序列只出现了一次。
请注意,在上面的屏幕截图中,它还表示方法 RVA(相对虚拟地址)。为了将其转换为文件位置,您需要确定可执行文件的布局。有许多可用的 PE 工具,但我使用dumpbin
Visual Studio 附带的工具来查看 PE 标头 ( dumpbin /headers <your exe name>
)。此可执行文件的相关数据:
第 1 节标题
.text 名称
1824 虚拟大小
2000 虚拟地址(00402000 到 00403823)
1A00 大小的原始数据
200 指向原始数据的文件指针(00000200 到 00001BFF)
0 指向重定位表的文件指针
0 指向行号的文件指针
0 搬迁次数
0 行号数
60000020 个标志
代码
执行读取
这里,.text
节的虚拟地址表示为 0x2000,虚拟大小为 0x1824 字节。由于该方法的 RVA 为 0x2464,因此它必须位于此部分中。输出中的“指向原始数据的文件指针”dumpbin
表明包含我们方法的部分在可执行文件中从 0x200 开始,因此我们可以计算方法在可执行文件中的偏移量为:
(方法 RVA - RVA 部分)+ 文件位置
= (0x2464 - 0x2000) + 0x200
= 0x664
转到测试可执行文件中的位置 0x664,我们正在寻找的字节确实可以在那里看到(它们并不完全在这个位置,而是在它之后的几个字节,因为在 IL 字节之前有一个小的方法头)。