zoukankan      html  css  js  c++  java
  • 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,问题解决了,获取到的数据库信息如下所示。


    希望对也使用Dotfuscator来混淆程序,碰到相同问题的朋友有帮助。

    主要研究技术:代码生成工具、会员管理系统、客户关系管理软件、病人资料管理软件、Visio二次开发、酒店管理系统、仓库管理系统等共享软件开发
    专注于Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    MySQL常见错误解决方案
    mybatis连接MySQL8出现的问题
    mybatis逆向工程出现的问题
    linux学习——基础命令
    java excel导入oracle数据库
    关于layer弹框点击关闭按钮的问题
    java was started but return exit code=-805306369
    设计模式入门学习笔记----装饰者模式
    设计模式入门学习笔记----观察者模式
    设计模式入门学习笔记----策略模式
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/1576775.html
Copyright © 2011-2022 走看看