使用Reflector进行反编译

时间:2011-10-15 11:08:11

标签: c# .net reflector

我已经完成了反编译代码。但它不是显示字符串,而是显示负数。如何找到原始字符串?
我的反编译代码如下:

string str = .(-812265445);  

它应该是:

string str = "My string"; 

请帮助
注意,当我添加对项目和调试的引用时,它可以看到字符串“我的字符串”没有。( - 812265445);
当我使用另一个反汇编程序时,它会显示:

string str = ACK. STX(-812265445);  

我来宾ACK和STX是二进制字符。

非常感谢

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

3 个答案:

答案 0 :(得分:3)

有可能是字符串被加密......或者它是Reflector中的一个错误。如果加密这将无济于事(调试器是你最好的选择,因为加密器在应用程序使用字符串之前注入解密代码)。

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

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

  5. 在ILDasm中打开您的程序集并找到您正在调查的方法

  6. 从Relector找到指令标签(应该与IL_0060相同:)
  7. 如果此处的字符串仍然不正确,则字符串已加密
  8. 要验证程序集中存储的字符串,您可以执行以下操作:

    1. 在ILDasm中,关闭显示方法的IL的对话框
    2. 转到“查看”菜单并选中“检查显示标记”
    3. 在ILDASM中再次打开方法,这次当你找到你的代码行之后它应该有一个令牌,比如/ * 70002C92 * /(当然你的号码会有所不同)但是这是字符串所在的位置在程序集的用户字符串元数据堆中。
    4. 转到视图 - >元信息并检查Raw:Heaps
    5. 转到视图 - > Meta Info和Show!
    6. 在此新对话框中,转到“查找”菜单并将令牌放入其中,然后单击“查找”
    7. 这应该会带您进入User Strings元数据堆中的条目,并准确显示在二进制文件中编译的字符串。

答案 1 :(得分:0)

答案 2 :(得分:0)

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

你的例子看起来像一个简单的'带有地址字符串的加载寄存器,用它做点什么......'。

编译器不会将字符串(或任何数据)与指令一致,数据,字符串,数字都移动到适当的部分。由于这是一个字符串常量,它可能会移动到.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 :: ...'来转换它(我想)然后是一个商店把结果'字符串'指针放在某处。

然后在第0x1D-0x27行再次执行此操作。也许有一个4字节长的const char字符串(因为第一个和第二个加载(ldc.i4)地址相隔5个单元。(4个字符+ 0个终结符)。

使用你的调试器或你所拥有的任何东西在显示的那些地址显示内存(尽管使用当前程序反汇编中的实际内容)并查看其中的内容。探索!