.Net 中的名称混淆与名称反混淆

提到 .Net 的保护,首推就是混淆保护了,而名称混淆基本上是所有混淆保护工具都具有的功能。
可以说不支持名称混淆的工具称不上混淆保护工具。
对于混淆保护,大家有一个认识,就是 混淆是一个不可逆的过程。而加密保护是一个可逆的过程。

名称混淆真的完全不可逆吗?答案是否定的。
名称混淆有一部分是可以精确还原的。

.Net的名称混淆在 剖析DotNet的名称混淆保护技术 中有详细介绍。今回注意介绍名称混淆中可逆的部分,以及还原的方法。

一. 属性名称 以及 getter 和 setter 函数。
少部分工具有这个问题。

按照正常规则 属性名称为Name,则 getter函数为 get_Name, setter 函数为 set_Name。
有些工具在混淆是处理不完整。只处理了属性名,没有处理 getter,setter函数名。
比较常见的是 只混淆的 getter和setter函数名,而没有混淆属性名。
这三个只要知其中一个就能推出另外两个。

对于属性还能在一定层度上实现对私有成员变量名的反混淆。
一般属性是公共的,大部分混淆器对公共成员是不混淆的。
如果这个属性有一个私有成员变量和它对应,实际上根据编程习惯,大部分属性都是这样的。
我们能将这个私有成员变量修改得 readable。

二、事件名称 以及 add , remove, fire 函数。
这个和 属性名称以及其setter,getter函数一样。

三、虚函数,接口实现函数
大部分工具对于基类虚函数和接口函数都没有混淆
而只混淆了继承类、实现类中的函数名称。
如:某个类 overide了 ToString 这个函数,然后这个函数名称被混淆了,
通过override 属性我们就能知道它原始的函数名称。

这里也包含了接口中继承的属性,即可以根据接口中的属性名称还原实现类中的属性名称。

四、Form,UserControl等类,窗体设计器的约定规则
根据规则我们知道 有一个必要的设计器变量 private System.ComponentModel.IContainer components 。
两个函数 protected override void Dispose(bool disposing)
和 private void InitializeComponent()。

一般我们很容易就能找到 那个变量和 Dispose函数。
InitializeComponent 我们一般可以从 构造函数中去找,它一般被构造函数调用。

这三个名称还原之后,我们就从 InitializeComponent 的函数体去分析。
根据规则,我们知道 Control.Name 就是 其变量的名称。
Control.Name 是在代码运行时赋值的。根据这个规则,我们能完全还原 Control 的
变量名称。

然后对于控件的事件处理函数,也是在 代码运行时赋值的。

如 button1 的 click 事件处理函数,可以还原为 button1_Click 。
设计器默认的名称就是这种规则。当然,不能保证和原始程序的名称一样。
虽不能100%还原事件处理函数的名称,但已经readable了。

另外附一个工具:
元数据名称编辑器

 

时间: 2024-10-24 16:47:26

.Net 中的名称混淆与名称反混淆的相关文章

SD卡中常见的文件夹名称及其作用

SD卡中常见的文件夹名称及其作用如下: 系统数据类--系统文件存储相关文件夹 1..android_secure:官方app2sd的产物,存储了相关的软件使用认证验证,删除之后SD卡中的软件将无法使用. 2.Android:存放重要的程序数据,比如google:map的地图缓存,误删掉后地图还需重新下载. 3.backups:包含重要的备份文件,比如联系人导出到SD卡会导入到此文件夹. 4.bugtogo:系统出现问题的时候会形成一些报告文件,存放在此文件夹. 5.data:缓存数据文件夹,与A

代码-如何修改数据库中某一个字段的名称

问题描述 如何修改数据库中某一个字段的名称 我是新手 不会用在c#的wpf里 用代码修改 有没有大神给个代码 解决方案 修改数据库里字段的名称,和c#无关,需要用sql来实现 修改列名 ALTER TABLE TABLE_NAME RENAME COLUMN OLD_COLUMN_NAME TO NEW_COLUMN_NAME; 解决方案二: 修改字段就是用sql语句 sqlserver中有sp_rename存储过程http://www.cnblogs.com/ringnet/archive/2

sql2005-为什么DreaweaverCS4中链接数据库是数据源名称不能选择

问题描述 为什么DreaweaverCS4中链接数据库是数据源名称不能选择 想用DreaweaverCS4链接SQL2005IIS和数据源(ODBC)都已经设置好了,但是在DreaweaverCS4链接数据库是,数据源名称下来菜单什么也没有,选择"定义"之后也没反应,求帮助,谢谢啦 解决方案 就是这样

如何修改cxf默认生成wsdl中的wsdl:input message名称

问题描述 如何修改cxf默认生成wsdl中的wsdl:input message名称 最近在使用cxf2.6.10发布 webservice时,发现:cxf在对出入参数据类型进行描述时,默认入参为方法名,出参为方法名+Response.但由于项目对wsdl的描述有规定:出入参的类型描述名必须为方法名+Request/Response-- 所以想问问有哪位修改过cxf的wsdl生成规则,并对发布的wsdl调用通过. 我试过修改DefaultServiceConfiguration类的getInpu

java 线程池中如何自定义每个线程名称

问题描述 java 线程池中如何自定义每个线程名称 **java 线程池中如何自定义每个线程名称 java 线程池中如何自定义每个线程名称 ** 解决方案 补充下,线程池的创建线程池对象时,有一个参数是ThreadFactory类型,如果不传递,默认用的是DefaultFactory,我们可以自定义一个ThreadFactory然后作为参数传到进去,这个类里面就可以自定义线程池中创建的线程的名称.api: public ThreadPoolExecutor(int corePoolSize,in

关于邮件收件人选择框地址栏中“按名称列出”“NOTES名称层次”“公司层次”“按语言分类”对应的“names.nsf”中视图是那几个,另外是否可以更改。

问题描述 关于邮件收件人选择框地址栏中"按名称列出""NOTES名称层次""公司层次""按语言分类"对应的"names.nsf"中视图是那几个,另外是否可以更改.谢谢. 解决方案 解决方案二:邮件中To的程序@Command([MailAddress];"EnterSendTo";"EnterCopyTo";"EnterBlindCopyTo")@

finereport中导出excel如何自定义名称

问题描述 finereport中导出excel如何自定义名称 finereport中导出excel如何自定义名称,例如保存的名称就是我表单上 单号 的字段,现在都是默认的服务器名.xls,导出很多的时候全是重名(x)的形式.

android-从 OnCheckedChangeListener 的 CompoundButton中获取CheckBox key的名称

问题描述 从 OnCheckedChangeListener 的 CompoundButton中获取CheckBox key的名称 我使用接口 OnCheckedChangeListener,当点击 checbox 时 onCheckedChanged 方法被摧毁. 程序中有 10 个checkboxes.如何获取 CompoundButton 中点击的checkbox的名称?我觉得 CompoundButton 有所有需要的值,但是不知道怎么获取这个值. 例如: <CheckBox andro

.net反混淆脱壳工具de4dot的使用

de4dot是一个开源的.net反混淆脱壳工具,是用C#编写的,介绍一下它的使用方法 首先 pushd 到de4dot.exe所在文件夹,然后调用 de4dot.exe  路径+dll名称 如下图 Detected Unknown Obfuscator 说明侦测不到这个程序集是用什么方式混淆的,但是de4dot依然会把反混淆的程序集重新生成一个新的程序集. 当然,生成的程序集还是没能反混淆. Dundas作为一个给专业程序员使用的控件,当然没那么容易破解,不过这里又多了解了一种反混淆脱壳工具,也