2015-01-19 4 views
1

Мне нужен Obfuscar для обфускации (переименования) внутренних классов, таких как Secret1, в следующем. Это минимальное приложение WPF с дополнительными классами public и internal для занятий Obfuscar.переименовать внутренний класс с Obfuscar

namespace WpfApp 
{ 
    public enum Category { Low, High } 

    public partial class MainWindow : Window 
    { 
     private ViewModel ViewModel; 

     public MainWindow() 
     { 
      InitializeComponent(); 
      this.DataContext = this.ViewModel = new ViewModel(); 
     } 

     private void MyButtonClick(object sender, RoutedEventArgs e) 
     { 
      this.ViewModel.Process(MyTextBox.Text); 
      var s1 = new Secret1(); 
      s1.SecretMethod1(); 
      var s2 = new Secret2(); 
      s2.SecretMethod(); 
     } 
    } 

    internal class Secret1 
    { 
     internal int SecretInt; 
     private float SecretFloat; 

     internal int SecretMethod1() 
     { 
      if (SecretMethod2() == false) 
       return 0; 
      else 
       return 1; 
     } 

     private bool SecretMethod2() 
     { 
      return false; 
     } 
    } 

    public class Secret2 
    { 
     private int SecretInt; 

     public int SecretMethod() 
     { 
      return this.SecretInt; 
     } 
    } 

    [Serializable] internal class ViewModel : WpfNotifier 
    { 
     private const float DefaultKilograms = 80.0f; 

     private string _kilograms; 
     public string Kilograms // WPF binds here 
     { 
      get { return this._kilograms; } 
      set { this._kilograms = value; NotifyPropertyChanged(); } 
     } 
     private string _resultText; 
     public string ResultText // WPF binds here 
     { 
      get { return this._resultText; } 
      set { this._resultText = value; NotifyPropertyChanged(); } 
     } 

     internal void Process(string input) 
     { 
      float kilograms; 
      if (Single.TryParse(input, out kilograms)) 
      { 
       Category c = (kilograms > 100.0f) ? Category.High : Category.Low; 
       this.ResultText = c.ToString(); 
      } 
      else 
      { 
       this.Kilograms = ViewModel.DefaultKilograms.ToString(); 
      } 
     } 
    } 

    [Serializable] public class WpfNotifier : INotifyPropertyChanged 
    { 
     [field: NonSerialized] 
     public event PropertyChangedEventHandler PropertyChanged; // public for interface 

     internal void NotifyPropertyChanged([CallerMemberName] string propertyName = "") 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

Мой конфигурационный файл является:

<?xml version="1.0"?> 
<configuration> 

    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/> 
    </startup> 

    <Obfuscator> 
    <Var name="InPath" value="\users\user\documents\visual studio 2013\projects\wpfapp\wpfapp\bin\debug" /> 
    <Var name="OutPath" value="\users\user\documents\visual studio 2013\projects\wpfapp\wpfapp\bin\debug" /> 

    <Module file="$(InPath)\wpfapp.exe"> 
     <Var name="KeepPublicApi" value="false" /> 
     <Var name="HidePrivateApi" value="true" /> 
     <SkipType name="WpfApp.ViewModel" skipFields="true" skipProperties="true" /> 
     <SkipType name="WpfApp.WpfNotifier" skipFields="true" skipProperties="true" /> 
     <SkipType name="WpfApp.Category" skipFields="true" skipProperties="true" /> 
    </Module> 

    </Obfuscator> 

</configuration> 

Все возможные комбинации для установки KeepPublicApi и HidePrivateApi результат в классе Secret1 быть пропущена. «Пропущенный», вероятно, является терминологией Obfuscar для «не обфускации». Из моих заметок:

<Var name="KeepPublicApi" value="true" /> 
<Var name="HidePrivateApi" value="false" /> 
Secret1 class was skipped 

<Var name="KeepPublicApi" value="true" /> 
<Var name="HidePrivateApi" value="true" /> 
Secret1 class was skipped 

<Var name="KeepPublicApi" value="false" /> 
<Var name="HidePrivateApi" value="false" /> 
Secret1 class was skipped 

<Var name="KeepPublicApi" value="false" /> 
<Var name="HidePrivateApi" value="true" /> 
Secret1 class was skipped 

Ниже приведены два примера отображения отображения Obfuscar.

Отрывок из Mapping.txt (держать общественность = ложь, скрыть частный = истина):

[WpfApp]WpfApp.Secret1 skipped: HidePrivateApi option in configuration 
{ 

    [WpfApp]WpfApp.Secret1::SecretMethod1[0]() skipped: HidePrivateApi option in configuration 
    [WpfApp]WpfApp.Secret1::SecretMethod2[0]() skipped: HidePrivateApi option in configuration 
    [WpfApp]WpfApp.Secret1::.ctor[0]() skipped: special name 


    System.Int32 [WpfApp]System.Int32 WpfApp.Secret1::SecretInt skipped: HidePrivateApi option in configuration 
    System.Single [WpfApp]System.Single WpfApp.Secret1::SecretFloat skipped: HidePrivateApi option in configuration 
} 

Отрывок из Mapping.txt (держать общественность = ложь, скрывать частные = ложь)

[WpfApp]WpfApp.Secret1 skipped: HidePrivateApi option in configuration 
{ 

    [WpfApp]WpfApp.Secret1::SecretMethod1[0]() skipped: HidePrivateApi option in configuration 
    [WpfApp]WpfApp.Secret1::SecretMethod2[0]() skipped: HidePrivateApi option in configuration 
    [WpfApp]WpfApp.Secret1::.ctor[0]() skipped: special name 


    System.Int32 [WpfApp]System.Int32 WpfApp.Secret1::SecretInt skipped: HidePrivateApi option in configuration 
    System.Single [WpfApp]System.Single WpfApp.Secret1::SecretFloat skipped: HidePrivateApi option in configuration 
} 

Допустимое решение не должно вызывать изменения исходного кода, поскольку приложение реального мира больше, чем этот минимальный пример WPF.

ответ

1

Я надеюсь, что вы можете проверить образец проекта тщательно,

https://github.com/lextm/obfuscar/blob/master/Examples/BasicExample/obfuscar.xml

<Var> теги должны быть помещены под <Obfuscator> тега. В противном случае Obfuscar не узнает их.

Должен признать, что система настройки была плохо разработана (оригинальным разработчиком), но у меня нет времени ее заменить.

Смежные вопросы