C# 誰改了我的代碼
本文告訴大家一個特殊的做法,可以修改一個字符串常量
我們來寫一個簡單的程序,把一個常量字符串輸出
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 ),不得用於商業目的,基於本文修改後的作品務必以相同的許可發布。如有任何疑問,請與我聯系。
C# 誰改了我的代碼