我已经完成了反编译代码。但它不是显示字符串,而是显示负数。如何找到原始字符串?
我的反编译代码如下:
string str = .(-812265445);
它应该是:
string str = "My string";
请帮助
注意,当我添加对项目和调试的引用时,它可以看到字符串“我的字符串”没有。( - 812265445);
当我使用另一个反汇编程序时,它会显示:
string str = ACK. STX(-812265445);
我来宾ACK和STX是二进制字符。
对你的答案的回答是我从ILSpy拍摄的两张照片,以便更好地想象:
答案 0 :(得分:3)
有可能是字符串被加密......或者它是Reflector中的一个错误。如果加密这将无济于事(调试器是你最好的选择,因为加密器在应用程序使用字符串之前注入解密代码)。
使用Reflector和ILDasm在已编译的程序集中查找字符串:
获取指令旁边的行标签(例如:L_0060:)
在ILDasm中打开您的程序集并找到您正在调查的方法
要验证程序集中存储的字符串,您可以执行以下操作:
这应该会带您进入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个终结符)。
使用你的调试器或你所拥有的任何东西在显示的那些地址显示内存(尽管使用当前程序反汇编中的实际内容)并查看其中的内容。探索!