.net程序中资源文件的保护办法探讨
在编写.net程序(特别是WinForm时)经常会遇到一些需要加以保护的资源文件,比如一些数据库文件、图片文件等等,我们希望能被自己的程序访问,但是又不希望别人把我们辛辛苦苦收集来的数据被别人毫不费力地用于自己的程序中,在网上已经有不少朋友问到过这个问题,我也与不少朋友探讨过这个问题,今天把一些常用的做法介绍给大家,仅供参考。
办法一、作为嵌入式资源
采用这种办法的优点是资源文件做成整个可执行文件的一部分了,优点是不同反编译等手段,无法获知程序的内部情况,缺点是因为已经嵌入到exe中了,所以无法对嵌入的文件做内容上的修改。
图:打开调换字节顺序的word文件的情况
办法四、对文件字节进行补运算
程序中关键代码如下:
for (int i = 1; i < fileLength; i++)
{
source[i] = (byte)(~source[i]);
}
return source;
总结:以上各种方式各有优缺点,需要根据的最终用户的计算机水平来确定什么保护方法。
我问过不少朋友,有些使用过这种办法,因为一般来说一种文件后缀对应一种编译或者查看的工具,例如.mdb通过Access可以查看和修改,.txt可以通过记事本查看和修改,如果我们把一个txt文件的后缀改成.mdb,那么双击后系统会用Access打开文件,结果自然是乱码,如果我们不理会文件后缀,仍然以记事本打开则仍然可以正常查看和编辑。也就是我们更改文件后缀达到误导系统用错误的方式打开的目的。也有些朋友甚至干脆不用文件后缀,这样就让操作系统无所适从了。这种方法的优点是知道文件的实际格式后可以对文件进行查看和修改,缺点是常用的文件后缀不多,遇上有心人可以尝试通过更改文件后缀的办法来获取文件内容的办法,这种几率还是比较大的。
程序中关键代码如下:
byte[] total = new byte[fileLength];//存储文件内容的字节数组
stream.Read(total, 0,fileLength);
stream.Close();
byte tempByte;//用于交换文件字节的数据
//下面的循环实现文件的首字节与文件的尾字节对换
//文件的第二字节与文件倒数第二字节对换
//假设文件的字节长度为length,那么对换字节的索引n,m满足:n+m=length-1
//也就是n=length-m-1
for (int i = 0; i < byteLength; i++)
{
tempByte = total[i];
total[i] = total[fileLength - 1 - i];
total[fileLength - 1 - i] = tempByte;
}
return total;//返回调整次序后的文件字节内容
说明:完整源代码请到http://download.csdn.net/source/417558下载。下载到的压缩包中包含了程序源文件和编译成功的可执行文件。
说明:有朋友提出了其它办法,比如对文本型文件进行DES加密等等,这些办法当然也是可以的,我在文中并没有说只有这些办法,文中提到的办法对所有文件类型都是可以的。
http://blog.csdn.net/zhoufoxcn/archive/2008/04/16/2296966.aspx