加密可执行文件 一、加密BAT文件 1.修改BAT文件的换行符 用DEBUG观察BAT文件，可以看到其换行符是以0DH、0AH代替，而DOS的命令处理程序COMMAND.COM是以0DH作为标志来执行一条语句的。因此如果将BAT文件换行符中的0AH改成0，并不会影响BAT文件的执行，但在一些编辑工具（如Edit）下却什么也看不见，用TYPE命令也无法显示其内容，这样就起到加密或隐藏BAT文件的作用。具体操作时，可先使BAT文件的第一行为空行，即开始处就是0DH、0AH，这样将每一个0AH修改后，所有内容都不可见。
2.将BAT文件做成EXE文件
修改换行符的方法对付一般人还可以，但对比较深入了解DOS的人就没有用了。比如在DEBUG状态下，BAT文件就现出原形来了。其实有的编辑软件（如PE2）可以显示修改后的BAT文件，要想加密得更隐藏，通常可以将BAT文件做成EXE文件。因为EXE文件是二进制文件，任何编辑工具都没法观看或修改其内容。下面是一个用C语言编写的简单批处理程序jm.c:
#include <dos.h>
main()
{
system(“set temp c:＼dos”);
system(“prompt $p$g”);
system(“path c:＼dos;d:＼windows”);
system(“doskey”);
}
将上面程序编译链接后生成
jm.exe，将jm.exe拷贝到C盘根目录下，然后将AUTOEXEC.BAT文件改为一条执行jm.exe的语句就行了。其它高级语言也有类似C语言中system这样的专门执行DOS命令的函数，只要将需要在DOS下执行的命令语句加入该函数中就行了。
二、加密COM文件
COM文件的主要特点是长度不超过64kB，而且程序前必须预留256字节供DOS加载时设置程序段前缀PSP，入口地址固定为100H。对COM文件的加密和口令设置可通过下列步骤来完成。
1.通过设置口令程序对要保护的COM文件设置口令X，并将X通过加密变换函数f变换成Y，即Y=f(X)，其中f可以是异或、替代、移位等方法。Y需保存起来作为判定口令正确与否的标志。
2.将X通过某种加密变换函数g得到Z，即Z=g(X)，以Z作为密匙对整个COM文件进行加密变换。同时，在加密变换后的COM文件末尾附加上密码口令的解密程序。
3.把文件最前面的3个字节保存到附加程序段中，而将这3个字节所在位置用一条跳转到附加程序段的指令代替（该指令占3个字节），同时在附加程序段中专门编写出指令恢复文件的前3个字节，从而在附加段程序执行完毕后，可以转到正常的COM文件中执行。
这样，当执行经过以上三个步骤加密后的COM文件时，程序首先跳转去执行我们编写的附加程序段，在该程序段中，首先要求用户输入密码口令U，计算U通过加密变换f后的值V，即V=f(U），将V与保存的Y值进行比较。若用户输入的口令与该文件设置的口令相同，则两次计算的结果相同，此时，对该COM文件进行解密，再跳转去执行已恢复正常的COM文件；否则，说明密码不对，请求用户再次输入口令，若三次有误，则认为是非法用户，返回到DOS提示符下。
三、加密EXE文件
EXE文件的主要特点是程序长度只受当前可用内存的限制，程序可以建立代码段、数据段、堆栈段、附加数据段，入口地址不一定是100H，可随应用而定，由初始的CS：IP确定。
对EXE文件的口令设置与COM文件方法相类似，但由于EXE文件有一个程序头，入口地址需要通过计算确定，因此EXE文件的加密与COM文件有些不同。主要区别有以下三点：
1.EXE文件的程序头中的第14H字单元的内容确定了指针IP的初值，第16H字单元的内容确定了代码段CS的偏移值，由这两个值和程序加载时的程序段前缀PSP段地址可以完全确定程序的入口地址。因此对EXE文件，不像COM文件保存前三个字节的内容，而是保存第14H和第16H字单元的内容；修改的也不是前三个字节，而是这两个字单元的内容，使修改后第14H和等16H字单元分别为附加程序段的第一条指令在该文件中的段内偏移量和相对段值。这样，在运行该文件时，CS：IP能够指向附加程序段的入口，使附加程序能够最先执行，获得程序的控制权。
2.由于增加了附加程序段，使得加密后的EXE文件变长了，增加的长度就是附加程序段的长度。因此为了保险应该修改文件头中反应文件长度的第02H和第04H两个字单元的内容。实际上，DOS加载文件时，文件长度是根据目录表中指示的文件长度来确定的，而并没有使用文件头的第02H和第04H两个字单元，因此此处修改与否并无影响。
3.由于EXE文件的程序头中含有重定位的信息表，因此文件头不能加密，而只能加密它的装入模块。但即使这样，当DOS在加载加密了装入模块的EXE文件时，由于重定位是在程序执行前就进行的，因此会导致重定位出错，使程序不能正常运行。解决的办法是将反映重定位项数的第06字单元的内容置0，使DOS加载时不进行重定位，而把重定位的任务留给我们自己编写的附加程序。这样，当执行加密后的EXE文件时，首先执行附加程序段，若口令正确，先将加密了的EXE装入模块解密，然后像DOS加载正常EXE文件那样，利用重定位表对装入模块，对需要重新定位段值的字单元进行修改，完成重定位，然后转向原始的EXE文件执行。
(周 祥）