当前位置 : 主页 > 大数据 > 区块链 >

使用Obfuscation进行Proto-buf序列化

来源:互联网 收集:自由互联 发布时间:2021-06-22
我正在寻找关于使用带混淆的原型buf网(Dotfuscator)时发生了什么的一些指导.项目的一半是DLL,另一半是其他地方的EXE,使用proto-buf NET,它们可以完美地交换数据.直到我混淆DLL. 此时P-BN失败而
我正在寻找关于使用带混淆的原型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

所有用ProtoMember修饰的道具都有3个道具来获取/设置组成类对象.为了简洁起见.

再次,它工作得很好,直到我混淆DLL.然后,Dotfuscator将这些中的每一个重命名为null,显然因为他们都是朋友,这似乎扼杀了proto-buff.如果我免除该类重命名(只是类名,而不是道具/成员),它似乎再次起作用.有意义的是,P-BN只能对具有正确名称的对象进行操作,但是当被要求序列化一个空命名对象时,似乎异常可能是有序的.

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

所以,我很好奇,如果:

a)…我基本上已经正确地推测了这个问题

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

c)……如果有任何其他见解可以提供帮助.

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

我考虑的一种替代方法是将Cert和Sys的Serializer输出存储为DMailer中的字节数组或Base64字符串而不是类,而不是免除3或4个类的重命名.然后让接收器单独反序列化每个对象.很高兴能够解开一件事并让你的玩具就好,就像魔法一样.

(多)TIA

由于有一些感兴趣的上升,这似乎将起作用:

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

TT是原始类型:

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

3)将内部列表(字典)暴露给PBN和宾果游戏,全部完成.

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

HTH

网友评论