Dotfuscator for Windows Phone7
软件的安装过程相当的简单,笔者这边就不再赘述了;安装完毕之后,您会在菜单中看到如下的项目
其中 PDF 的档案 (Userguide) 是说明文件,另一个就是我们要使用的主程序了;执行之后第一个画面会看开启就项目或是建立新项目的画面
在这个画面中,是选择要建立新的项目或是开启之前使用过的项目,这是由于在 Dotfuscator 中有相当多的设定可以让你去做设定以及调整,项目是用来储存这些相关的设定以及对应的 Visual Studio 项目。
接下来要设定一下使用组件的参考位置,这个设定是位于 Setting 的页面中,加入的方式可以参考下图;这边设定参考组件的位置是让 Dotfuscator 能够分析程序代码中的型别、使用到的组件以及其他相关的信息
而要加入的组件参考位置依照操作系统会有一些分别,会位于
- x64
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone
- x86
C:\Program Files\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone
加入之后,第二个步骤是加入要混淆的项目,这个设定是位于 Input 页面中,例如下图
这个地方就可以指定你编译后产生的 xap 档案,指定好了之后,接下来便是其他的设定项目了;先回到 Setting 的页面中,首先先来看看经过混淆器编译后的档案会放置在什么地方呢?这个在 Build Setting 中可以去做设定,例如笔者这边是设定成 D:\WP7 的目录,而在这个部分原始的设定是『${configdir}\Dotfuscated』您也可以保留这样的设定,这个设定的意思是经过混淆器编译后的档案会跟您的 xml 配置文件放在相同的位置,这部分可以依照您的喜好下去做设定。
到这边为止,就已经完成了基本的环境设定了,接下来需要再调整一些设定;这些设定位在 Global Options 这个项目中,在 Global Option 中可以设定 Dotfuscator 各功能是开启或关闭,而在这边,我们将重新命名 (Renaming) 以及 Control Flow 的项目给关闭起来 (依照预设的设定,这两个项目是开启的),例如下图这样
那么为什么要关闭 Renaming 项目的功能呢?这是因为在应用程序中,可能会自定义类别来储存各种数据使用,例如说建立了 Book 的类别,而其中可能会有标题、出版日期等属性存在,大概像这样子
public string Title
{
get { return _title; }
set { _title = value; }
}
public string PubDate
{
get { return _pubdate; }
set { _pubdate = value; }
}
而在 XAML 的地方,利用了数据系结的功能去做显示,例如
- <TextBlock VerticalAlignment="Center" Grid.Column="1" Margin="5,0,0,0" Grid.Row="1" FontSize="32" TextWrapping="Wrap" Text="{Binding Path=Title}"/>
- <TextBlock VerticalAlignment="Center" Grid.Column="1" Margin="5,0,0,0" Grid.Row="1" FontSize="32" TextWrapping="Wrap" Text="{Binding Path=PubDate}"/>
而混淆器中 Renaming 的功能会将各变量、方法等作重新命名,而之间可能会发生对应不到的情形,因此会造成应用程序的错误发生,这部分要特别的留意一下。
而 Control Flow 的部分是会在程序代码中加入一些混淆程序流程以及架构的程序代码,而在现阶段我们也不希望 Dotfuscator 这么做,因此也设定为关闭。
设定完成之后,就可以按下 Build Project 的按钮来建立项目了,按钮的位置可以参考下图
建置之后没有意外的话会在下方的说明窗口中出现完成的讯息,例如下图
而之后就会在您指定的位置产生一个新的 xap 档案了;那么经过混淆器编译之后有甚么不同呢?同样的来看看先前的按钮事件有甚么不同
您可以看出程序代码的部分不会直接的被看出来了,太棒了不是吗;只要经过简单的几个步骤之后,就能够保护我们的应用程序了。这也是最简单的设定方式,那如果想要用到一些其他设定的功能呢?笔者再简单的介绍一下,这边以字符串加密的部分来作为范例;例如说在 Book 类别中宣告了一个字符串变量,大概像下面这样
namespace DotobfuscatorDemo
{
public class Book
{
public string Title { get; set; }
public string PubDate { get; set; }
public string Author { get; set; }
public string temp;
public Book()
{
temp = "12345";
}
}
}
而在没有经过混淆器编译的情形下,反组译后的结果会像是这样
字符串会直接的显示出来,而这时候如果不想让字符串以这么明显的方式被看出来的话,就可以利用混淆器来做加密,那要怎么做呢?首先要在设定中把字符串加密的部分给启用
之后设定受影响的范围,这边笔者只设定了 Book 类别,例如下面这样
接下来直接在混淆器中重新编译一次 xap 档案就可以了,那么新产生的 xap 如果经过反组译会是什么样子呢?
您可以看到字符串部分不会直接被显示出来,而且另外套用了一个名为『b』的 function,『b』的内容是
这样就可以保护您的字符串不会那么轻易的就被看出来了,混淆器会使这个动作变得复杂、以及不容易了解,但同时也会牺牲一些效能就是了。您可以参考 Userguide 的使用说明来了解其他的设定部分。
测试经过混淆器产生的应用程序
那么经过混淆器产生的 xap 档案应该要如何测试呢?我们可以利用部属工具直接将档案部属到仿真器或是装置上下去做测试,工具的位置可以在菜单中看到像是如下的画面
执行之后会看到如下的接口
透过这个工具就可以进行部属的动作,而部属成功之后,您就可以在装置上或是仿真器上面测试您的应用程序了
结语
混淆器主要是会让解读 (反组译) 的动作变得困难,进而有效的帮助我们来保护应用程序,但也并非万灵丹,不将敏感性的数据直接写在程序代码中,适当的采用加密的方式来保存数据也是必须的;而使用混淆器进行编译之后很重要的一点,一定要再经过一次完整的测试,因为经过混淆器编译之后,根据设定的不同,是会去改变一些程序的逻辑或是数据,难保是不是会造成某些功能的运作不正常,切记一定要再验证过程序的正确性才行。