Ошибка при обфускации

Мы разработали проект с использованием vb.net для наших внутренних целей, а затем запутали его. Выдает ошибку, как указано ниже.

«Открытый член «Var1» для типа «e» не найден».

Код:

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. Умная сборка 6

  2. PreEmptive Dotfuscator and Analytics CE (входит в состав Visual Studio 2012)

Без обфускации exe работает нормально.

Возникает ошибка при назначении переменной «Var1» в подпрограмме. Если строка кода изменена, как показано ниже, запутанный exe будет работать нормально.

FrmMain.Var1= Строка("ChangesDbName").ToString

Мы подумали, что в обфускации отсутствует позднее связывание, и попробовали аналогичный тип кода в небольшом примере проекта. Но в этом не было ни одной ошибки. Мы прикрепили этот небольшой код. Но из-за его масштабности мы не можем загрузить оригинальный проект.

Как мы можем отследить ошибку?

Вы можете найти исходный код моего примера приложения здесь


person IT researcher    schedule 01.04.2013    source источник
comment
Так что это внутреннее приложение. И вы выложили исходный код. Какой смысл его запутывать???   -  person Hans Passant    schedule 01.04.2013
comment
Это всего лишь пример кода, который получает ошибку   -  person IT researcher    schedule 01.04.2013
comment
eazfuscator.net выдает ту же ошибку (при обфускации)   -  person Rob    schedule 01.04.2013
comment
Я думаю, это может быть связано с тем, что, когда ваш код запутывается, общедоступное имя Var1 также запутывается, и вам нужно найти способ, чтобы этого не произошло с вашим инструментом запутывания.   -  person Rob    schedule 01.04.2013


Ответы (2)


Не используйте запутывание с отражением/поздним связыванием/динамическим. Это только навлечет на вас такие неприятности.

Обфускатор будет запутывать все частные и внутренние идентификаторы, но он не может знать, что вы привязываетесь к ним по имени во время выполнения.

Включите Option Strict и устраните ошибки (т.е. измените тип аргумента frm на его реальный тип)

person adrianm    schedule 04.04.2013

Обфускаторы полагаются на статический анализ, чтобы определить, что «безопасно» для обфускации. Когда вы добавляете в смесь позднее связывание и отражение, становится очень трудно обнаружить, что что-то небезопасно переименовывать. Большинство обфускаторов предоставляют возможность исключать определенные элементы вашего приложения из обфускации, чтобы вы могли обойти эту проблему.

На самом деле я не очень хорошо знаю VB.Net, но то, как вы выполняете позднее связывание, похоже, что обфускатор не может обнаружить. Итак, это означает, что вам нужно исключить переименование этого свойства. По крайней мере, в Dotfuscator это должно быть легко. Вы также должны иметь возможность включить «Режим библиотеки», который автоматически исключит всех общедоступных членов каждого класса.

person Earlz    schedule 04.04.2013