【问题标题】:Error while Obfuscation混淆时出错
【发布时间】:2013-03-22 12:43:32
【问题描述】:

我们出于内部目的使用 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 提供)

没有混淆的 exe 可以正常工作。

在子例程中分配变量“Var1”时引发错误。如果代码行修改如下,那么混淆的 exe 就可以正常工作了。

FrmMain.Var1= Row("ChangesDbName").ToString

我们认为混淆缺少后期绑定并在一个小型示例项目中尝试了类似类型的代码。但这没有任何错误。我们附上了这个小代码。但由于其规模庞大,我们无法上传原始项目。

我们如何追踪错误?

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

【问题讨论】:

  • 所以它是一个内部应用程序。你发布了源代码。混淆它还有什么意义???
  • 这只是一个错误的示例代码
  • eazfuscator.net 生成相同的错误(混淆时)
  • 我认为这可能是因为当您的代码被混淆时,Var1 的公共名称也会被混淆,您需要找到一种方法让您的混淆工具不会发生这种情况

标签: vb.net obfuscation dotfuscator smartassembly


【解决方案1】:

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

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

打开Option Strict并解决错误(即将参数frm的类型更改为其真实类型)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-17
      • 2018-03-08
      • 2021-10-04
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      • 2012-01-14
      • 2017-01-03
      相关资源
      最近更新 更多