title author date CreateTime categories
C# 谁改了我的代码
lindexi
2018-3-31 21:15:3 +0800
2018-2-13 17:23:3 +0800
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 ,因为编译器把相同的常量视为同一个地址,这样修改一个地方的常量就可以修改其他地方的。所以可以写的是一个常量,实际上这个常量在另一个地方被修改。

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

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

mmons.org/licenses/by-nc-sa/4.0/">知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

2018-3-31-C#-谁改了我的代码的更多相关文章

  1. 猪懂傻改之《powershell 代码规范》

    猪懂傻改之<powershell 代码规范> 脚本程序员或许都经历过这样的场景:接手别人的代码时,因为没有注释,变量名五花八门,模块之间逻辑关系如麻,弄得满头雾水,一脸茫然,痛定思痛之后不 ...

  2. C# 谁改了我的代码

    本文告诉大家一个特殊的做法,可以修改一个字符串常量 我们来写一个简单的程序,把一个常量字符串输出 private const string str = "lindexi"; sta ...

  3. C# 谁改了我的代码 使用 Resharper 快速做适配器

    C# 谁改了我的代码   本文告诉大家一个特殊的做法,可以修改一个字符串常量 我们来写一个简单的程序,把一个常量字符串输出 private const string str = "linde ...

  4. 2018/03/31 每日一个Linux命令 之 date

    date 命令主要用于查看和修改时间和时区 -- 这里主要学习基本的查看和设置时间和时区的方法. 直接显示日期 date '+%D' 效果 vagrant@hong:~$ date '+%D' 03/ ...

  5. 2018.12.31 bzoj3771: Triple(生成函数+fft+容斥原理)

    传送门 生成函数经典题. 题意简述:给出nnn个数,可以从中选1/2/31/2/31/2/3个,问所有可能的和对应的方案数. 思路: 令A(x),B(x),C(x)A(x),B(x),C(x)A(x) ...

  6. [文章汇总]ASP.NET Core框架揭秘[最近更新:2018/10/31]

    之前一段时间都在个人公众号账号“大内老A”发布关于ASP.NET Core的系列文章,很多人留言希望能够同步到这里,所以在这里 对这些文章做一个汇总,以便于PC端阅读.如果说微软官方文档主要关于ASP ...

  7. it's time to change myself now (2018.10.31)

    自16年从新屋熊职校毕业,入职深圳某厂从事云存储两年半了.两年半的时间很快,快的感觉一生都会飞快,两年多一直很忙,忙的几乎忘了自己是否正向改变过. 正向改变,or 积极改变,今年十一回家,与几个好友小 ...

  8. Unity进阶----AssetBundle_02(加载依赖关系及网络资源)(2018/10/31)

    网络资源加载: string path ="file://"+ Application.streamingAssetsPath + "\\windows\\123&quo ...

  9. 2018.12.31 bzoj4001: [TJOI2015]概率论(生成函数)

    传送门 生成函数好题. 题意简述:求nnn个点的树的叶子数期望值. 思路: 考虑fnf_nfn​表示nnn个节点的树的数量. 所以有递推式f0=1,fn=∑i=0n−1fifn−1−i(n>0) ...

随机推荐

  1. php表单传值--GET和POST

    一.       传值 1.    传值/接收方法: 1)        GET(5种方式!) a)       表单Form: method = ‘get’   GET接收数据方式: b)      ...

  2. 使用HashMap编写一程序实现存储某班级学生信息

    1. 使用HashMap编写一程序实现存储某班级学生信息,要求在屏幕上打印如下列表 学号   姓名   性别   年龄 001    张三   男      23 002    李四   男      ...

  3. 用dreamweaver查找页面位置

    复制页面的一段代码,然后用Dreamweaver在整个项目中查找代码. 找不到的原因:1.查找的内容是从数据库中读出来的.连数据库文件一起查便知. 2.查找的代码是某个函数生成的.

  4. nodeJs学习-11 multer中间件,解析post文件,上传文件

    const express=require('express'); const bodyParser=require('body-parser'); const multer=require('mul ...

  5. 猜年龄v2.0

    ''' 用户登录,只有三次机会 给定年龄,用户可以猜三次年龄 年龄猜对,让用户选择两次奖励,输入无效字符,让其选择要不要礼物 用户选择两次奖励后可以退出,选择第一次后提示还有一次 ''' #基本信息定 ...

  6. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十三章:计算着色器(The Compute Shader)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十三章:计算着色器(The Compute Shader) 代码工程 ...

  7. [已转移]JavaScript事件---DOM事件流

    该文章已转移到博客:https://cynthia0329.github.io/ 事件发生时会在元素节点与根节点之间按照特定的顺序传播,路径所经过的所有节点都会收到该事件 这个传播过程即DOM事件流. ...

  8. [转]embedding technic:从SNE到t-SNE再到LargeVis

    http://bindog.github.io/blog/2016/06/04/from-sne-to-tsne-to-largevis/#top

  9. 云原生生态周报 Vol. 2

    摘要: Cloud Native Weekly China Vol. 2 业界要闻 Kubernetes External Secrets 近日,世界上最大的域名托管公司 Godaddy公司,正式宣布 ...

  10. @codeforces - 1214H@ Tiles Placement

    目录 @description@ @solution@ @part - 1@ @part - 2@ @accepted code@ @details@ @description@ 给定一个 n 点的树 ...