有时候我们要修改/替换某些脚本系统里面的字符串,而这些字符串与指令都是以穿插的形式存放在脚本编译后生成的二进制文件的内部。如果修改的长度小于等于原来的长度,那就可以直接在上面修改了,不足的用空白字符什么的补完就行了。但是碰到超出原来长度的就没那么简单了,因为那些二进制指令代码里面可能存在各式各样的跳转指令,一旦改动了文件长度就会导致运行异常。
当然,你可以通过分析 exe 来搞懂那些指令的意思,至少要把所有与位置有关的指令格式搞出来。那需要不停的调试,得到所有与位置相关的指令格式后,写一个 HEX2TXT 的程序,然后再写一个 TXT2HEX 的程序。这些程序很难有通用性,而且调试也要花一定的时间和精力,毕竟东西是人家的,人家想怎么改就怎么改,研究这个也没有什么太大的意义。
很容易想到的就是用外挂的文本库实现运行时的替换,当然我这里说的不是那种根据原始字符串来匹配查找新字符串的替换(因为某人说了,在不同的环境下,相同的语句可以有不同的意思,所以存在一对多的情况)。因为无法把超出原来长度的字符串放进去,所以我们得改变一下思路,把其他东西放进去。
很简单,把数字放进去就可以了,因为 4 个字节的整数可以表示 4G 的范围的数,所以那样的东西放进去一定可以满足空间长度的需要。而这些数字表示的就是外部文本库里对应文本的编号索引。好了,现在我们需要一个导出原始文本和偏移的工具和一个把翻译文本的索引号写回去的工具就可以了。由于都是简单的操作,所以这些工具将有很大的可能是通用的。
接下来就在 exe 上做文章了,根据具体系统的不同,有不同的改法。大致上就是在他读取完字符串的后面再加上我们的根据索引来替换文本的程序段了。这个比调试一整个 VM 要简单的多了。