本文告訴大家一個特殊的做法,可以修改一個字元串常量
我們來寫一個簡單的程式,把一個常量字元串輸出
private const string str = "lindexi";
static void Main(string[] args)
{
Foo();
Console.WriteLine(str);
}
其中的 Foo 是其他的函數,大家可以猜到輸出是 lindexi ,但是,實際上把Foo調用函數添加之後,輸出是 Lindexi 被大寫了。那麼這時 Foo 做了什麼?
Foo 做的就是
C# 字元串首字元大寫
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);
}
}
這時輸出 str 結果是 Lindexi ,因為編譯器把相同的常量視為同一個位址,這樣修改一個地方的常量就可以修改其他地方的。是以可以寫的是一個常量,實際上這個常量在另一個地方被修改。
如果我代碼很多,在某個地方使用了反射,反射一個方法,這個方法是修改一個常量的值,常量是寫自己寫的,沒有引用。這時可以發現代碼執行就可以更改之前的字元串值。實際上不隻字元串,其它的常量也可以修改。多使用這些技術,可以讓看代碼的人成為強大的殺人狂。
這個方法是不推薦在一般情況使用,因為誰都不能說沒有其他地方使用一樣的字元串。
歡迎大家通路我搭建的部落格 C# 誰改了我的代碼 我自己搭建的部落格會不斷更新

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協定進行許可。歡迎轉載、使用、重新釋出,但務必保留文章署名林德熙(包含連結:http://blog.csdn.net/lindexi_gd ),不得用于商業目的,基于本文修改後的作品務必以相同的許可釋出。如有任何疑問,請與我聯系。
部落格園部落格隻做備份,部落格釋出就不再更新,如果想看最新部落格,請到 https://blog.lindexi.com/

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協定進行許可。歡迎轉載、使用、重新釋出,但務必保留文章署名[林德熙](http://blog.csdn.net/lindexi_gd)(包含連結:http://blog.csdn.net/lindexi_gd ),不得用于商業目的,基于本文修改後的作品務必以相同的許可釋出。如有任何疑問,請與我[聯系](mailto:[email protected])。