加密Windows CE系統

來源:互聯網
上載者:User

一直留意我著的文章的網友沒有忘記,我在《讓自己編寫的DLL載入到Slot1》文章中向所有閱讀這篇文章的網友詢問一個問題,關於signfile.exe的參數key container的設定問題,至今沒有人回答我。不過最近我已經自己研究搞定。經過實驗,實現了CE提供的可信任環境。"可信任環境"說通俗一點就是讓你定製的CE核心啟動後,只能運行核心包含的EXE、DLL模組和簽名過的EXE、DLL模組,非簽名EXE、DLL無法運行。"可信任環境"保證了你的核心的安全性,防止其他人非法研究你的核心或者非法在其上運行EXE、DLL。在講述這個技術之前,請允許我先羅嗦幾句。

下面開始講解。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(或它的某一個組件)。請確認......")。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.