我们已经使用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等是该形式的公共变量。
我们尝试的混淆工具是 -
SmartAssembly 6
PreEmptive Dotfuscator and Analytics CE(随Visual Studio 2012推出)
没有混淆exe工作正常。
在子例程中分配变量'Var1'时抛出错误。如果代码行被修改如下,那么混淆的exe将正常工作。
FrmMain.Var1 = Row(“ChangesDbName”)。ToString
我们认为混淆缺少后期绑定&在一个小样本项目中尝试过类似的代码。但那没有任何错误。我们附上了这个小代码。但由于它的规模,我们无法上传原始项目。
我们如何追踪错误?
您可以找到我的示例应用程序here
的源代码答案 0 :(得分:1)
不要使用带有反射/后期绑定/动态的混淆。它只会让你陷入这样的麻烦。
混淆器会混淆所有私人&内部标识符,但它无法知道您在运行时通过名称绑定它们。
启用Option Strict
并解决错误(即将参数frm的类型更改为其实际类型)
答案 1 :(得分:0)
混淆器依靠静态分析来确定混淆的“安全”。当您将后期绑定和反射引入混合时,很难检测出重命名不安全的东西。大多数混淆器提供了从混淆中排除应用程序的某些元素的功能,以便您可以解决此问题。
我实际上并不了解VB.Net,但是你正在进行后期绑定的方式似乎是混淆器无法检测到的。因此,这意味着您需要将该属性排除在重命名之外。至少在Dotfuscator中,这应该很容易。您还应该能够打开“图书馆模式”,这将自动排除每个班级的所有公共成员。