Database2Sharp混淆处理之经验分享(国庆专辑,祝福我们的祖国)

简介:
在处理 Database2Sharp混淆的时候,经常会出现一些莫名奇妙的错误,而没有混淆的程序是正常的,开始基本上定位在反射方面的原因,因为反射经过混淆的程序集,可能会出现问题。
由于我是使用dotfuscator来进行混淆的,正常混淆很多没有使用反射操作的程序,一般都是没有问题的,因此偶尔出现问题的时候,就晚上找找看看有没有这方面的介绍文章。
看到一篇文章介绍了这方面的原因:http://www.cnblogs.com/jeffreytan/archive/2004/11/11/62724.html
虽然是介绍了了 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,问题解决了,获取到的数据库信息如下所示。

本文转自博客园伍华聪的博客,原文链接:Database2Sharp混淆处理之经验分享(国庆专辑,祝福我们的祖国),如需转载请自行联系原博主。

目录
相关文章
|
7月前
|
SQL Oracle 关系型数据库
WARNING: Too Many Parse Errors With error=911 When Running a JDBC Application Connected to an Oracle 19c database
WARNING: Too Many Parse Errors With error=911 When Running a JDBC Application Connected to an Oracle 19c database (
97 2
|
7月前
|
Oracle 关系型数据库
19c 开启Oracle Database Vault
19c 开启Oracle Database Vault
170 1
|
7月前
|
SQL Oracle 关系型数据库
Connect to Autonomous Database Using Oracle Database Tools
Connect to Autonomous Database Using Oracle Database Tools
65 1
|
6月前
|
Oracle 关系型数据库 Linux
Requirements for Installing Oracle Database/Client 19c on OL8 or RHEL8 64-bit (x86-64) (Doc ID 2668780.1)
Requirements for Installing Oracle Database/Client 19c on OL8 or RHEL8 64-bit (x86-64) (Doc ID 2668780.1)
56 0
|
7月前
|
人工智能 Oracle 关系型数据库
一篇文章弄懂Oracle和PostgreSQL的Database Link
一篇文章弄懂Oracle和PostgreSQL的Database Link
|
7月前
|
SQL Oracle 安全
Oracle Database Vault Access Control Components
Oracle Database Vault Access Control Components
58 0
|
7月前
|
Oracle 安全 关系型数据库
What Is Oracle Database Vault?
The Oracle Database Vault security controls protect application data from unauthorized access, and helps you to comply with privacy and regulatory requirements. You can deploy controls to block privileged account access to application data and control sensitive operations inside the database using
43 0
|
7月前
|
Oracle 关系型数据库 Linux
服务器Centos7 静默安装Oracle Database 12.2
服务器Centos7 静默安装Oracle Database 12.2
291 0
|
7月前
|
Oracle 关系型数据库 数据库
windows Oracle Database 19c 卸载教程
打开任务管理器 ctrl+Shift+Esc可以快速打开任务管理器,找到oracle所有服务然后停止。 停止数据库服务 在开始卸载之前,确保数据库服务已经停止。你可以使用以下命令停止数据库服务: net stop OracleServiceORCL Universal Installer 卸载Oracle数据库程序 一般情况运行Oracle自带的卸载程序,如使用Universal Installer 工具卸载。 点击开始菜单找到Oracle,然后点击Oracle安装产品,再点击Universal Installer。 点击之后稍等一会然后会进入进入下图界面,点击卸载产品。 选中要删除的Orac
682 1

热门文章

最新文章