用Reflector反编译

本文关键字:编译 Reflector | 更新日期: 2023-09-27 18:11:33

我已经完成了代码的反编译。但它不是显示字符串,而是显示一个负数。我怎样才能找到原来的字符串?
我的反编译代码如下:

string str = .(-812265445);  

应该是:

string str = "My string"; 

请帮注意,当我在project和debug中添加引用时,它可以看到字符串"My string" not .(-812265445);
当我使用另一个反汇编程序时,它显示:

string str = ACK. STX(-812265445);  

I guest ACK和STX是二进制字符。

多谢

你的回答是我从ILSpy拍摄的两张照片,以便更好地想象:

用Reflector反编译

有可能字符串被加密…或者是反射器的bug。如果它是加密的,这将没有帮助(调试器是你最好的选择,因为加密器在应用程序使用字符串之前注入解密代码)。

使用Reflector和ILDasm在已编译的程序集中查找字符串:

  1. 打开Reflector并找到您正在调查的成员/方法
  2. 将语言从c#更改为IL(以便查看ILDASM将显示什么)
  3. 验证字符串仍然没有正确显示
  4. 获取指令旁边的行标签(例如:L_0060:)

  5. 在ILDasm中打开程序集,找到您正在研究的方法

  6. 从收集器中找到指令标签(应该是与IL_0060相同的一行:)
  7. 如果这里的字符串仍然不正确,则该字符串已被加密

要验证程序集中存储的字符串,可以执行以下操作:

  1. 在ILDasm中,关闭显示
  2. 方法IL的对话框
  3. 进入"视图"菜单并检查"显示令牌"
  4. 在ILDASM中再次打开该方法,这次当您找到您的代码行时,它应该在它之后有一个令牌,如/* 70002C92 */(当然您的数字将不同),但这是字符串位于程序集的用户字符串元数据堆中的位置。
  5. 转到View -> Meta Info并检查Raw:Heaps
  6. 转到视图->元信息和显示!
  7. 在这个新的对话框中,进入查找菜单,把你的令牌放在那里,然后点击查找

这将带您到User Strings元数据堆中的条目,并准确地显示在二进制文件中编译的字符串。

请尝试Telerik反编译器

反编译不会返回原始代码。

你的例子看起来像一个简单的'加载寄存器与字符串的地址,做一些事情…'。

编译器不会将字符串(或任何数据)内嵌到指令中,数据、字符串、数字都被移动到适当的部分。因为这是一个字符串常量,所以它很可能被移到。data或。rodata节中。

将-812265445转换为十六进制使其更清晰,因为它变成0xCF95D01B,一个有效的地址来存储一些东西。如果您的输出基数是带符号的十进制(通常看起来是这样),那么地址通常以巨大的负值结束。将它们转换为十六进制或更改默认值以让您看到(或更容易理解)它们指向的位置。

L_0012: ldc.i4 -812265440  (0xCF95D020)
L_0017: call string ::(int32)
L_001c: stloc.0
L_001d: ldc.i4 -812265445  (0xCF95D01B)
L_0022: call string ::(int32)
L_0027: stloc.s str5

由此(您上面的评论),很明显,在0x12行(L_0012)上有一个"带有字符串地址的加载寄存器",调用"string::…"'来转换它(我想),然后存储将结果'string'指针放在某个地方。

然后在0x1D-0x27行再做一次。也许有一个4字节长的const字符串(因为第一次和第二次加载(lld .i4)地址相隔5个单位。(4个字符+ 0个终止符).

使用你的调试器或任何你必须显示那些地址的内存(使用任何实际在你当前的程序反汇编),看看那里有什么。探索!