上一篇文章说到AUTORUN很好用,麻烦是别人可能利用它做坏事。别人可能利用它来运行他的危险程序,偷取资料甚至破坏设备,甚至你自己的AUTORUN也有可能被病毒感染。一个对付的做法是把AUTORUN放到一个不容易猜到的目录下,起个古怪的名字。不能从根本解决问题,但比没有强。根本的解决办法是给AUTORUN加数字签名。Windows Mobile设备好像内置就支持程序的数字签名。Windows CE没有直接支持,但也提供了一些必要的组件,利用这些组件,我们可以自己实现数字签名功能。过程分三步,生成密钥和给AUTORUN.EXE签名,以及验证AUTORUN.EXE:
- 生成密钥
- 在PC上用密钥生成工具生成一对公钥/私钥;
- 私钥妥善保管在某个地方,给AUTORUN.EXE生成数字签名用;
- 公钥嵌入到CE kernel里,验证AUTORUN.EXE的数字签名用。
- 给AUTORUN.EXE签名
- AUTORUN程序的开发和普通的windows CE完全一样;
- EXE编译出来后,用签名工具给EXE附加上它的签名,做成AUTORUN.EXE;
- 使用AUTORUN.EXE
- 在CE设备上插入U盘时,系统检测U盘上特定目录下是否存在AUTORUN.EXE;
- 若存在则用放在KERNEL里的公钥验证它的签名;
- 若相符则运行AUTORUN.EXE。
借用Wikipedia的图示,数字签名的制作和验证过程如下:
在WinCE上实现程序的数字签名,有几个步骤,如下:
- 用Visual Studio提供的制作证书工具makecert.exe,生成密钥:
以上命令指定SHA1算法,密钥长度1024位,生成证书文件mycert.cer和私有密钥文件mycert.pvk
- cert2spc.exe把cer格式文件 (X.509 certificate)转换成spc格式(Software Publisher Certificate)
- 用pvk2pfx.exe把.spc文件和.pvk文件合并成一个pfx格式(Personal Information Exchange)文件,1234是保护pfx文件的密码
- 给AUTORUN签名用signfile.exe:
注意以上命令在给autorun.exe签名的同时还以C头文件的形式导出了公钥(pubkey.h)。pubkey.h要放到BSP中,验证AUTORUN.EXE的数字签名时要用到。公钥导出一次即可。
在BSP中验证签名,需要实现OEMCertifyModule和OEMCertifyInit。签名的验证算法CE在loadauth.lib里提供,具体用法可以参考MSDN,这里不详细讲了。
上面用到的命令中,signfile.exe是我在Platform Builder里提供的源代码(D:\WINCE500\PUBLIC\COMMON\OAK\TOOLS\SIGNFILE\signfile.c)基础上改的,PB提供的代码只能从windows注册表中获取证书,这对于证书的管理和使用都不方便,我修改的版本可以从pfx文件读取证书。其他工具都可以从网上找到。或者从我这里下载(包括我修改的singfile.c代码):
https://files.cnblogs.com/singlerace/KEYTOOL.zip