【问题标题】:Proto-buf serialization with Obfuscation带有混淆的 Proto-buf 序列化
【发布时间】:2012-01-08 10:51:33
【问题描述】:

我正在寻找一些指导,了解在使用带有混淆的 proto-buf 网络 (Dotfuscator) 时会发生什么。该项目的一半是 DLL,另一半是其他地方的 EXE,它们使用 proto-buf NET 完美地交换数据。直到我混淆了 DLL。

此时 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 个 props 都用 ProtoMember 装饰来获取/设置组成类对象。为简洁起见截断。

再一次,在我混淆 DLL 之前,它工作得很好。然后,Dotfuscator 将这些重命名为 null,显然因为它们都是 Friend,这似乎扼杀了 proto-buff。如果我免除类重命名(只是类名,而不是道具/成员),它似乎又可以工作了。 P-BN 只能作用于具有正确名称的对象是有道理的,尽管当被要求序列化一个空命名对象时,似乎可能会出现异常。

另一方面,PB-N 的大部分魅力应该是序列化独立的 .NET 名称从属性工作 - 至少据我了解。然而在这种情况下,它似乎只适用于具有名称的类。我尝试使用如上所示的 Name 限定符或参数,但无济于事 - 它显然没有做我认为可能的事情。

所以,我很好奇:

a) ...我基本上猜对了问题

b) ...还有一些其他属性或标志可能有助于序列化 一个空命名对象

c) ...如果还有其他有用的见解。

如果我从 Dotfuscator 重命名中免除所有 3 或 4 个类(LList 尚未实际实现,留下 DMailer、Cert 和 Sys),DLL 似乎再次工作 - 至少输出是正确的大小。我可以忍受,虽然模糊的名称会更好:Dotfuscator (CE) 要么豁免它们,要么将名称设置为 Null - 我似乎无法找到强制重命名它们的方法。

我正在考虑的一种替代方法是将 Cert 和 Sys 的 Serializer 输出简单地存储为 DMailer 中的字节数组或 Base64 字符串而不是类,而不是免除 3 或 4 个类的重命名。然后让接收者分别反序列化每个对象。能够只打开一件东西,然后像施了魔法一样把玩具放在那里,真是太好了。

(许多)TIA

【问题讨论】:

    标签: serialization obfuscation protobuf-net


    【解决方案1】:

    有趣。我承认我从未尝试过这种情况,但如果你能引导我完成你的过程(或者更好:也许提供一个基本的复制示例,“运行这个,然后这个,然后这个:繁荣”)我会很乐意调查。

    注意:ProtoContract 上的Name 主要是供GetProto() 使用的;核心序列化程序不需要它,可以省略它以减少曝光。此外,protobuf-net 对字段不感兴趣除非这些字段被属性修饰,所以这应该不是问题。

    但是!这里可能有一个解决方法现在应该可以使用;您可以预先生成一个静态序列化 dll;例如在一个单独的控制台 exe 中(只是作为一个工具;我真的需要将它包装在一个独立的实用程序中!)

    因此,如果您创建一个引用 unobfuscated 库和 protobuf-net.dll 的控制台 exe:

    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,然后你可以从你的ma​​in代码中引用它(除了protobuf-net),并使用:

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

    然后在您的混淆负载中包含MailSerializer.dll

    (这都是 v2 特有的,顺便说一句)

    如果这不起作用,我需要调查主要问题,但我不是混淆专家,所以可以按照你的重现步骤来做。

    【讨论】:

    • 谢谢。我肯定会尝试一种简化的复制方法,现在我想尝试你的其他建议。对于那些玩家庭游戏的人,这里是模型创建的 VB 版本:Imports ProtoBuf.Meta Imports [insert your DLL name here} Module Module1 Sub Main() Dim model As Object model = RuntimeTypeModel.Create model.add(GetType(DMailer), True) ' add other types as needed model.Compile("MailSerializer", "MailSerializer.dll") End Sub...好吧,我不知道代码标签如何快速回复
    • @Plutonix 我使用 C# 作为示例纯粹是为了我自己的简单性;如果我尝试用 VB 编写它,我可能会犯一个微妙但难以发现的错误,因为我相信您可以阅读 C# 并轻松转换为 VB。显然,图书馆不太关心语言;p
    • 静态 DLL 并没有真正起作用:为了让它生成 DLL,您需要将所有涉及的类型公开,以便它可以获取它们。但是在运行时它会窒息,除非你免除所有这些类型的混淆,否则你会得到'Could not load type 'xxx' from assembly' 对于任何涉及的类、枚举等。我从消息中假设它们必须保持公开和未混淆(不仅仅是为了构建静态 DLL),这让我们比以前更糟。不过,谢谢你的想法!
    • @Plutonix 那么我得看看根本问题。
    【解决方案2】:

    由于有一些兴趣上升,以下是看起来可行的方法:

    a) 任何形式的反射都无法获得混淆类型的属性列表。 我尝试遍历所有类型以找到带有 ProtoContract 的类型,我可以找到它们 但是属性名都改成了a,m,b,j,g。

    我也尝试了 Me.GetType.GetProperties,结果相同。

    可以从输出中实现一个映射以指示 Employee.FirstName 现在是 a0.j,但是分发它会破坏混淆的目的。

    b) 在一定程度上起作用的是使类 NAME 免受混淆。由于 PB-N 查找 ProtoMember 属性来获取数据,因此您可以混淆属性/成员名称,而不是 CLASS/类型名称。如果名称类似于 FederalReserveLogIn,则您的类/类型有一个靶心。

    我在以下方面取得了初步成功:

    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 是您希望使用的任何密钥类型。整数会产生最小的输出,并且仍然允许订阅代码使用枚举。但它可能是字符串。

    TT 是原始类型:

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

    3) 将内部列表(字典)暴露给 PBN 和 bingo,全部完成。

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

    HTH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 2023-03-05
      • 2012-02-25
      相关资源
      最近更新 更多