工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > VC > 正文
加密Windows CE系统
[文章信息]
作者:付林林
时间:2004-12-19
出处:天极网
责任编辑:方舟
[文章导读]
Windows CE提供了一种机制,使定制操作系统内核的开发者能够保护自己定制的内核,加入了这中机制后
advertisement
热点推荐
· 真没想到VB也可以这样用之指针技术
· 禁止QQ登录的方法
· 给你的XML文件做个数字签名
· ImageReady制作“焰火”小动画
· Java加密和数字签名编程快速入门
[正文]
  付林林:

  2001年计算机专业毕业。从毕业起一直从事软件开发工作。目前从事 Windows CE 下操作系统内核定制和应用程序开发。在实际工作中积累了CE下开发的一些经验。希望和 CE 下开发者交流、探讨,更希望你们能不吝赐教。我的EMail:windowsce@tom.com

  进入作者专栏

  本文作者将在天极社区嵌入式开发版回答读者的疑问。

  一直留意我著的文章的网友没有忘记,我在《让自己编写的DLL加载到 Slot1》文章中向所有阅读这篇文章的网友询问一个问题,关于signfile.exe的参数key container的设置问题,至今没有人回答我。不过最近我已经自己研究搞定。经过实验,实现了CE提供的可信任环境。"可信任环境"说通俗一点就是让你定制的CE内核启动后,只能运行内核包含的EXE、DLL模块和签名过的EXE、DLL模块,非签名EXE、DLL无法运行。"可信任环境"保证了你的内核的安全性,防止其他人非法研究你的内核或者非法在其上运行EXE、DLL。在讲述这个技术之前,请允许我先罗嗦几句。

  目前在国内有十多家网站转载了我的部分文章(大多数非我授权),而读者不能阅读到我所有的文章。在此我强调一点,我只在www.yesky.com和www.vckbase.com开设专栏,只有专栏中的文章才是最全的,到撰稿为止我在专栏中发表的文章数量算本篇文章一共有27篇。这27篇文章都是无偿地提供给这两家网站。我的专栏的链接地址如下:
yesky:http://www.yesky.com/SoftChannel/72340168526266368/20040908/1851586.shtml
vckbase:http://www.vckbase.com/vckbase/columnist/fllsoft

  下面开始讲解。Windows CE提供了一种机制,使定制操作系统内核的开发者能够保护自己定制的内核,加入了这中机制后,所有nk.bin解开的模块(EXE、DLL、OCX)都能够正常运行,存放在永久存储器上的模块在开发者数字签名后也能够运行,而没有数字签名的模块则不能运行。读者有兴趣可以查看CE帮助文档中标题为《Create a Trusted Environment》的文章。言简意赅,下面就开始讲解如何实现可信任环境。

  1、得到钥容器

  得到钥容器(key container)的方法是调用Win32 Security API。先得到CSP(cryptographic service provider),再得到key container。默认的CSP为Microsoft Base Cryptographic Provider。默认的key container以当前登录用户名为名称。如果你熟悉加密方面知识的话可以另外调用其他CSP。在此我们以Microsoft Base Cryptographic Provider默认的key container为signfile需要的钥容器。

  2、对模块签名

  signfile.exe用于对模块签名。这个文件在CE安装目录里(包括源码)可以找到,下面是参数说明:

   -o<out filename> 输出签名数据到指定的文件
   -k<CAPI key container> 指定CAPI 钥容器
   -p<output C file to hold CAPI public key > 输出公钥到指定文件(内容为一个C语言数组)
   -s<string to sign and embed in signature> 嵌入指定字符
   -a 在指定的PE格式的文件中附加签名数据
   -f<PEFile > 要签名的文件(EXE、DLL)

  假如我们要将myproc.exe签名,假设我们以fulinlin名字在桌面windows 上登录,那么在命令行输入如下命令:

signfile -fmyproc.exe -a -kfulinlin -pmyproc.txt

  上面参数告诉signfile.exe 用钥容器fulinlin中的私钥将文件myproc.exe签名,并且将公钥存放到名为myproc.txt的文件中。加密具体过程很复杂,我对加密不了解,只能理解到这么低级的程度。如果说错了希望读者指教。

  3、编写检验函数

  编写检验函数前请参考CE的帮助文档中标题为《Verifying a Signature》的文章。我们只需要把这篇文章中最下面的代码复制到CE安装目录下定义OEMInit函数的.c文件中。因为我的调试平台属于X86系列,所以定义OEMInit函数是在cfwpc.c文件中。为了使读者能够简单弄懂这个机制,我把相关函数、变量做一个简单说明,如下:

////初始化公钥函数
extern BOOL InitPubKey(const BYTE *KeyBlob, DWORD cbKeyBlob);

/////这两个指针是在loader.c文件中定义的,loader.c实现加载器的功能,加载模块(EXE、DLL)。这两个指针指向两个函数,pOEMLoadInit
////指向的函数的功能是:每当加载一个模块的时候这个函数决定是否需要验证。TRUE表示需要,FALSE不需要。pOEMLoadModule指向的
////函数的功能是:验证将要加载的模块是否具有合法的签名。有三个返回值,具体请看帮助文档。
extern OEMLoadInit_t pOEMLoadInit;
extern OEMLoadModule_t pOEMLoadModule;

/////以"CertifyModule"开头的函数为系统自带的验证函数。有了这三个函数你就不用去了解加密知识了。
extern BOOL CertifyModuleInit(void);
extern BOOL CertifyModule(PBYTE pbBlock, DWORD cbBlock);
extern BOOL CertifyModuleFinal(PBYTE *ppbSignData, PDWORD pcbSignData);

  注意公钥数据g_bSignPublicKeyBlob,要把signfile导出的公钥覆盖代码中原有的g_bSignPublicKeyBlob 。

  4、编译并测试

  用PB打开一个内核工程,进入命令行状态(菜单open build release directory)。键入"build -c"和"sysgen i486oal",因为cfwpc.c是i486oal.lib的一部分。之后重新编译内核。测试方法是把任何一个CE下运行的EXE复制一份,一份不改变,另一份由signfile签名。然后把这两个文件复制到永久存储器上运行。测试结果签名的能运行,而不签名的不能运行(弹出对话框显示"找不到XXX(或它的某一个组件)。请确认......")。



天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 
发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • 民营家电商排队造手机 设备商全面杀入
  • 英特尔澄清杨旭任职传闻 官方没宣布此消息
  • 国资委河北密制联通拆分方案
  • 垃圾邮件害人害企害国 清除垃圾邮件不手软
  • 中兴携手阿尔卡特 全球逐鹿CDMA
  • 用友总裁王文京:誓将ERP变成“大众消费”
  • 香港消费者委员会:数码相机最贵未必最好
  • 外电称中兴正评估西门子手机业务 或能并购
  • Advertisement

    天极无线


    奇妙科幻|美好风光|清风车影|漫画卡通|星座生肖|明星写真|动物世界
    老鼠爱大米
    挥着翅膀的女孩
    女人味
    栀子花开
    白月光
    刚刚好
    江南
    快乐崇拜
    亲爱的你怎么不在我身边
    小薇
    2002年的第一场雪
    有多少爱可以重来
    我的地盘
    七里香
    情人
     
    老鼠爱大米 老板电话
    冲动的惩罚 七里香
    我不是黄蓉 女生撒娇
    盛夏的果实 坚持到底
    孤单北半球 眉飞色舞
    挪威的森林 可爱女人
    最浪漫的事 老板电话

    CSEEK搜索