自从 .Net framework 推出之后,受到广泛的使用与欢迎;而相信您也听过 Native Code 与 Managed Code;执行在 .Net CLR 环境下的应用程序都是属于 Managed Code 的范围,而 Managed Code 在编译时会先编译成 MSIL (Microsoft Intermediate Language),实际执行时交由 JIT (Just-In-Time) 编译成机器码之后执行,而由于架构上的变更,MSIL (也就是我们的 .Net exe、dll 档案等) 是比较容易被解译的,因此便出现了混淆器,用来降低解译后程序代码的可读性、混淆流程、变量重新命名等,藉此来保护我们的应用程序;本篇主要将介绍如何利用混淆器来保护您的 Windows Phone 7 应用程序。
首先,要保护我们的应用程序必须要先取得软件;而 PreEmptive Solutions 与微软合作,推出了免费的版本让您可以保护您的 WP7 应用程序,那要怎么取得呢?首先到申请的位置
http://www.preemptive.com/windowsphone7.html
之后您会在右边看到 REQUEST DOWNLOAD 的按钮,像是下图这样
点击之后会带到申请的页面,这个地方是要输入您的个人资料,大致上会像下图
在这边要特别注意,您软件的序号以及软件下载位置会经由 email 寄送到您的个人信箱中,因此 email 字段填写时要特别留意正确性;而附注字段的地方记得要填上 WP7,表示您要申请用于 Windows Phone 7 应用程序的用途上。
数据填写完成送出后,大约一个工作天的时间,您就会收到一封 email,内含软件的下载位置以及安装序号,内容大致上会像下图
接下来您就可以下载软件并进行安装了;而如果您有想要使用 Intelligence 的相关功能,您可以回复这封邮件,并且将您安装后的软件序号提供给他,之后会再回复给你启动 Intelligence 的序号,而软件的序号在安装后可以在『Help/About』的画面中看到
您可能会有疑问,为什么要使用混淆器?或者还不清楚混淆器的功能以及主要作用,下面笔者简单的用例子的方式来说明;例如以先前笔者的 BurshDemo 的范例程序来看,在 btnRadialGradient 按钮按下的源代码是下面这样
而在没有经过混淆器编译过的程序代码档案 (exe 或是 dll),在反组译之后呈现出来的结果会像是这样子
你会发现,几乎是完完整整的呈现出来了,而且过程是相当的简单;因此就必须要藉由混淆器来让这件事件变得困难,这也是混淆器存在的目的了。
软件的安装过程相当的简单,笔者这边就不再赘述了;安装完毕之后,您会在菜单中看到如下的项目
其中 PDF 的档案 (Userguide) 是说明文件,另一个就是我们要使用的主程序了;执行之后第一个画面会看开启就项目或是建立新项目的画面
在这个画面中,是选择要建立新的项目或是开启之前使用过的项目,这是由于在 Dotfuscator 中有相当多的设定可以让你去做设定以及调整,项目是用来储存这些相关的设定以及对应的 Visual Studio 项目。
接下来要设定一下使用组件的参考位置,这个设定是位于 Setting 的页面中,加入的方式可以参考下图;这边设定参考组件的位置是让 Dotfuscator 能够分析程序代码中的型别、使用到的组件以及其他相关的信息
而要加入的组件参考位置依照操作系统会有一些分别,会位于
C:/Program Files (x86)/Reference Assemblies/Microsoft/Framework/Silverlight/v4.0/Profile/WindowsPhone
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 档案应该要如何测试呢?我们可以利用部属工具直接将档案部属到仿真器或是装置上下去做测试,工具的位置可以在菜单中看到像是如下的画面
执行之后会看到如下的接口
透过这个工具就可以进行部属的动作,而部属成功之后,您就可以在装置上或是仿真器上面测试您的应用程序了
混淆器主要是会让解读 (反组译) 的动作变得困难,进而有效的帮助我们来保护应用程序,但也并非万灵丹,不将敏感性的数据直接写在程序代码中,适当的采用加密的方式来保存数据也是必须的;而使用混淆器进行编译之后很重要的一点,一定要再经过一次完整的测试,因为经过混淆器编译之后,根据设定的不同,是会去改变一些程序的逻辑或是数据,难保是不是会造成某些功能的运作不正常,切记一定要再验证过程序的正确性才行。