用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拍摄的两张照片,以便更好地想象:
有可能字符串被加密…或者是反射器的bug。如果它是加密的,这将没有帮助(调试器是你最好的选择,因为加密器在应用程序使用字符串之前注入解密代码)。
使用Reflector和ILDasm在已编译的程序集中查找字符串:
- 打开Reflector并找到您正在调查的成员/方法
- 将语言从c#更改为IL(以便查看ILDASM将显示什么)
- 验证字符串仍然没有正确显示
-
获取指令旁边的行标签(例如:L_0060:)
-
在ILDasm中打开程序集,找到您正在研究的方法
- 从收集器中找到指令标签(应该是与IL_0060相同的一行:)
- 如果这里的字符串仍然不正确,则该字符串已被加密
要验证程序集中存储的字符串,可以执行以下操作:
- 在ILDasm中,关闭显示 方法IL的对话框
- 进入"视图"菜单并检查"显示令牌"
- 在ILDASM中再次打开该方法,这次当您找到您的代码行时,它应该在它之后有一个令牌,如/* 70002C92 */(当然您的数字将不同),但这是字符串位于程序集的用户字符串元数据堆中的位置。
- 转到View -> Meta Info并检查Raw:Heaps
- 转到视图->元信息和显示!
- 在这个新的对话框中,进入查找菜单,把你的令牌放在那里,然后点击查找
这将带您到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个终止符).
使用你的调试器或任何你必须显示那些地址的内存(使用任何实际在你当前的程序反汇编),看看那里有什么。探索!