如何在十六进制的程序集文件中查找方法?

时间:2012-07-01 14:25:53

标签: .net reflection hex .net-assembly

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

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

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

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

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

我找到了1500场比赛,当然,它是吸气剂。不同的是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.

我如何找到我需要的东西?

1 个答案:

答案 0 :(得分:9)

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

要显示它们,您需要选择查看 - >在显示方法之前显示字节。我将一个小的示例应用程序放在一起进行测试,得到以下结果:

Disassembly of a simple property getter in ILDASM with "Show Bytes" enabled

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

  

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

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

请注意,在上面的屏幕截图中,它还指示了方法RVA(相对虚拟地址)。要将其转换为文件位置,您需要确定可执行文件的布局。有许多PE工具可用,但我使用Visual Studio附带的dumpbin来查看PE头(dumpbin /headers <your exe name>)。此可执行文件的相关数据:

SECTION HEADER #1
   .text name
    1824 virtual size
    2000 virtual address (00402000 to 00403823)
    1A00 size of raw data
     200 file pointer to raw data (00000200 to 00001BFF)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60000020 flags
         Code
         Execute Read

这里,.text部分的虚拟地址表示为0x2000,虚拟大小为0x1824字节。由于该方法的RVA为0x2464,因此它必须位于此部分中。来自dumpbin的输出中的“原始数据的文件指针”表示包含我们的方法的部分从可执行文件中的0x200开始,因此我们可以在可执行文件中计算该方法的偏移量:

(Method RVA - Section RVA) + File Location
= (0x2464 - 0x2000) + 0x200
= 0x664

在测试可执行文件中找到位置0x664,我们正在寻找的字节确实可以在那里看到(它们不完全在这个位置,但在它之后的几个字节,因为在IL字节之前有一个小方法头)。