我正在尝试修补字符串。所以现在我正在尝试LDSTR用LDSTR“mystring”替换指令;然而,我一直没有成功。组装LDSTR操作码后,我不太明白后面是什么:指向字符串或原始字符串字节的指针地址?
ldstr "Test";
stloc.0
ldloc.0
ret
这就是我正在努力实现的目标。谢谢!
我正在尝试修补字符串。所以现在我正在尝试LDSTR用LDSTR“mystring”替换指令;然而,我一直没有成功。组装LDSTR操作码后,我不太明白后面是什么:指向字符串或原始字符串字节的指针地址?
ldstr "Test";
stloc.0
ldloc.0
ret
这就是我正在努力实现的目标。谢谢!
操作码包含一个称为 的数字mdToken。用户定义的字符串位于称为 的存储流中#US。您可以在检查文件部分时找到它们。
Simon Coop 撰写了一系列关于 .NET 程序集的文章 - .NET 程序集剖析,应该解释更多 .NET 程序集的内部结构。
我想在 Pawel 出色而简洁的答案之上添加几条评论。
首先,IDA 不容易启用编辑可执行文件,因此您应该为该任务找到另一个更合适的工具。在替换常量字符串的情况下,任何像样的十六进制编辑器都可以解决问题。
其次,请让我一一回顾不同的说明:
ldstr“测试”
该ldstr指令将第一个参数中的字符串对象加载到堆栈顶部。
stloc.0
该stloc指令根据其索引从堆栈中弹出单个项目并将其存储在寄存器中。在这种情况下,注册索引 0。
ldloc.0
类似地,ldloc根据堆栈顶部提供的索引存储来自寄存器的值。在这种情况下,再次使用索引为 0 的寄存器。
退
该指令返回到当前函数的调用者。
作为基于堆栈的指令集(与基于寄存器的指令集相反,例如 x86、arm、powerpc 等),堆栈经常用于在基于寄存器的指令集的情况下传递数据将启用寄存器使用。这并不是说您不能在其中一个或另一个中为大多数功能使用寄存器或堆栈,而只是指令集使使用寄存器堆栈变得更加原生和自然。
最后一段对于我们理解所提供函数的性质很重要,它只是返回所提供的字符串。作为基于堆栈的指令集,CIL 的调用约定规定变量在堆栈上返回(而不是指定的寄存器)。有趣的是,这因此意味着stloc.0和ldloc.0可以简单地优化掉。