采用英创公司的EM9280工控主板搭建的客户整机产品,由于EM9280是市场上的标准化产品,整机客户会面对保护自身知识产权这一问题,主要是针对如何保护客户自己的应用程序的问题。本文将详细介绍客户如何在EM9280通用板卡上进行用户加密认证,从而达到保护应用程序的目的。
本文认为需要进行应用程序加密的客户,已完全掌握了用Mfgtools烧写EM9280内核文件的方法。对这方面还不了解的客户,请参考光盘资料《EM9280内核烧写说明》。
EM9280产品用户加密的流程如下:
1、烧制加密码到EM9280板卡中。
EM9280支持的加密码长度从8字节到128KB字节。
1)用户可自己自行定义加密码,其长度最小为8字节,最长不超过128KB字节,并将相应的加密码生成为一个二进制文件:uid.nb0。
2)将生成好的uid.nb0文件复制到烧制EM9280内核文件的相关目录。
MfgToolsProfilesMX28 WinCE UpdateOS firmwareEM9280
3)修改MfgToolsProfilesMX28 WinCE UpdateOS firmwareucl.xml文件内容,增加烧制密码文件的操作。
Notity device to prepare receiving a raw data file with specified starting address.
Sending a user id file for authentication.
write userid.
在光盘的“烧写工具及内核”目录中,根据不同的LCD分辨率,提供了可三个支持烧写用户ID的xml文件如下:
MfgToolsProfilesMX28 WinCE UpdateOS firmwareucl_480272_uid.xml
MfgToolsProfilesMX28 WinCE UpdateOS firmwareucl_640480_uid.xml
MfgToolsProfilesMX28 WinCE UpdateOS firmwareucl_800480_uid.xml
4)一般客户可直接点击烧写批处理文件:
EM9280_480272_uid.bat
EM9280_640480_uid.bat
EM9280_800480_uid.bat
即可进行EM9280带有用户加密码的自动烧写。对有经验的客户,也可参考“3)”中的说明,自行修改ucl.xml文件,然后直接启动Mfgtools进行烧写。具体烧写的方法请参见文档《EM9280内核烧写说明》一文。需要注意的是,每次修改了ucl.xml后,必须重新启动MfgTools.exe程序。
2、应用程序中增加对于加密码的认证判断,从而达到保护应用程序的目的。
英创公司提供了一个对加密码进行认证的函数,该函数通过调用IOCTL进行认证,如果认证通过则函数很快返回,如果认证失败系统将进入死循环状态。
#include 'STDAFX.H'
#include 'WINIOCTL.H''WINIOCTL.H'
#include 'STOREMGR.H'
#define IOCTL_VERDOR_FLASH_BASE 2048
#define IOCTL_DISK_AUTHENTICATION CTL_CODE(FILE_DEVICE_DISK, IOCTL_VERDOR_FLASH_BASE + 0x14, METHOD_BUFFERED, FILE_ANY_ACCESS)
/*//////////////////////////////////////////////////////////
功能描述:对用户加密的ID数据进行验证
输入参数:
pData -- 用户验证的加密ID数据。
dwLength -- 用户验证加密数据的长度,范围:~128K字节
返回值:
TRUE -- 验证通过
-- 验证失败, 函数不返回。
///////////////////////////////////////////////////////////*/
BOOL UserAuthentication(LPBYTE pData, DWORD dwLength)
{
BOOL ret = FALSE;
HANDLE hStore;
hStore = OpenStore( _T('DSK1:') );
if( hStore==INVALID_HANDLE_VALUE )
{
printf( 'OpenStore NandFlash Error
' );
return ret;
}
// do security check
ret = DeviceIoControl(
hStore,
IOCTL_DISK_AUTHENTICATION,
(PBYTE)pData,
dwLength,
NULL,
NULL,
NULL,
NULL);
CloseHandle( hStore );
return ret;
}
全部0条评论
快来发表一下你的评论吧 !