c#

位置:IT落伍者 >> c# >> 浏览文章

.net程序中资源文件的保护办法探讨


发布日期:2023年01月09日
 
.net程序中资源文件的保护办法探讨
在编程序(特别是WinForm时)经常会遇到一些需要加以保护的资源文件比如一些数据库文件图片文件等等我们希望能被自己的程序访问但是又不希望别人把我们辛辛苦苦收集来的数据被别人毫不费力地用于自己的程序中在网上已经有不少朋友问到过这个问题我也与不少朋友探讨过这个问题今天把一些常用的做法介绍给大家仅供参考

办法一作为嵌入式资源

)thisstylewidth=; twffan=done>图

采用这种办法的优点是资源文件做成整个可执行文件的一部分了优点是不同反编译等手段无法获知程序的内部情况缺点是因为已经嵌入到exe中了所以无法对嵌入的文件做内容上的修改

borderColorDark=#ffffff align=center bgColor=#ddddd borderColorLight=# border=>image onmousewheel=javascript:return big(this)  src=http://imgeducitycn/img_///jpg onload=javascript:if(thiswidth>)thisstylewidth=; twffan=done>图

打开调换字节顺序的word文件的情况

办法四对文件字节进行补运算

实践证明对一个字节变量b以下操作横成立~(~b)=b利用这个原理我们可以对文件的字节值进行位操作来保护我们可以将原始文件的字节值进行一次~运算将加密后的文件字节内容随同软件一同发布在需要查看和修改文件的时候再对文件进行一次~运算就可以了

这种方法的优点要知道文件内容只需要对文件逐字节进行~运算就可以了缺点是一旦被人知道此种加密方式懂得一点编程的人就可以对文件内容复原

程序中关键代码如下

borderColorDark=#ffffff cellPadding= width= align=center borderColorLight=black border=>ee>

/下面的循环实现对文件内容逐字节进行求补运算

for (int i = ; i < fileLength; i++)

{

source[i] = (byte)(~source[i]);

}

return source;

总结以上各种方式各有优缺点需要根据的最终用户的计算机水平来确定什么保护方法

办法二改文件后缀

我问过不少朋友有些使用过这种办法因为一般来说一种文件后缀对应一种编译或者查看的工具例如mdb通过Access可以查看和修改txt可以通过记事本查看和修改如果我们把一个txt文件的后缀改成mdb那么双击后系统会用Access打开文件结果自然是乱码如果我们不理会文件后缀仍然以记事本打开则仍然可以正常查看和编辑也就是我们更改文件后缀达到误导系统用错误的方式打开的目的也有些朋友甚至干脆不用文件后缀这样就让操作系统无所适从了这种方法的优点是知道文件的实际格式后可以对文件进行查看和修改缺点是常用的文件后缀不多遇上有心人可以尝试通过更改文件后缀的办法来获取文件内容的办法这种几率还是比较大的

办法三对文件的字节顺序进行调整

这种办法是我今天要重点介绍的一种办法几年前我参与过一个OA系统的开发里面有一个环节就是如何保证以Word形式保存的合同审批申请不会被篡改我当时的做法就是Word文件分段存储也就是将整个文件头个byte存放到数据库剩余字节仍然以Word文档的方式存储到硬盘上这样别人通过正常办法打开Word文件时看到的乱码一旦需要调看文件时再通过程序将头字节和本地存储的文件的内容合并成一个完整的Word文档后来我嫌利用数据库存储麻烦将这种办法改进了一下将文件的前n个字节与后n个字节位置对换这样不更改文件后缀仍然可以实现对文件内容进行查看和修改这种办法的缺点是对于文本型的文件如果不进行字节调换则没有调换的部分依然不是乱码

程序中关键代码如下

borderColorDark=#ffffff cellPadding= width= align=center borderColorLight=black border=>ee>

FileStream stream = fileInfoOpenRead();

byte[] total = new byte[fileLength];//存储文件内容的字节数组

streamRead(total fileLength);

streamClose();

byte tempByte;//用于交换文件字节的数据

//下面的循环实现文件的首字节与文件的尾字节对换

//文件的第二字节与文件倒数第二字节对换

//假设文件的字节长度为length那么对换字节的索引nm满足n+m=length

//也就是n=lengthm

for (int i = ; i < byteLength; i++)

{

tempByte = total[i];

total[i] = total[fileLength i];

total[fileLength i] = tempByte;

}

return total;//返回调整次序后的文件字节内容说明完整源代码请到下载

Trackback: x?PostId=

               

上一篇:C#学习之——认识C#的内部类

下一篇:Web应用的UML建模与.NET框架开发