当前位置: 代码迷 >> C# >> 关于混淆器的1点疑惑
  详细解决方案

关于混淆器的1点疑惑

热度:85   发布时间:2016-05-05 03:22:03.0
关于混淆器的一点疑惑
本帖最后由 df3454g 于 2015-06-20 06:40:55 编辑
关于c#程序,使用混淆器的时候,有的朋友说,如果加密的dll里有public类,需要被外部引用的话,就不能混淆。
我搞不懂的是,既然是dll,肯定是用来被程序外部引用的啊,dll里面的类也是用来被程序引用的啊,不是被程序用来引用,dll又起何作用呢?
------解决思路----------------------
混淆后,类名发生了变化
------解决思路----------------------
如果涉及到反射,或者根据根据类名做事情,就不要混淆了,否则找不到
------解决思路----------------------
引用:
关于c#程序,使用混淆器的时候,有的朋友说,如果加密的dll里有public类,需要被外部引用的话,就不能混淆。
我搞不懂的是,既然是dll,肯定是用来被程序外部引用的啊,dll里面的类也是用来被程序引用的啊,不是被程序用来引用,dll又起何作用呢?


dll在开头都需要有一个“表”用来查找不同类型的加载地址。如果你自己把别人的名字都记错了,你又怎么查表呢?
------解决思路----------------------
引用:
...有的朋友说,如果加密的dll里有public类,需要被外部引用的话,就不能混淆。


这个朋友说法不是很准确。

当引用一个dll的时候,我们只能使用它的public类,public方法(包括继承中使用proteced方法),public成员等。
因此,只要引用者可能用到的类和方法的名字(方法签名)没有改变,dll的其他改变(混淆等)对引用方就没有影响。

因此,可以混淆dll的internal类,可以混淆public类中的私有函数,还可以混淆public类public方法的实现(加一些不影响实际逻辑的判断,跳转等等)。

public class A  // 公共类名字A不改
{
   public string MySpecialMethod(string para) // 公共方法的签名不改
   {
        <>A.C _k = B.C.F();  // 函数实现可以混淆
        _k.CG();
        if (B<F>())
        {
            F.T.CC(_k);
        }
        return  _KKZZ(_k.PU(), para);
   }
   private void _KKZZ(string s1, string s2)  // 私有方法名字等可以更改
   {
      //...
   }
}


还有另外一种情况是对程序和dll整批混淆,这种情况下,dll的public类的名字等等也能被混淆。
这是因为混淆器同时改写了应用程序和dll。

------解决思路----------------------
不论是程序填写一个表给外部使用,还是自己根据一个名称来查人家的表,总之名称必须一致,不能改名。
  相关解决方案