第89章 修改可执行文件

89.1 文本字符串

除了那些经过加密存储的字符串以外,我们可以使用任何一款的hex editor直接编辑C字符串。即使那些不了解机器码和可执行文件具体格式的人,也可以使用这项技术直接编辑可执行程序中的字符串。修改后的字符串,其长度不得大于原来字符串的长度,否则可能覆盖其他的数据甚至是其他指令。在MS-DOS盛行的时代,人们普遍使用这种方式直接用译文替换软件中的外文文字。至少在20世纪80年代和90年代的前苏联,这种技术十分流行。所以,那个时代也出现了各种古灵精怪的超短缩写:预定长度的字符串存储空间可能容纳不下完整的译文,所以软件翻译人员不得不绞尽脑汁压缩译文的长度。

在修改Delphi程序的字符串时,有时还要调整字符串的长度。

89.2 x86指令

修改可执行文件中汇编指令的方式有以下几种:

很多软件采用了防范修改的技术。这种功能通常都由“读取可执行文件代码”和“校验和(checksum)检验”两个步骤分步实现。即是说,要实现防修改机制,程序首先要读取(加载到内存里的)程序文件。我们可设置断点,解析其读取内存函数的具体地址。

tracer工具可以满足这种调试需求。它具有BPM(内存断点)功能。

在修改程序时,不得修改PE可执行文件的relocs(参见本书的68.2.6节)。Windows的加载程序会使用新的代码覆盖这部分代码。如果使用Hiew打开可执行程序,会发现这部分代码以灰色显示(请参考图7.12)。万不得已的时候,您可使用跳转指令绕过reclos,否则就要编辑relocs的数据表。