突破Windows加解密禁区

Author: 黄云燕 Date: 1997-01-01

  Windows环境下的可执行文件称为“NE”格式的文件,即我们通常说的for Windows程序,它的结构比DOS系统下的可执行文件要复杂得多,而且其加载和重定位方式也和DOS系统下的“MZ”文件有很大的区别。总体上它可由MS-DOS首部,DOS插入程序段,Windows执行文件首部和具体的数据段、代码段、资源等组成。从距文件起始位置偏移量013CH处的两个字节中可以得到这个Windows执行文件首部距离文件起始位置的偏移量。Windows执行文件首部由信息块、段表、资源表、驻留名表、模块引用表、输入名表、入口表和非驻留名表组成。其中信息块中包含了各表的具体位置及加载过程中的重要参数。如入口的CS:IP,SS:SP及快装区的位置和大小等。
  大家都知道,如果要想对程序进行加密或解密,首先要弄清楚程序的入口在哪儿,然后再修改入口处的指令以达到加密或解密的目的,现在我就具体向大家介绍一种很简单而实用的方法,可对Windows下的可执行文件直接进行修改。假设我们要修改的文件为SOL.EXE,具体步骤如下:
  1.REN SOL.EXE SOL,然后DEBUG SOL
  2.D 13C可得[013C]=0400,这说明Windows首部距离文件起始地址偏移400H,加上PSP的长度得Windows首部地址为500H。
  3.D 500可以看到“NE”的标记,我们就找到Windows首部了。
  4.D 514 L 4显示83 00 08 00,即入口的CS:IP=0008:0083。
  5.D 522可得[0522H]=0040,这表示段表距离Windows首部的偏移量为0040H,即第一个段表的地址为540H。因为每个段表占8个字节,而由第四步可知CS=0008所以入口段的段表地址为0578H。
  6.D 578 L 2显示B4 01,这表示入口段距离文件起始位置的偏移量为01B4个扇区。
  7.D 532得[532H]=0004,这表示扇区的大小为2**4=10H。而由第四步可知IP=0083H。现在我们就可以算出程序入口处距离文件起始位置的偏移量为:01B4H*10H+0083H=1BC3H再加上PSP空间100H,所以入口处的地址为1BC3H+100H=1CC3H。
  8.U 1CC3可以看到入口处代码的庐山真面目
  XOR BP,BP
  PUSH B P
  CALL 0000:FFFF
  最后的工作就是修改入口处的指令,然后用W命令存盘。掌握了以上的文件修改方法后,我们就可以对任意的Windows可执行文件进行加解密工作了。比如,按照我以上向大家介绍的方法来分析用BITLOK 2.0 for Windows加密过的软件,只消一分钟的时间就可以找到其入口的指令为CALL 2864;JMP 1C83;我们只要将这条CALL 2864指令改为三条NOP指令即可完成解密工作。很容易吧!你也不妨一试。