由浅至深,谈谈.NET混淆原理 (二) 最简单的混淆
上面,我们分析了一段IL方法,相信大家对什么是IL有一个认识了,如果想流畅的阅读IL,那么还需要把官方的资料读懂,记牢!
今天我们来讲讲混淆基础。
什么是混淆,故名思意,就是混杂,使界限不分明。这个词相当妙,特别是用在计算机界。
我们知道NET程序集中有一个重要特性叫做MetaData(元数据),它是NET的特性,它记录了相关程序集的一切信息,正因为这样的特性,NET程序集才有了跨平台的可能,才可以在网上传送运行,才不会出现DLL HELL。但同时,由于它记录了所有的信息,使得程序集中的信息可以完全还原至初始状态,使得编译过后的程序集,依然拥有良好的“可读性”。在某些特殊的情况下,这是一件很糟的事情。
对此,我们该怎么做?我们的知识产权无法保障!
正在这样的需求之下,混淆器横空出世。它对MetaData的某些相关信息进行了处理,达到了混淆的作用,在某种意义上讲,它的确能起到一些作用。
最简单的混淆是名称混淆,即将 命名空间名、类名、方法名、字段名等统统换成特殊符号或其它符号,目的就是让你不能与以前的名称建立关联。达到把你弄糊涂的目地。
比方如下代码所示:








这样的代码在程序编译后,名称完全被保留,但如果经过名称反混淆以后,它将变成这样:






这样,如果你是Cracker,你想破解这个程序,当你看到Register的时候,你就差不多知道这是你要的目标了,但你只看到了 a 你知道是什么吗?所以,在某此情况下,混淆还是有一定作用的。
混淆名称是一件必要的工作。
我们现在深入的谈谈它的优点:
1. 名称混淆,如果使用短名称及不可见字符,将会缩小程序集的大小
2. 名称混淆,使你的程序咋一看上去,更加难以理解。为什么用“咋”这个词?因为名称混淆也只能骗骗门外汉和小孩
那么它有什么缺点呢?
3. 名称混淆的缺点并不多,只有一个,而且非常致命,这就是有时候,当修改了类名之后不能执行的问题。
一般来说,这种情况在DLL身上发生的更多,但在EXE身上也经常发生。
因为DLL的某些Public方法是对外的结口,在程序开发和调试的时候使用的源名称,当混淆以后,天知道把这些方法改成了什么名称,所以调用肯定报错。处理办法:不混淆对外提供的Public方法
EXE和DLL还有一个共同的容易出错的地方就是资源,混淆器也可以混淆资源名称,这样,就存在的同样的问题――“无法找到资源而报错(动态Load资源的时候)”,处理方法:不混淆程序内部调用的东西。
不知道反射可不可以混淆,理论上。。。应该可以的,不过,好象也听过反射混淆后不能运行的案例。
好,总结一下,最简单的混淆就是名称混淆。你也可以自己在程序开发的过程中就这样做,不过。。。很可惜,它起不了多大作用。它的强度远不足以挡住想得到你源代码或侵害你知道产权的人。
那么有没有更好的办法呢?当然有,就是强度更高的流程混淆,感觉和移形换位、乾坤大挪移有点象。为什么这么说?别急,让我喝口水,接着讲。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述