我正在寻找一些关于使用原始-buf网络混淆(Dotfuscator)时发生了什么的指导。该项目的一半是一个DLL,另一半是其他地方的EXE,使用proto-buf NET,他们完美地交换数据。直到我混淆了DLL。原始buf序列化与混淆
在这一点上,P-BN失败时不会引发异常,根据我所处理的内容不同,返回0长度的字节数组或缩短的数组。这个类很简单(VB):
<ProtoContract(Name:="DMailer")> _
Friend Class DMailer
Private _Lic As Cert
Private _Sys As Sys
Private _LList As List(Of LItem)
..
..
End Class
有3个道具都用ProtoMember装饰来获取/设置组成类对象。为简洁起见剪断。
同样,它工作得很好,直到我混淆了DLL。然后,Dotfuscator将其中的每一个重命名为null,显然是因为它们都是Friend,而这似乎阻止了原始buff。如果我免除重命名类(只是类名,而不是道具/成员),它似乎再次起作用。有意义的是,P-BN只能够对具有合适名称的对象进行操作,但当被要求序列化一个空命名对象时,它看起来像是一个异常。另一方面,PB-N的许多魅力应该是序列化的独立的 .NET属性的工作从属性 - 至少据我了解。然而在这种情况下,它似乎只适用于名称类。我尝试使用上面显示的名称限定符或参数,无济于事 - 它显然没有做我认为可能的事情。
所以,我很好奇,如果:
一)......我已经基本推测问题正确
B)...有一些其他的属性或标志,可能有助于序列化 空命名对象
c)...如果有任何其他见解有帮助。
如果我免除Dotfuscator重命名中的所有3或4个类(实际上还没有实现LList,离开DMailer,Cert和Sys),DLL似乎再次工作 - 至少输出是正确的大小。我可以忍受,尽管模糊的名字会更好:Dotfuscator(CE)会豁免它们或将名称设置为Null - 我似乎找不到一种方法来强制它们被重命名。
我不考虑重新命名3或4类,我正在考虑的一个选择是简单地将字符串数组或Base64字符串存储在Certa和Sys的Serializer输出中,而不是类。然后让接收器单独反序列化每个对象。能够解压一件东西,并让你的玩具就像通过魔术一样,真是太好了。
(很多)TIA
谢谢。我会毫无疑问地尝试一种简化的手段来重现,现在我想尝试一下你的其他建议。对于那些在这里打主场比赛是模型创建的VB版本:'进口ProtoBuf.Meta 进口[此处插入您的DLL名称} 模块模块1 子的Main() 昏暗的模型作为对象模型 = RuntimeTypeModel。创建 model.add(的GetType(DMailer),真) '根据需要添加其他类型的 model.Compile( “MailSerializer”, “MailSerializer.dll”) 结束Sub' ......好吧,我不知道怎么代码标签在快速回复中工作 – Plutonix
@Plutonix我为我的示例使用了C#,纯粹是为了我自己的简单;如果我试图用VB编写它,我可能会做出微妙但很难发现的错误,因为我相信您可以轻松阅读C#并转换为VB。该库并不关心语言,显然; p –
静态DLL并不真正起作用:为了制作DLL,您需要公开所有涉及的类型,以便它们可以获取它们。但是,然后在运行时它会窒息,除非你免除所有这些类型的混淆,否则你会得到'无法从程序集中加载类型'xxx'对于任何相关的类,枚举等。我从消息中假设他们将不得不保持公开未混淆(不仅仅是为了构建静态DLL),这使我们比以前更糟糕。尽管感谢这个想法! – Plutonix