记得在汉化新世纪的技术论坛中有人提到过去除软件数字签名方法,还为此提供了去除签名的工具,但是,用此工具去除数字签名后,无法再为此程序重新添加数字签名,对此我就怀疑此工具没有彻底删除数字签名。但是一直以来我并没有遇到此类问题,因此也没有对此进行深究。
前不久做了一个商业汉化,对方需要重新添加数字签名,在对我所提供的汉化后的程序重新进行数字签名时,却发生问题,无法添加,问我解决的方法。对此,我就怀疑对方提供的原始文件已经进行过了数字签名,因此要求对方提供一个确认尚未进行过汉化签名的程序版本给我,以便于我进行对比研究。
事实也证实了我的猜测,请看下面的对比图 对比二个文件,我们可以看到二个文件,除了文件头部有二处地方稍有不同,以及在程序的尾部被添加了一段代码外,其他地方并无不同之处。同时我又对其他几个文件进行了对比,除了偏移量不同外,其他和上图的情况一模一样。也就是说,我们可以将程序尾部附加的代码去除,并将程序头部的这二处地方填“00”就可以将签过数字签名的程序恢复到未签名状态。
那么,如何来找到这三处地方,如何来删除它们呢。最好找的是程序的尾部那部分代码,因为它们被附加在程序的最后,因此我们可以通过找到程序原始的结束位置,就可以确定程序被附加数据的大小。看下图。 这是程序中的的区段情况,可以看到这个程序的最后一个区段是资源段,它的资源段数据大小是002C7000,而资源段的开始位置(数据入口)是00180000,将这二个相加就能得出原始程序的结束偏移量为:00447000。也就是说在这个位置之后的数据是被数字签名添加上去的代码。那么这段代码有多长呢,见下图: 我们可以看到,它的结束位置是00448668,和上面的00447000相减后就得到1668,1668和00447000都是十六进制数字,将它们写成程序中的代码就成了6816和00704400,而这个就是我们刚才发现的文件头部不同的地方之一:007044006816,也就是说,007044006816代表的是数字签名附加的代码的开始位置和长度。
那么,我们又如何来确定第一个不同的地方呢,其实这个更简单,因为它和第二个不同的地方相隔的位置是固定的,找到第二个后,往上推60个字节就找到了。
好了,让我们总结一下去除数字签名的方法,首先根据程序的原始结束位置,得出数字签名附加代码的开始位置和长度,然后根据这二个数值找到需要删除的第二处代码的内容,找到需要删除的内容后,往上推六十个字节,就能找到需要删除的第一处代码。删除这三处代码后,我们的程序也就恢复到了数字签名前的状态了。
|