• 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 ,因为编译器把相同的常量视为同一个地址,这样修改一个地方的常量就可以修改其他地方的。所以可以写的是一个常量,实际上这个常量在另一个地方被修改。

    如果我代码很多,在某个地方使用了反射,反射一个方法,这个方法是修改一个常量的值,常量是写自己写的,没有引用。这时可以发现代码执行就可以更改之前的字符串值。实际上不只字符串,其它的常量也可以修改。多使用这些技术,可以让看代码的人成为强大的杀人狂。

    这个方法是不推荐在一般情况使用,因为谁都不能说没有其他地方使用一样的字符串。

    知识共享许可协议
    本作品采用

  • 相关阅读:
    ADO.NET基础必备之SqlDataAdapter 类
    简单的JS动画的实现 文字在页面飘动
    命名空间与程序集的简单比较
    复习ADO.NET的ExecuteReader()方法
    初学SSIS要明白的几个概念
    复习ADO.NET的ExecuteNonQuery()方法
    Spending My Time (消磨时光)
    Building a WPF Sudoku Game: Part 5 The AI Battle: Loading and Comparing AI Plugins
    Building a WPF Sudoku Game, Part 2: The Board UI and Validation
    Building a WPF Sudoku Game, Part 1: Introduction to WPF and XAML
  • 原文地址:https://www.cnblogs.com/lindexi/p/12087227.html
Copyright © 2020-2023  润新知