4

我有一个测试程序集,我想在文件中找到方法

[CompilerGenerated]
public bool get_CreateFlash()
{
    return this.cZBH;
}

我使用十六进制编辑器和模板进行搜索

2B * 26 16 02 7B * * * * 0A 2B * 06 2A

其中 * 是任何字节,因为我在 ILSpy 等工具中看不到确切的字节。

我找到了 1500 个匹配项,自然是 getter。不同的是在7B * * * *,像这样

"2B 02 26 16 02 7B 1D 00 00 04 0A 2B 00 06 2A"
"2B 02 26 16 02 7B 1E 00 00 04 0A 2B 00 06 2A"
...
etc.

我怎样才能找到我需要的东西?

4

1 回答 1

9

如果您使用 ILDasm(.NET Framework SDK 的一部分),它将显示相应的代码字节。

要显示它们,您需要在显示方法之前选择 View -> Show Bytes。我整理了一个小示例应用程序来测试它,并得到以下结果:

在 ILDASM 中反汇编一个简单的属性获取器

为了使用这些数据,重要的是要知道“|”左边的字节 在 .dll/.exe 中按顺序出现,而右边的则以 little-endian 编码。考虑到这一点,我在 .exe 中搜索了以下内容(请注意,我已突出显示以 little-endian 顺序排列的字节):

00 02 7b 03 00 00 04 0a 2b 00 06 2a

在我的(虽然很小)测试可执行文件中,这个字节序列只出现了一次。

请注意,在上面的屏幕截图中,它还表示方法 RVA(相对虚拟地址)。为了将其转换为文件位置,您需要确定可执行文件的布局。有许多可用的 PE 工具,但我使用dumpbinVisual 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 字节之前有一个小的方法头)。

于 2012-07-02T08:26:43.550 回答