在實際應用中,客戶可能希望對自己的程序添加驗證過程,使得無法被隨意拷貝到其它板子上使用。英創ARM系列工控主板都配有唯一指定MAC,我們可以根據MAC地址,生產加密字符串,存入KEY文件或是注冊表內。然后在程序啟動部分添加驗證代碼,驗證這個字符串,從而達到防拷貝的目的。
本文介紹MAC的獲得方式及幾種常用的加密方式。
驗證設備
在驗證MAC之前,首先應當檢查使用的板卡型號,以檢查EM9281為例,代碼如下。
添加頭文件及宏定義,此部分代碼均包含在板子對應SDK包中的bsp_drivers.h下
#include
extern"C"__declspec(dllimport) BOOLKernelIoControl( DWORDdwIoControlCode,
LPVOID lpInBuf,
DWORD nInBufSize,
LPVOID lpOutBuf,
DWORD nOutBufSize,
LPDWORD lpBytesReturned);
#defineIOCTL_HAL_BOARD_STATE_READ CTL_CODE(FILE_DEVICE_HAL, 4024, METHOD_BUFFERED, FILE_ANY_ACCESS)
#defineEM9280_BOARD_TYPE_9280 0
#defineEM9280_BOARD_TYPE_9281 1 // -> EM9281
#defineEM9280_BOARD_TYPE_9380 2
#defineEM9280_BOARD_TYPE_9283 3
#defineEM9280_BOARD_TYPE_ES9281 4 // -> ES9281
#defineEM9280_BOARD_TYPE_9287 7
#defineEM9280_BOARD_CFG_SHIFT 14
#defineEM9280_BOARD_CFG_MASK 0x3
#defineEM9280_BOARD_TYPE_SHIFT 4
#defineEM9280_BOARD_TYPE_MASK 0x7
#defineEM928X_BOARD_TYPE_BASE(v) ((v >> EM9280_BOARD_TYPE_SHIFT) & EM9280_BOARD_TYPE_MASK)
#defineEM928X_BOARD_TYPE_SUB_ID(v) ((v >> EM9280_BOARD_CFG_SHIFT) & EM9280_BOARD_CFG_MASK)
#defineEM9287_BOARD_TYPE_SUB_TYPE(v) ((EM928X_BOARD_TYPE_SUB_ID(v)==1)? EM9280_BOARD_TYPE_9281:\
(EM928X_BOARD_TYPE_SUB_ID(v)==2)? EM9280_BOARD_TYPE_ES9281: EM9280_BOARD_TYPE_9287)
#defineEM928X_BOARD_TYPE_ALL(v) ((EM928X_BOARD_TYPE_BASE(v)==EM9280_BOARD_TYPE_9287)? EM9287_BOARD_TYPE_SUB_TYPE(v):EM928X_BOARD_TYPE_BASE(v))
檢查板卡型號,以EM9281為例
BOOL bRet;
DWORD dwReturnBytes;
DWORD dwBoardInfo = 0;
dwReturnBytes = 0;
bRet = KernelIoControl(IOCTL_HAL_BOARD_STATE_READ,
NULL, 0,
(LPVOID)&dwBoardInfo,sizeof(DWORD),
&dwReturnBytes);
If(EM928X_BOARD_TYPE_ALL(dwBoardInfo)!= EM9280_BOARD_TYPE_9281)return;
獲得MAC地址
必要的頭文件和lib庫
#include"Iphlpapi.h"
#pragmacomment(lib,"Iphlpapi.lib")
VOIDGetMAC(BYTE* buf)
{
DWORD dwRetVal;
IP_ADAPTER_INFO AdapterInfo[4];
ULONG OutBufLen =sizeof(IP_ADAPTER_INFO);
GetAdaptersInfo(&AdapterInfo[0], &OutBufLen);
GetAdaptersInfo(&AdapterInfo[0], &OutBufLen);
/*if(strcmp(AdapterInfo[0].AdapterName, "ENET1") != 0)
{
return;
}*/
memcpy(buf, AdapterInfo[0].Address, 6);
}
BYTE mac[6];
GetMAC(mac);
char macstr[16];
sprintf(macstr, "%02x:%02x:%02x:%02x:%02x:%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
加密策略
英創所有嵌入式板卡都擁有唯一的MAC地址,在對MAC地址加密后,生成唯一的加密KEY。同時程序中判斷板卡信息,并驗證這個加密KEY。這樣可以保證程序必須處于正確的板卡中,并擁有正確的KEY文件,才能執行。
為了增加安全性,加大KEY文件破譯難度,可以考慮以下處理
1、將MAC地址與常量字符串混合后,再進行加密,生成加密KEY。
2、多種加密手段結合使用,多次加密。
3、驗證失敗后“軟”關閉程序,可以做延遲處理,并可以考慮重啟設備,增加暴力破解KEY的難度。
加密程序流程
獲得板卡MAC地址à 執行加密函數à 生成KEY文件置入板卡中
解密程序流程
查詢板卡MACà執行加密函數à讀取KEY文件中密鑰并對比à判斷驗證是否成功并進行后續執行
或
讀取KEY文件中密鑰à執行解密函數à查詢板卡MAC并對比à判斷驗證是否成功并進行后續執行
加密方法
常用的加密方法有很多,可以參考文章《常用加密方法及代碼》。同時英創提供這些加密算法相關測試例程,如有需要,可以聯系英創工程師獲得。
-
嵌入式主板
+關注
關注
7文章
6085瀏覽量
35226
發布評論請先 登錄
相關推薦
評論