http://blog.sina.com.cn/s/blog_69956eab0102w3bb.html
经常有网友在问,WINDOWS下除了PE文件,能不能对任一格式的文件进行数字签名?为什么一个PE文件,右键“属性”没有“数字签名”标签卡,但仍然可以通过其他软件检测出该程序已签名?
今天,就为大家做一个介绍。这所有的一切,皆是CAT文件的功劳。
(本文仅介绍CAT文件之于数字签名的作用,其他功能不涉及。)
什么是CAT文件?我们来看张图。
“安全编录”里有两个项目,这其实就对应着两个文件,以上图为例,标记为“89E4...”的这一项就代表着该文件(demo.txt)通过SHA1散列算法得到的Hash值是89E4...
我们只要对这个CAT文件进行数字签名,再辅以一定的策略,那么这两个文件就能被系统识别为已签名,效果和PE文件的内嵌签名一致。
下面,就先介绍这个CAT文件如何生成。
两种方法:1、使用数字证书厂商提供的图形化工具,这类的软件有WoSign的《沃通代码签名工具》、TrustAsia的《数字签名工具专业版》等;2、借助Microsoft的命令行程序手工制作。这里向大家介绍第二种方法。
环境:有两个文件,demo.txt和demo.exe,通过CAT文件实现数字签名。
如图,制作一个文本文件cat.txt。
说明:第四、第五行后的TxtFile、ExeFile是起一个标识作用,大家可以起一个自己喜欢的名称。
保存后,使用微软的makecat.exe文件,将这个文本文件转换成CAT文件。
打开demo.cat文件
系统提示“该安全编录没有经过数字签名,因此不能被验证。”
接下来,我们需要使用自己的数字证书(含私钥),借助一些工具软件,对CAT文件进行代码签名,工具软件有上文提及的WoSign的《沃通代码签名工具》、TrustAsia的《数字签名工具专业版》,也可以使用笔者制作的《signtool GUI》。这里以微软的signtool.exe对demo.cat进行代码签名。
数字签名的参数,这里暂且不做讲解了。
现在再打开已代码签名的demo.cat,系统提示“该安全编录有效”。
右键单击demo.cat,选择“属性”——“数字签名”,我们可以查阅签名方信息。
至此,我们已经完成了对编录文件的签名。下面,以demo.txt为例,介绍如何验证文本文件的签名(工具仍然以微软的signtool.exe为例)。
通过CAT文件来代码签名文件,这种方式的签名验证和传统的内置式签名,略有区别。输入以下命令。
/pa 指定应使用默认认证码验证策略,如果未指定 /pa 选项,签名工具将使用 Windows 驱动程序验证策略;
/c 通过名称指定目录文件,本例中demo.cat为安全编录文件。
如果demo.txt被修改了,签名将失效。
提示:签名失效并非指demo.cat文件的代码签名失效。
从以上的演示中,大家不难发现,如果每次验证签名还要指定一个安全编录文件,有些繁琐,那么还有没有更便捷办法?我们的系统C:\Windows\System32\catroot下有好多CAT文件?这之间有没有什么关联?
对的,我们可以将demo.cat安装入系统的安全编录池。
这个“安装”的动作,并不是简单地将这个文件复制到这个目录中,
执行以下命令(需管理员权限):
安装完毕后,在验证代码签名的时候,我们可以执行以下命令:
/a 指定可以使用所有方法来验证文件。首先,搜索目录数据库以确定是否在目录中对文件进行签名。如果未在任何目录中对文件进行签名,签名工具将尝试验证文件的嵌入签名。验证可以或不能在目录中进行签名的文件时,建议使用该选项。 这些文件的示例包括 Windows 文件或驱动程序。
到此,我们完成了对一个非PE文件的代码签名和签名验证。事实上,这样的数字签名方式更灵活,这种方式在驱动程序的数字签名场景中,应用非常广泛。
回顾:
实现本例所需准备的素材:1、代码签名数字证书(含私钥);2、互联网接入(数字时间戳用);3、微软的数字证书相关命令行工具:signtool.exe、makecat.exe等。
本文粗略地介绍下了安全编录文件在数字签名方面的一些知识,不足之处,敬请指正。