本文告诉大家一个特殊的做法,可以修改一个字符串常量
本文告诉大家一个特殊的做法,可以修改一个字符串常量
我们来写一个简单的程序,把一个常量字符串输出
private const string str = "lindexi";
static void Main(string[] args)
{
Foo();
Console.WriteLine(str);
}
其中的 Foo 是其他的函数,大家可以猜到输出是 lindexi ,但是,实际上把Foo调用函数添加之后,输出是 Lindexi 被大写了。那么这时 Foo 做了什么?
Foo 做的就是
public static unsafe void Foo()
{
fixed (char* ptr = str)
{
*ptr = char.ToUpper(*ptr);
}
}
虽然出现了问题,但是找到问题很简单,如果这时需要做一个安全有关的。让别人看到源代码也不知道怎么使用,那么就可以使用这个科技,下面就是显示技术的时候
我把 Foo 做一些修改,把 str 变量去掉,这样大家就难以通过搜索变量引用找到了这个函数。但是我在其他的某个地方使用了这个常量字符串,于是就把上面的 str 修改为 "lindexi" 。大家也许会想,这是两个变量,对他做什么修改也不会对之前的 str 有什么影响。实际上,请跑一下下面的代码。
public static unsafe void Foo()
{
fixed (char* ptr = "lindexi")
{
*ptr = char.ToUpper(*ptr);
}
}