1. 程式人生 > >為sys/cat檔案生成測試簽名

為sys/cat檔案生成測試簽名

    這幾天想測試一下使用DpInst安裝驅動,由於驅動程式沒有簽名因此安裝失敗,藉此研究一下如何為Sys/cat檔案生成測試簽名。本文參考了看雪論壇上的一篇文章:win x64平臺驅動測試數字簽名,並對其中一些錯誤(可能是作者前後兩次實驗導致的偏差)做了修改。

    驅動在開發/測試階段時是沒有數字簽名的,所以一般都會開機後進入F8,選擇禁止數字簽名強制,但是這個辦法的麻煩之處就是每次開機都要這樣操作,要是虛擬機器的話,一不小心錯過了會很麻煩。MSDN上對這個有個解決方案就是使用測試簽名。假設編譯好的驅動的位置是: E:\WinDDk\my_test\objchk_win7_amd64\amd64

1. 製作一個測試使用的數字證書: 
使用管理員許可權開啟命令列(可以用DDK提供的Checked/Free Build Environment)進入驅動的路徑,然後輸入以下命令:
makecert -r -pe -ss PrivateCertStore -n CN=Contoso.com(Test) My_Test.cer
(注:PrivateCertStore和Contoso.com(Test)可以隨意命名),這個時候在目錄下會生成一個My_Test.cer的測試證書;如果不使用管理員許可權可能會失敗;如果使用cmd可能會失敗;

2. 修改INF檔案並生成目錄檔案:
修改INF檔案[version]節,在這個節點的最後增加一個
CatalogFile.NtAMD64 = My_Test_AMD64.cat
需要注意的是這個CatalogFile只有CatalogFile.NtAMD64 CatalogFile.Nt CatalogFile三個情況;然後將INF檔案也放到驅動sys檔案的路徑下
在Checked/Free Build Environment輸入下面的命令:
Inf2cat.exe /driver:E:\WinDDk\my_test\objchk_win7_amd64\amd64\ /os:7_x64

3. 對cat檔案簽名:
使用以管理員許可權開啟WDK帶的命令列,定位到驅動程式路徑下,輸入下面的命令:
Signtool sign /a /v /s PrivateCertStore /n Contoso.com(Test) /t http://timestamp.verisign.com/scripts/timestamp.dll My_Test_AMD64.cat
這裡需要聯網,不聯網會有一個警告,因為它需要去生成時間戳;另外,執行Signtool時的/s和/n引數後面跟的字串要分別對應執行makecert時的-ss -n引數的內容(原作者這塊內容可能筆誤寫錯了,導致簽名失敗)

4. 註冊測試數字證書:
定位到驅動檔案路徑下,輸入以下命令:
certmgr.exe /add My_Test.cer /s /r localMachine root

5. 對驅動檔案簽名:
定位到驅動檔案路徑下,輸入以下命令:
Signtool sign /a /v /s PrivateCertStore /n Contoso.com(Test) /t http://timestamp.verisign.com/scripts/timestamp.dll xxxx.sys
這裡同樣需要聯網,不聯網會有一個警告,因為它需要去生成時間戳;

6. 安裝測試簽名:
在目標機上,將xxx.sys xxx.inf My_Test.cer My_Test_AMD64.cat,以及certmgr.exe放在一個路徑下,然後以管理員許可權開啟CMD命令列定位到這個目錄,

輸入以下命令來註冊證書以及開啟測試模式:

(這兩步很重要,筆者嘗試過在沒有註冊證書的目標機上用DpInst來安裝簽過名的sys和cat,結果就是沒有成功安裝驅動包)
certmgr.exe /add My_Test.cer /s /r localMachine root
certmgr.exe /add My_Test.cer /s /r localMachine trustedpublisher

cd c:\windows\system32\
bcdedit.exe /set TESTSIGNING ON

測試模式開啟一次後,即使重啟電腦也不用再次設定,除非顯式的關閉它;窗體右下角會提示目前是在測試模式,關閉的命令是bcdedit.exe /set TESTSIGNING OFF
需要注意的事項:
1. 如果目標機上沒有certmgr.exe,那麼可以從主機上直接拷貝一個64位的certmgr.exe過去的;
2. 如果重新生成了sys檔案而沒有修改inf檔案的話,那麼只需要在生成sys檔案後再次執行對驅動檔案的重新簽名即可;測試證書和目錄檔案都不需要重新生成;