混淆时出错

时间:2013-04-01 12:29:00

标签: vb.net obfuscation dotfuscator smartassembly

我们已经使用vb.net开发了用于内部目的的项目,然后我们对其进行了模糊处理。它如下所述抛出错误。

“找不到类型'e'上的公共成员'Var1'。”

代码:

Public Sub get_constants_from_DbList(ByRef frm As Object, ByRef sDbname As String)

    For Each Row As DataRow In CommonObj.DSCommonProc.Tables("dblist").Rows 
            If StrComp(Row("DbName").ToString, sDbname, CompareMethod.Text) = 0 Then
             prg_id = Row("PrgId").ToString
             frm.Var1= Row("ChangesDbName").ToString
             frm.Var2 = Row("LoadTableName").ToString
             frm.Var3 = Row("ServerName").ToString
             Exit Sub
        End If
    Next

End Sub

将一个表单(名为FrmMain)从调用过程传递给参数'frm'到此子例程。 Var1等是该形式的公共变量。

我们尝试的混淆工具是 -

  1. SmartAssembly 6

  2. PreEmptive Dotfuscator and Analytics CE(随Visual Studio 2012推出)

  3. 没有混淆exe工作正常。

    在子例程中分配变量'Var1'时抛出错误。如果代码行被修改如下,那么混淆的exe将正常工作。

    FrmMain.Var1 = Row(“ChangesDbName”)。ToString

    我们认为混淆缺少后期绑定&在一个小样本项目中尝试过类似的代码。但那没有任何错误。我们附上了这个小代码。但由于它的规模,我们无法上传原始项目。

    我们如何追踪错误?

    您可以找到我的示例应用程序here

    的源代码

2 个答案:

答案 0 :(得分:1)

不要使用带有反射/后期绑定/动态的混淆。它只会让你陷入这样的麻烦。

混淆器会混淆所有私人&内部标识符,但它无法知道您在运行时通过名称绑定它们。

启用Option Strict并解决错误(即将参数frm的类型更改为其实际类型)

答案 1 :(得分:0)

混淆器依靠静态分析来确定混淆的“安全”。当您将后期绑定和反射引入混合时,很难检测出重命名不安全的东西。大多数混淆器提供了从混淆中排除应用程序的某些元素的功能,以便您可以解决此问题。

我实际上并不了解VB.Net,但是你正在进行后期绑定的方式似乎是混淆器无法检测到的。因此,这意味着您需要将该属性排除在重命名之外。至少在Dotfuscator中,这应该很容易。您还应该能够打开“图书馆模式”,这将自动排除每个班级的所有公共成员。