C#混淆心得

C#混淆心得

近期遇到混淆C#代码的需求,在网上找了很多办法,在此记录一下。

混淆的本质就是让代码变丑,让别人看不懂。

为什么要混淆:

1.保护核心代码

可以在一定程度上避免别人偷代码,从而保护重要的部分(当然对大佬没用)。但这对于C#来说是很难做到的,毕竟C#的特性就很公开,比如C#可以通过反射获取数据类型,这是因为有元数据的存在。C#的程序集很容易被反编译,就算混淆了代码,编译成CIL之后都是一样能看清的,因此如果想保护C#代码,混淆是没有用的,只能通过native code的方式,将核心代码放到本地,这样才能真正做到保护,比如服务器就是如此。

但是为什么我还需要混淆C#代码呢?我以前用lua写过mod,当时就遇到需要混淆lua的需求,这是因为mod上传后人们都可以看到源代码,因为它是开源的。所以我这次混淆C#是为了避免某些能直接看到代码的人拿来做不好的事(防那种混蛋应该足够了),且对方水平很次,故对C#混淆。

混淆C#还可以通过给dll加壳的方式,但是其他程序就没法引用这个程序集了,可以给本地的服务器程序加,网上有很多第三方工具。

2.降低审核时的查重

游戏上架商店的时候需要审核,如果跟其他游戏代码相似度过高就不能通过,因此需要混淆降低重复。例如,出于商业的目的,很多公司会在同一平台上架多个同一游戏,这样人们就能看到更多关于这个游戏的推广。或者上架一个测试用的游戏,在里面进行各种实验,确定效果后再更新到主游戏上,这样就不会影响到主游戏了,这种就叫马甲包。因此为了实现这种功能,就需要用到混淆。特别是苹果ios上,需要混淆oc代码。

原因主要就是上面两种,还有就是可以压缩代码文本的体积,比如开发的时候为了确保变量意图清晰可见,会用比较长的名字命名,混淆成abc这种就可以变短。

混淆常用的手段:

1.生成垃圾代码,把他们混在有用的代码里,再把有用的代码改名,这样就很难看出来那些代码是干嘛的了。

2.删除注释或者混淆注释,直接删除还是太温柔了,我试过改编码,这样中文注释就都变成乱码,效果不错,但是不方便下面的混淆。替换或删行的时候容易把代码挤进注释里,这样就会出问题。

3.修改变量名、文件名、目录名。可以使用正则表达式来匹配修改,要留意一些不能修改的字段或类型。

4.将常量用一些很长很复杂的表达式替换,比如让gpt生成一个结果是true的表达式:

((5 > 3) && (10 == 10) && (true || false) && (100 >= 100) && ("hello" != "world") && (2 * 3 == 6) && (15 % 5 == 0) && (Math.Sqrt(16) == 4) && (DateTime.Now.DayOfWeek == DayOfWeek.Thursday) && (int.Parse("50") + 50 == 100)

然后就可以把所以true都可以替换成它。同理,其他常量也可以这样混淆。

5.删除所有换行符,或者将所有空格换成换行符,效果都挺不错,但后者容易把一些不能分开的也换了,要确保能正常编译。

6.字符串加密,可以用ase加密算法对字符串进行加密,但要想办法让别人看不懂解密的方法。或其他替换字符串的方法,比如转义字符。

7.基础类型展开,比如将int替换成System.Int32,那些很长的容器类替换后的效果就很不错。也可以把所有using删除,然后所有类型写全称。

以上只是我发现的初步混淆,还可以利用C#的各种特性,等着你去发掘。

效果:

在这里插入图片描述

在这里插入图片描述

注意要在本地保存一份正常的代码,发出去的才混淆。

就先讲这么多吧。

相关推荐

  1. pyqt5与selenium混合使用心得

    2024-03-17 05:18:04       17 阅读
  2. 词法约定 - 现代 C++(心得-贰)

    2024-03-17 05:18:04       28 阅读
  3. C/C++ 容易混淆的指针声明总结

    2024-03-17 05:18:04       33 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-17 05:18:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-17 05:18:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-17 05:18:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-17 05:18:04       18 阅读

热门阅读

  1. Python列表详解

    2024-03-17 05:18:04       19 阅读
  2. 【C语言】打印1-100之间所有3的倍数的数字

    2024-03-17 05:18:04       19 阅读
  3. 使用API删除Gitlab Pipeline

    2024-03-17 05:18:04       20 阅读
  4. CSS2DObject 形成3D模型二维屏幕平面label

    2024-03-17 05:18:04       17 阅读
  5. Hive Sql获取含有特殊字符key的json数据

    2024-03-17 05:18:04       21 阅读
  6. LeetCode 395. 至少有K个重复字符的最长子串

    2024-03-17 05:18:04       15 阅读
  7. 矩阵消元-MIT

    2024-03-17 05:18:04       17 阅读
  8. C语言每日一题—魔幻矩阵

    2024-03-17 05:18:04       16 阅读