2011-11-29 87 views
4

我正在寻找一些关于使用原始-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

回答

2

因为有利益的几个upticks,这里是什么样子将工作:

一)反射的任何形式将能够得到的属性列表一个模糊的类型。 我试图通过所有类型来找到ProtoContract,我可以找到它们 ,但属性名称全部更改为a,m,b,j,g。

我也试过Me.GetType.GetProperties与相同的结果。

可能从输出实现一个映射表示Employee.FirstName现在是a0.j,但分发这个失败的目的是混淆。

b)什么对一定程度的工作是免除混淆类NAME。由于PB-N查找ProtoMember属性以获取数据,因此可以对属性/成员名称进行混淆,而不是CLASS /类型名称。如果名称与FederalReserveLogIn类似,则您的班级/类型会有Bullseye。

我已经初见成效执行以下操作:

1)建立一个简单的类来存储属性令牌和价值。使用ConvertFromInvariantString将所有内容存储为字符串。从PBN获取一个小费,我使用了一个令牌整数:

<ProtoMember(propIndex.Foo)> 
Property Foo As String 

枚举有助于将所有内容绑定在一起。将这些存储在一个Dictionary(Of T, NameValuePair)

2)添加一些访问器。这些都可以进行类型转换为你:

Public Sub Add(ByVal Key As T, ByVal value As Object) 
     If _col.ContainsKey(Key) Then 
      _col.Remove(Key) 
     End If 

     _col.Add(Key, New TValue(value)) 

    End Sub 

    Public Function GetTItem(Of TT)(key As T) As TT 
     If _col.ContainsKey(key) Then 
      Return CType(_col(key).TValue, TT) 
     Else 
      Return Nothing 
     End If 
    End Function 

T是你想使用的任何密钥类型。整数产生最小的输出,并且仍然允许订阅代码使用Enum。但它可能是String。

TT是原始类型:

myFoo = props.GetTItem(Of Long)(propsEnum.Foo) 

3)显露innerlist(字典)至PBN和宾果游戏,全部完成。

它也很容易添加转换器的点,矩形,字体,大小,颜色,甚至位图。

HTH

3

有趣。我承认我从来没有尝试过这种情况,但是如果你能让我通过你的过程(或者更好:也许提供一个基本的复制例子,“运行这个,然后这个,然后这个:繁荣”),我很乐意进行调查。

注:ProtoContract上的Name主要用于GetProto()的使用;核心序列化器不需要它,并且可以省略它以减少暴露。另外,protobuf-net对字段不感兴趣,除非这些字段用属性​​装饰,所以不应该成为问题。

但是!这里可能有一个解决方法,现在;你可以预先生成一个静态序列化的DLL;例如,在一个单独的控制台exe文件(就像一个工具,我真的需要一个独立的工具来包装这个!)

因此,如果你创建一个控制台EXE引用您的是非模糊图书馆的protobuf-net.dll:

var model = RuntimeTypeModel.Create(); 
model.Add(typeof(DMailer), true); // true means "use the attributes etc" 
// and other types needed, etc 
model.Compile("MailSerializer", "MailSerializer.dll"); 

这应该写MailSerializer.dll,然后你就可以从你的代码中引用(除了protobuf网),并使用:

var ser = new MailSerializer(); // our pre-genereated serializer 
ser.Serialize(...); // etc 

然后在您的模糊有效载荷中包含MailSerializer.dll

(这是所有v2的具体,顺便说一句)

如果工作,我需要调查的主要问题,但我不是一个模糊专家,所以可以用你的摄制做脚步。

+0

谢谢。我会毫无疑问地尝试一种简化的手段来重现,现在我想尝试一下你的其他建议。对于那些在这里打主场比赛是模型创建的VB版本:'进口ProtoBuf.Meta 进口[此处插入您的DLL名称} 模块模块1 子的Main() 昏暗的模型作为对象模型 = RuntimeTypeModel。创建 model.add(的GetType(DMailer),真) '根据需要添加其他类型的 model.Compile( “MailSerializer”, “MailSerializer.dll”) 结束Sub' ......好吧,我不知道怎么代码标签在快速回复中工作 – Plutonix

+0

@Plutonix我为我的示例使用了C#,纯粹是为了我自己的简单;如果我试图用VB编写它,我可能会做出微妙但很难发现的错误,因为我相信您可以轻松阅读C#并转换为VB。该库并不关心语言,显然; p –

+0

静态DLL并不真正起作用:为了制作DLL,您需要公开所有涉及的类型,以便它们可以获取它们。但是,然后在运行时它会窒息,除非你免除所有这些类型的混淆,否则你会得到'无法从程序集中加载类型'xxx'对于任何相关的类,枚举等。我从消息中假设他们将不得不保持公开未混淆(不仅仅是为了构建静态DLL),这使我们比以前更糟糕。尽管感谢这个想法! – Plutonix