关于c#程序,使用混淆器的时候,有的朋友说,如果加密的dll里有public类,需要被外部引用的话,就不能混淆。
我搞不懂的是,既然是dll,肯定是用来被程序外部引用的啊,dll里面的类也是用来被程序引用的啊,不是被程序用来引用,dll又起何作用呢?
------解决思路----------------------
混淆后,类名发生了变化
------解决思路----------------------
如果涉及到反射,或者根据根据类名做事情,就不要混淆了,否则找不到
------解决思路----------------------
dll在开头都需要有一个“表”用来查找不同类型的加载地址。如果你自己把别人的名字都记错了,你又怎么查表呢?
------解决思路----------------------
这个朋友说法不是很准确。
当引用一个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。
------解决思路----------------------
不论是程序填写一个表给外部使用,还是自己根据一个名称来查人家的表,总之名称必须一致,不能改名。