博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Database2Sharp混淆处理之经验分享(国庆专辑,祝福我们的祖国)
阅读量:5939 次
发布时间:2019-06-19

本文共 2025 字,大约阅读时间需要 6 分钟。

在处理
Database2Sharp混淆的时候,经常会出现一些莫名奇妙的错误,而没有混淆的程序是正常的,开始基本上定位在反射方面的原因,因为反射经过混淆的程序集,可能会出现问题。
由于我是使用dotfuscator来进行混淆的,正常混淆很多没有使用反射操作的程序,一般都是没有问题的,因此偶尔出现问题的时候,就晚上找找看看有没有这方面的介绍文章。
看到一篇文章介绍了这方面的原因:
虽然是介绍了了
dotfuscator的原理知识,但是作者把由于dotfuscator导致应用反射操作出现的问题,阐述的还是比较清楚了,按照其操作,果然解决了原来在dotfuscator出现的问题。
Dotfuscator里面是可以设置将哪些符号改名的。默认情况下,它会将assembly里面的所有符号都改名,你可以在Dotfuscator的
"
Rename
"
选项卡处设定你所想要禁止Rename的符号,具体使用方法请参考Dotfuscator的帮助文档。
    如果你使用默认设置Rename所有的符号,这会导致外面想要使用此assembly的代码出问题,可以证明如下:
我的工程里面有一个公有的方法
public
 
void
 testmethod()
{
 MessageBox.Show(
"
testmethod
"
);
}
将其生成的assembly使用Dotfuscator改变后。如果你使用以下Reflection代码调用原来assembly里面的testmethod方法,你将会成功,但是如果调用混淆后的assembly,你将会得到异常
还有这段是说明如何解决问题的
在混淆前,你的Assembly将会执行成功。在混淆后(注意,使用默认设置,将public的方法也混淆掉),你点击Button1你将会得到运行时的UnhandledException,内部就是System.ArgumentNullException: Value cannot be 
null
.
这个证明代码中的
"
reflectiontest.Form1
"
"
testmethod
"
并没有被混淆掉。
对于在VS.net IDE里面添加对这个Assembly的引用,它基本跟Reflection没有什么区别,只不过一个是在运行时动态绑定类型信息和调用,而另一个是在设计时就从Assembly里面调用提取了类型信息。Assembly的类型信息是存放在Metadata里面的,这两种方式都需要提取Metadata的信息,所以在IDE里面添加公有类名,命名空间名被混淆过的Assembly是会失败的,你可以将一个默认混淆过的Assembly添加到Toolbar中试试。但是,你可以控制Dotfuscator保留所有的公有符号不混淆,这样你的Assembly就可以正常添加,而不会出问题。具体,你可以这样保留不混淆Public符号:
在Rename选项卡里面点击
"
Add Type
"
,然后Name写上
"
*
"
,然后在右边的Spec列表框中选择
"
+Public
"
由于我使用了反射构建不同的数据库加载类,如SqlServer、Oracle、MySql的,因此要根据不同加载不同的程序集信息,但是很奇怪,SqlServer的类加载成功,可以列出数据库信息,而Oracle的类确加载不了,获取不到所需的信息。
如混淆,那么列出Oracle数据库的时候,是一片空白,跟踪代码,发现反射构建程序对象的时候有问题。
我的反射加载代码如下:
            
try
            {
                DatabaseSetting[] settings 
=
 DatabaseConfig.ReadSettings();
                
foreach
 (DatabaseSetting db 
in
 settings)
                {
                    
if
 (databaseType 
==
 db.DatabaseType)
                    {
                        objType 
=
 Assembly.Load(db.AssemblyName).CreateInstance(db.AssemblyType);
                        listDataInstance 
=
 objType 
as
 IListData;
                        
if
 (listDataInstance 
!=
 
null
)
                        {
                            listDataInstance.ConnectString 
=
 db.ConnectString;
                        }
                        
break
;
                    }
                }
            }
            
catch
 (FileNotFoundException nfe)
            {
                log.Error(nfe);
                
throw
;
            }
根据上面作者提到的操作,在Rename选项卡里面点击"Add Type",然后Name写上"*",然后在右边的Spec列表框中选择"+Public"
测试,果然OK,问题解决了,获取到的数据库信息如下所示。
本文转自博客园伍华聪的博客,原文链接:,如需转载请自行联系原博主。
你可能感兴趣的文章
chgrp命令
查看>>
Java集合框架GS Collections具体解释
查看>>
洛谷 P2486 BZOJ 2243 [SDOI2011]染色
查看>>
linux 笔记本的温度提示
查看>>
数值积分中的辛普森方法及其误差估计
查看>>
Web service (一) 原理和项目开发实战
查看>>
跑带宽度多少合适_跑步机选购跑带要多宽,你的身体早就告诉你了
查看>>
广平县北方计算机第一届PS设计大赛
查看>>
深入理解Java的接口和抽象类
查看>>
java与xml
查看>>
Javascript异步数据的同步处理方法
查看>>
iis6 zencart1.39 伪静态规则
查看>>
SQL Server代理(3/12):代理警报和操作员
查看>>
基于事件驱动的DDD领域驱动设计框架分享(附源代码)
查看>>
Linux备份ifcfg-eth0文件导致的网络故障问题
查看>>
2018年尾总结——稳中成长
查看>>
JFreeChart开发_用JFreeChart增强JSP报表的用户体验
查看>>
度量时间差
查看>>
apache prefork模式优化错误
查看>>
jmeter高级用法例子,如何扩展自定义函数
查看>>