關(guān)鍵詞: 網(wǎng)絡(luò)考試; 客戶端; U盤作弊; USB端口監(jiān)視
無紙化考試系統(tǒng)的模式通常有單機(jī)版模式、C/S模式和B/S模式三種,無認(rèn)哪種模式均要有客戶端,而考生必須在客戶端上完成其考試內(nèi)容。目前USB存儲設(shè)備特別是U盤的存儲容量大、存取速度快、體積小、價(jià)格低廉,普及程度也越來越高,在考試中使用U盤作弊現(xiàn)象時(shí)有發(fā)生。由于考生在考試過程中使用U盤的隱蔽性極高,監(jiān)考老師很難發(fā)現(xiàn)。目前大多數(shù)考試系統(tǒng)的客戶端并沒有對USB端口進(jìn)行管理的功能。“網(wǎng)絡(luò)考試客戶端USB端口監(jiān)視系統(tǒng)”(后文簡稱系統(tǒng))就是實(shí)現(xiàn)在考試過程對考試客戶端的USB端口進(jìn)行全程監(jiān)視,一旦客戶端有USB設(shè)備接入,系統(tǒng)即刻鎖屏、封鎖鍵盤,發(fā)出使用USB設(shè)備的提示警告。本系統(tǒng)經(jīng)過我校進(jìn)行的“試點(diǎn)高校網(wǎng)絡(luò)教育部分基礎(chǔ)課程統(tǒng)一考試”多次使用實(shí)驗(yàn)表明,該系統(tǒng)在考試過程中能有效地監(jiān)控USB端口,杜絕了考生使用U盤的現(xiàn)象,從而保證考試的公正、公平和權(quán)威性。
1 系統(tǒng)功能要求
(1)系統(tǒng)要能識別從計(jì)算機(jī)任何一個(gè)USB端口接入的移動(dòng)存儲設(shè)備,如U盤等設(shè)備。對于非存儲類的USB設(shè)備,如:USB接口的打印機(jī)、掃描儀等,不能誤判作移動(dòng)存儲設(shè)備。
(2)鎖屏。一旦有U盤接入,系統(tǒng)能立即響應(yīng),并做出相應(yīng)的處理。用一個(gè)無標(biāo)題、無邊框、無關(guān)閉按鈕、最大化顯示的窗體覆蓋在所有窗體和任務(wù)欄的前面實(shí)現(xiàn)鎖屏。
(3)封鎖鍵盤。封鎖鍵盤就是使用戶鍵盤上的鍵失效,尤其是一些特殊功能組合鍵,如:Ctrl-Alt-Delete、Alt-Tab、Alt-Esc、Alt-F4、Windows-Key。
(4)關(guān)閉任務(wù)欄和開始菜單。
(5)封鎖狀態(tài)解鎖。系統(tǒng)有提供給系統(tǒng)管理員或監(jiān)考人員解鎖的功能,解鎖時(shí)要輸入特定的解鎖密碼。
(6)解鎖密碼管理功能。系統(tǒng)提供由系統(tǒng)管理員使用的密碼維護(hù)、修改、重置和忘記密碼的處理功能。
2 系統(tǒng)總體設(shè)計(jì)
2.1 系統(tǒng)組成
系統(tǒng)主要由USB端口監(jiān)視系統(tǒng)和密碼維護(hù)系統(tǒng)兩部分組成。其組成結(jié)構(gòu)如圖1所示。
2.2 USB端口實(shí)時(shí)監(jiān)視系統(tǒng)組成結(jié)構(gòu)
USB端口實(shí)時(shí)監(jiān)視系統(tǒng)由核心模塊、USB端口監(jiān)視模塊、屏幕、鍵盤加鎖模塊、鍵盤解鎖模塊、記錄/讀取系統(tǒng)USB使用狀態(tài)模塊、密碼解鎖處理模塊和重啟處理模塊組成。其組織結(jié)構(gòu)如圖2所示。
2.3 密碼維護(hù)系統(tǒng)組成結(jié)構(gòu)
密碼維護(hù)系統(tǒng)由密碼修改和使用初始密碼兩部分組成。如圖3所示。
密碼修改提供給管理員修改維護(hù)解鎖密碼。遺忘解鎖密碼時(shí),先使用初始密碼功能將解鎖密碼設(shè)置為初始密碼,然后再修改成指定密碼。
該系統(tǒng)為一個(gè)相對獨(dú)立的子系統(tǒng),由系統(tǒng)管理員掌管使用。
3 USB端口監(jiān)視系統(tǒng)設(shè)計(jì)
為了不和考試系統(tǒng)爭搶資源,系統(tǒng)被設(shè)計(jì)成后臺運(yùn)行方式,以中斷方式獲取機(jī)器USB端口狀態(tài)變化。采用進(jìn)程保護(hù)技術(shù)進(jìn)行系統(tǒng)自我保護(hù),使系統(tǒng)在運(yùn)行時(shí)不被考生強(qiáng)行終止,提高了系統(tǒng)的安全性。當(dāng)考生在考試過程中插入U(xiǎn)盤時(shí),系統(tǒng)自動(dòng)彈出鎖屏窗體,并在窗體中顯示考生已使用U盤的提示信息。鎖住鍵盤,記錄U盤的狀態(tài)信息,即使考生撥掉U盤,系統(tǒng)自鎖也不撤消。若考生用RESET開關(guān)強(qiáng)行重啟機(jī)器或強(qiáng)行關(guān)機(jī)后再開機(jī),當(dāng)Windows系統(tǒng)啟動(dòng)完成后,系統(tǒng)仍然處于自鎖狀態(tài)。只有當(dāng)監(jiān)考老師用解鎖命令和解鎖密碼解鎖后,系統(tǒng)才恢復(fù)到正常狀態(tài)。
3.1 USB端口監(jiān)視模塊設(shè)計(jì)
USB端口監(jiān)視模塊是系統(tǒng)的核心模塊之一,也是系統(tǒng)的重要模塊。設(shè)計(jì)流程如圖4所示。
系統(tǒng)運(yùn)行后,模塊即進(jìn)入工作狀態(tài),為了盡量少占用系統(tǒng)資源,模塊以中斷方式獲取機(jī)器USB端口狀態(tài)變化,一旦發(fā)現(xiàn)端口接入U(xiǎn)SB移動(dòng)存儲設(shè)備隨即進(jìn)行處理。
當(dāng)發(fā)現(xiàn)端口有USB設(shè)備接入后,隨即讀取此設(shè)備的設(shè)備類型特征碼。根據(jù)其設(shè)備類型特征碼判斷此設(shè)備是否是USB移動(dòng)存儲設(shè)備。如果是移動(dòng)存儲設(shè)備,則調(diào)用其后續(xù)模塊。否則,不做處理。
3.2 鎖屏設(shè)計(jì)
鎖屏模塊是使系統(tǒng)呈現(xiàn)在考生面前的模塊。設(shè)計(jì)流程如圖5所示。
模塊被調(diào)用后,首先隱藏任務(wù)欄,關(guān)閉開始菜單,然后以白色、無邊框、無標(biāo)題欄、無關(guān)窗體控制按鈕的窗體形式顯示在所有窗體的最前面,遮蓋住Windows的任務(wù)欄,并在窗體中央顯示“正在使用USB設(shè)備... 系統(tǒng)自鎖。請與監(jiān)考老師聯(lián)系”字樣,提示考生由于插入了U盤從而系統(tǒng)自鎖了。
3.3 鎖鍵盤設(shè)計(jì)
鎖鍵盤模塊的執(zhí)行結(jié)果呈現(xiàn)在考生面前的是鍵盤處于失效。本模塊被調(diào)用后,將封鎖鍵盤上的所有字母鍵、功能鍵和組合鍵,唯一開放的鍵是F12鍵,是輸入解鎖密碼的入口鍵。
其功能是:
(1)封鎖鍵盤上的所有單鍵,只留F12鍵。
(2)封鎖Ctrl-Alt-Delete組合鍵,禁止打開Windows任務(wù)管理器。
(3)封鎖Windows-Key(微軟鍵),禁止打開開始菜單。
(4)封鎖Alt-F4組合鍵,禁止用此鍵關(guān)閉本程序。
(5)封鎖Alt-Tab、Alt-Esc組合鍵,禁止切換任務(wù)窗體。
在封鎖鍵盤模塊設(shè)計(jì)中使用到了鉤子(Hook)技術(shù)。系統(tǒng)使用鍵盤鉤子截獲鍵盤消息,在鉤子函數(shù)中判斷鍵盤消息中的鍵是否需要屏蔽鍵,如果需要屏蔽鍵,則不將此消息發(fā)送到窗體,從而達(dá)到屏蔽鍵盤的目的。由于系統(tǒng)需要屏蔽的鍵中有Windows-Key,而使用普通的鍵盤鉤子不能捕捉到Windows-Key鍵。所以系統(tǒng)使用了底層鍵盤鉤子,即全局鍵盤鉤子。
安裝鍵盤鉤子:
[DllImport("user32", EntryPoint = "SetWindowsHookExA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int SetWindowsHookEx(int idHook, // 鉤子的類型,即其處理的消息類型。
GlobalKeyboardProcDelegate lpfn, // 如果dwThreadId參數(shù)為0 或是一個(gè)由別的進(jìn)程創(chuàng)建的線程的標(biāo)識,lpfn必須指向DLL中的鉤子子程。
int hMod, // 應(yīng)用程序?qū)嵗木浔?biāo)識包含lpfn所指的子程的DLL。
int dwThreadId);
其中:GlobalKeyboardProcDelegate是處理鍵盤鉤子截獲的鍵盤消息的代理函數(shù)。設(shè)計(jì)如下:
public int GlobalKeyboardProc(int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam)
{
bool keyEven = false;
switch (wParam)
{
case WM_KEYDOWN:
case WM_KEYUP:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
keyEven = (((lParam.vkCode == 0x09) && (lParam.
flags == 0x20)) | // Alt+Tab
((lParam.vkCode == 0x1B) && (lParam.flags ==
0x20)) | // Alt+Esc
((lParam.vkCode == 0x1B) && (lParam.flags ==
0x00)) | // Ctrl+Esc
((lParam.vkCode == 0x5B) && (lParam.flags ==
0x01)) | // Left Windows Key
((lParam.vkCode == 0x5C) && (lParam.flags ==
0x01)) | // Right Windows Key
((lParam.vkCode == 0x73) && (lParam.flags ==
0x20)) | // Alt+F4
);
break;
}
if (keyEven == true)
{
return 1;
}
else
{
return CallNextHookEx(0, nCode, wParam, ref lParam);
}
}
卸載鍵盤鉤子:
[DllImport("user32", EntryPoint = "UnhookWindowsHookEx", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int UnhookWindowsHookEx(int hHook);
轉(zhuǎn)到下一個(gè)鉤子:
[DllImport("user32",EntryPoint="CallNextHookEx", CharSet=
CharSet.Ansi, SetLastError=true,ExactSpelling= true)]
public static extern int CallNextHookEx(int hHook, int nCode, int wParam, ref KBDLLHOOKSTRUCT lParam);
4 系統(tǒng)自身保護(hù)及運(yùn)行
由于考生在考試過程中的作弊現(xiàn)象時(shí)有發(fā)生,因此監(jiān)考和作弊考生是一對不可避免的矛盾,相互存在著一
定斗智斗勇現(xiàn)象。系統(tǒng)在一定程度上也充當(dāng)了監(jiān)考的角色,因此它就需要具有一定的自身保護(hù)能力,而不被考生終止運(yùn)行。系統(tǒng)采用如下幾種保護(hù):
(1)用戶終止保護(hù)
系統(tǒng)被設(shè)計(jì)成一個(gè)后臺運(yùn)行系統(tǒng),運(yùn)行后不顯示任何窗體,只在系統(tǒng)的托盤中顯示一個(gè)圖標(biāo),而且不提供右擊彈出菜單和雙擊顯示主程序窗體的功能。從而使考生不能直接終止本程序,實(shí)現(xiàn)終止保護(hù)。
(2)進(jìn)程保護(hù)
采用了進(jìn)程保護(hù)技術(shù),使得在Windows的任務(wù)管理器中無法終止本進(jìn)程。防止考生在使用U盤前先終止本進(jìn)程。
(3)卸載保護(hù)
系統(tǒng)在第一次運(yùn)行時(shí)會自動(dòng)在添加/刪除程序列表中找到自己的列表項(xiàng),并將其隱藏起來,這樣本系統(tǒng)就無法從Windows中卸載。
系統(tǒng)目前已經(jīng)運(yùn)行在本校進(jìn)行的“試點(diǎn)高校網(wǎng)絡(luò)教育部分基礎(chǔ)課程統(tǒng)一考試”的客戶端上,取得了良好的效果。該系統(tǒng)不但能運(yùn)行在網(wǎng)絡(luò)考試客戶端上,也可以運(yùn)行于各種無紙化考試系統(tǒng)的客戶端上。系統(tǒng)目前還有一些不足之處需要改進(jìn),如目前只是單機(jī)版,過程狀態(tài)數(shù)據(jù)沒有記錄,不利于監(jiān)考老師的集中管理,還有待于升級成網(wǎng)絡(luò)版。
參考文獻(xiàn)
[1] 李英偉.USB2.0原理與工程開發(fā)(第2版)[M].北京:國防工業(yè)出版社,2007
[2] 陳啟美,丁傳鎖.計(jì)算機(jī)USB接口技術(shù)[M]. 南京:南京大學(xué)出版社,2003.
[3] 薛園園. USB應(yīng)用開發(fā)技術(shù)大全[M].北京: 人民郵電出版社,2007.
[4] 肖踞雄,翁鐵成. USB技術(shù)及應(yīng)用設(shè)計(jì)[M].北京:清華大學(xué)出版社,2003. (收稿日期:2010-10-21)