天天看點

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# 誰改了我的代碼 我自己搭建的部落格會不斷更新

C# 誰改了我的代碼

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

部落格園部落格隻做備份,部落格釋出就不再更新,如果想看最新部落格,請到 https://blog.lindexi.com/

C# 誰改了我的代碼

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

c#