我已经完成了代码的反编译。但它显示的不是字符串,而是负数。如何找到原始字符串?
我的反编译代码如下:
string str = .(-812265445); 它应该是:
string str = "My string"; 请帮帮忙
注意,当我添加对project和debug的引用时,它可以看到字符串"My string“not。(-812265445);
当我使用另一个反汇编程序时,它显示:
string str = ACK. STX(-812265445); I来宾ACK和STX是二进制字符。
非常感谢
对你的回答的回应是我从ILSpy上拍摄的两张照片,以便更好地想象:
发布于 2011-10-15 20:20:27
很可能字符串是加密的..。或者它是Reflector中的一个bug。如果是加密的,这是没有用的(调试器是您最好的选择,因为加密器在您的应用程序使用字符串之前注入解密代码)。
要使用Reflector和ILDasm在编译的程序集中查找字符串,请执行以下操作:
要验证程序集中存储的字符串,可以执行以下操作:
H125转到查看->元信息并显示!在此新对话框中,转至查找菜单并将令牌放入其中,然后单击查找
这将把您带到User Strings元数据堆中的条目,并确切地显示在二进制文件中编译了哪个字符串。
发布于 2011-10-15 19:36:06
请尝试Telerik Decompiler
发布于 2011-10-15 21:32:09
反编译不会返回原始代码。
你的例子看起来就像一个简单的“用字符串的地址加载寄存器,用它做点什么……”。
编译器不会将字符串(或任何数据)与指令内联,数据、字符串、数字都会移动到适当的部分。因为这是一个字符串常量,所以很可能会移到.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)行有一个'load register with address of the string‘,调用'string::...’转换它(我想),然后存储,将结果“string”指针放在某个地方。
然后,在0x1D-0x27行再次执行此操作。可能有一个4字节长的常量字符串(因为第一个和第二个加载(ldc.i4)地址相隔5个单位。(4个字符+0终止符)。
使用您的调试器或其他工具来显示所示地址的内存(使用当前程序反汇编中实际存在的内容),并查看其中的内容。探索!
https://stackoverflow.com/questions/7777430
复制相似问题