收藏 分销(赏)

无纸化考试系统防止考生作弊的实现措施.doc

上传人:pc****0 文档编号:5976080 上传时间:2024-11-24 格式:DOC 页数:5 大小:58.50KB 下载积分:10 金币
下载 相关 举报
无纸化考试系统防止考生作弊的实现措施.doc_第1页
第1页 / 共5页
无纸化考试系统防止考生作弊的实现措施.doc_第2页
第2页 / 共5页


点击查看更多>>
资源描述
sunshine 无纸化考试系统防止考生作弊的实现措施 田民格 (三明学院 数学与计算机科学系,福建 三明 365004) 摘要:无纸化考试系统防止考生作弊是无纸化考试系统要解决的首要问题。本文介绍了无纸化考试系统考生可用的作弊手段和防止考生作弊的具体方法,用API调用技术、注册表技术、拦截消息技术、回调技术、钩子技术实现了这些方法并给出详细的Delphi实现代码。 关键词:无纸化考试系统; 作弊; 消息; 回调; 钩子 中图分类号:TP316   文献标识码:A 文章编号:1673-4343(2007)04-0456-04 The Solution to Prevent Examinee from Cheating of Paperless Examination System Tian Min-ge (Math and Computer Science Department,Sanming College,Sanming 365004,China) Abstract:Prevent examinee from cheating is one of chief problems to solve of no paper examination system.This paper introduces the measure of how to practising fraud for examinee and the solution to prevent examinee from practising fraud.Then,introduces the solution by using the technology of calling API,registry,heading off of the messages transferred to window by Windows,callback,lowlevel keyboard hook in detail with Delphi. Key words:No Paper Examination System; Practising fraud; Message; Callback; hook sunshine 无纸化考试防止考生作弊是无纸化考试系统要解决的一个很重要的问题[1][2],也是到目前为止国内多数著名无纸化考试系统尚未能完全解决的难题(笔者从事无纸化考试系统软件开发8年有余,见过考试系统几十个,如新为、永道、杰佛、无忧等软件公司的考试系统,都尚未完全解决此难题)。因为Windows是一个多任务的操作系统,在任一时刻都允许运行多个程序,同样,在无纸化考试过程中,要作弊的考生必然会通过各种途径(如Ctrl+Alt+Del)切换到其它应用程序并搜索到与考试相关的信息,使考试系统变成了“拷贝”系统,为此,如何使多任务的操作系统暂时失去多任务的功能(屏蔽Ctrl+Alt+Del热键等问题)是解决防止考生作弊的关键。本文使用Delphi综合应用了API调用技术、注册表技术、拦截消息技术、回调技术、钩子技术[3]等很好地实现了三层C/S模式[4]下的无纸化考试系统[5]中防止考生作弊问题。若采用B/S模式,则更难解决这些问题,且存在考题很难兼容Word格式等问题。 1 考试系统中防止考生作弊的问题与原理 考试系统中要防止考生作弊,按难度的不同,依次要解决四个方面的问题,即窗体的控制问题、任务栏的控制问题、热键的屏蔽问题、某些应用程序的智能提示信息。 1.1 窗体的控制问题 最简单的作弊手段就是直接通过键盘或鼠标切换到其它应用程序查看答案。这是多数无纸化考试系统都能解决的问题,就是将答题窗体最大化并保持在所有窗体的最上面,包括盖住任务栏,且窗体没有最小化和还原按钮,这样,考生即使切换到其它窗体,也被答题窗体盖住而无法看到答案。 但Delphi顶层技术存在一个漏洞,Delphi窗体在最大化时可用鼠标拖动标题栏移动窗体,而Delphi窗体没有禁止窗体移动的属性可用。解决的办法是拦截窗体感应消息WM_NCHITTEST和窗体位置改变消息WM_WindowPosChanging,前者将标题栏消息调包成窗体客户区消息,后者将窗体新坐标位置改变回成原坐标值,这样,无论考生通过何手段都无法移动窗体了。 通过拦截消息技术考生一般是无法移动窗体,包括控制菜单的移动命令也无法移动窗体,但考虑到控制菜单是操作系统提供的功能,为防某些操作系统绕过以上消息,作为安全的冗余技术,增加拦截窗体系统命令WM_SysCommand消息,若命令类型是移动窗体SC_MOVE或改变窗体大小SC_SIZE则将二命令丢弃即可防止考生通过控制菜单移动窗体。 1.2 任务栏的控制问题 答题窗体完全控制后,任务栏也是必须控制重要部分。没有经过全面的β测试,一般很难发现这一问题,因此笔者所见过的所有考试系统都忽视了这一问题。在XP操作系统中,只要运行某些程序或答题窗体弹出消息框时(如考生单击退出考试按钮或菜单弹出确认消息框时),答题窗体将不能保持在所有窗体的最上面,任务栏会定时刷新并浮于答题窗体的上面,考生只要将鼠标右击任务栏就可以将所有窗体最小化,然后就可以切换到其它窗体。解决的办法是调用操作系统API函数隐藏任务栏并使之无效(Disable)变灰色,这样即使任务栏显示了也不会响应鼠标事件。 1.3 热键的屏蔽问题 屏蔽系统热键是目前多数著名的考试系统都尚未能完全解决的难题,如Win+D或Win+M可将所有窗体最小化并切换到桌面。解决的办法是用低级键盘钩子屏蔽所有系统热键,包括Win+D、Win+M、Alt+Tab、Alt+Esc、Ctrl+Esc等组合键和功能键。但组合键Ctrl+Alt+Del却无法屏蔽,最后用注册表技术屏蔽任务管理器。 1.4 屏蔽某些应用程序的智能提示信息 防止考生作弊的第四方面就是屏蔽某些应用程序的智能提示信息。象金山词霸就有这样的功能,这在双语考试中是不允许的。解决的办法是用回调技术搜索所有进程,将找到的进程中标题含有“金山词霸”的进程关闭。 这样,考生无法通过U盘、光盘等存储介质浏览答案,也无法通过网络搜索答案了。 2 窗体的控制问题 2.1 最大化窗体并保持在所有窗体顶层[6] 在窗体创建或显示时通过设置窗体的相关属性使窗体最大化并保持在所有窗体的顶层,且不允许标题栏显示最小化和还原按钮,具体如下如下。 WindowState:=wsMaximized; FormStyle:=fsStayOnTop; BorderIcons:=[biSystemMenu]; 2.2 禁止窗体移动   在窗体类中分别添加要拦截的窗体感应消息WM_NCHITTEST、窗体位置改变消息WM_WindowPosChanging、窗体系统命令消息WM_SysCommand及其相应的消息处理程序的原型说明,具体如下。 procedure WMNCHitTest(var Msg: TMessage); message WM_NCHITTEST; procedure onPosChange( var msg:TWMWindowPosChanging); message wm_WindowPosChanging; procedure WMSysCommand( var Msg:TWMSysCommand); message WM_SysCommand; 然后添加以上三个消息处理程序的具体实现代码如下。 procedure TForm3.WMNCHitTest( var Msg: TMessage); Begin//拦截标题栏消息 inherited; if (Msg.Result=2)or(Msg.Result=100) then Msg.Result:=1; End; procedure TForm3.WMSysCommand( var Msg:TWMSysCommand); Begin//屏蔽系统菜单移动命令和大小命令 if (msg.CmdType=SC_MOVE) or(msg.CmdType=SC_SIZE) then exit; inherited; End; procedure TForm3.onPosChange( var msg:TWMWindowPosChanging); begin//拦截移动消息 msg.windowpos.x:=left; msg.windowpos.y:=top; msg.result:=0; end; 3 任务栏的控制问题 要隐藏任务栏并使之无效变灰色,首先获得任务栏窗体及其各区域子窗体的句柄,然后使任务栏窗体及其各区域子窗体无效且隐藏。 通过调用API函数FindWindow获得任务栏窗体的句柄,通过调用API函数FindWindowEx获得任务栏各区域子窗体的句柄,具体代码如下。 procedure GetHandles(var W:TrayWnd); begin //得到Tray Bar窗体句柄 w[0]:=FindWindow('Shell_TrayWnd',nil); //得到开始按钮子窗体句柄 w[1]:=FindWindowEx(w[0],0,'Button',nil); //得到应用程序切换区子窗体句柄 w[2]:=FindWindowEx(w[0],0, 'ReBarWindow32',nil); //得到任务栏通知区子窗体句柄 w[3]:=FindWindowEx(w[0], 0,'TrayNotifyWnd',nil); //得到任务栏时钟子窗体句柄 w[4]:=FindWindowEx(w[0],0, 'TrayNotifyWnd',nil); w[4]:=FindWindowEx(w[4],0, 'TrayClockWClass',nil); end;   通过调用API函数EnableWindow使任务栏窗体及各区域子窗体无效,通过调用API函数ShowWindow使任务栏窗体及各区域子窗体隐藏,具体代码如下。 procedure TrayShowEnable(W:TrayWnd; H:boolean=false); Var i:Integer; begin for i:=0 to 4 do begin EnableWindow(w[i],H); ShowWindow(w[i], IfThen(H,SW_SHOW,SW_HIDE)); end; end; 4 热键的屏蔽问题   要屏蔽各种热键,首先定义按键消息结构和相关变量。 type tagKBDLLHOOKSTRUCT=packed record vkCode:DWORD;//虚拟键值 scanCode:DWORD;//扫描码值 flags:DWORD; time:DWORD;//消息时间戳 dwExtraInfo:DWORD;//和消息相关的扩展信息 end; KBDLLHOOKSTRUCT= tagKBDLLHOOKSTRUCT; PKBDLLHOOKSTRUCT= ^KBDLLHOOKSTRUCT; const WH_KEYBOARD_LL=13; const LLKHF_ALTDOWN=$20; Var hhkLowLevelKybd:HHOOK;   其次定义低级键盘钩子的回调函数,在回调函数中过滤按键消息(WIN、Alt+Tab、Alt+Esc、Ctrl+Esc等)。 Function LowLevelKeyboardProc( nCode:Integer;WParam:WPARAM; LParam:LPARAM):LRESULT;stdcall; Var fEatKeystroke:BOOL; p:PKBDLLHOOKSTRUCT; Begin Result:=0; fEatKeystroke:=FALSE; p:=PKBDLLHOOKSTRUCT(lParam); if (nCode=HC_ACTION) then begin//拦截按键消息并测试是否是组合键 case wParam of WM_KEYDOWN, WM_SYSKEYDOWN, WM_KEYUP, WM_SYSKEYUP: fEatKeystroke:=((p.vkCode=vk_LWin) or (P.vkCode=vk_RWin)) or((p.vkCode=VK_TAB) and ((p.flags and LLKHF_ALTDOWN)<>0)) or((p.vkCode=VK_ESCAPE) and ((p.flags and LLKHF_ALTDOWN)<>0)) or((p.vkCode=VK_ESCAPE) and (GetKeyState(VK_CONTROL)<>0)); end; end; if fEatKeystroke then Result:=1; if nCode<>0 then Result:= CallNextHookEx(0,nCode,wParam,lParam); End; 最后是窗体显示时设置钩子调用的回调函数,关闭窗体时释放钩子。 procedure TForm3.FormShow( Sender:TObject); begin if hhkLowLevelKybd=0 then//屏蔽热键 hhkLowLevelKybd:=SetWindowsHookExW( WH_KEYBOARD_LL, LowLevelKeyboardProc, Hinstance, 0); end; procedure TForm3.FormClose( Sender:TObject;var Action:TCloseAction); begin//有屏蔽热键时取消屏蔽 if hhkLowLevelKybd<>0 then if UnhookWindowsHookEx(hhkLowLevelKybd) then hhkLowLevelKybd:=0; end;   考虑到热键Ctrl+Alt+Del优先级较高,一般的钩子技术是无法屏蔽的,所以只能用注册表技术屏蔽任务管理器 以间接屏蔽这个组合。在屏蔽任务管理器之前要先关闭任务管理器,然后设置任务管理器禁用,具体代码如下。 Function DisableTaskmgr(Key:Boolean):Boolean; Var Reg:TRegistry; hnd:integer; Begin result:=false; hnd:=Findwindow(nil,'Windows 任务管理器'); if hnd<>0 then PostMessage(Hnd,WM_Close,0,0); Reg:=TRegistry.Create; try Reg.RootKey:=HKEY_CURRENT_USER; if Reg.OpenKey('\Software\Microsoft\Windows \CurrentVersion\Policies\System',true) then begin//任务管理器1禁用0可用 Reg.WriteInteger('DisableTaskMgr',ord(key)); Reg.CloseKey; result:=true; end; except end; Reg.Free; end; 5 屏蔽某些应用程序的智能提示信息 要将标题含有“金山词霸”等字样的进程关闭,首先定义枚举窗体的回调函数,在回调函数中将标题含有“金山词霸”的进程关闭. 枚举所有窗体的回调函数代码如下。 Function EnumWindowsProc(hnd: HWND; lParam: LPARAM):Boolean;stdcall; var wName:array[0..32] of Char; begin result:=true; GetWindowText(hnd,wName,32); If Pos('金山词霸',wName)>=1 then PostMessage(Hnd,WM_Close,0,0); end;   调用回调函数以枚举所有窗体的进程以关闭含有特定标题的应用程序,代码如下。 procedure CloseJSCB(); begin EnumWindows(@EnumWindowsProc,0); end; 6 结束语   一个真正适用、健壮的无纸化考试系统已经不是一个简单的信息处理系统,也不可能用简单的编程技术可以实现这样一个系统,它必须更深入地了解Windows操作系统的内核,并综合应用这些系统内核技术才可以实现真正健壮的系统,本文综合应用了API调用技术、注册表技术、拦截消息技术、回调技术、钩子技术很好地解决了无纸化考试系统中防止考生作弊问题。经过多年运行测试,证明以上技术安全、可靠、有效。 参考文献: [1] 田民格.局域网考试系统要处理的关键技术[J].福建电脑,2006.3:165-166 [2] 田民格,卢昌荆,陈秀琼.遗传算法在无纸化考试系统中实现随机抽题[J].三明学院学报,2007,24(2):200-204 [3] 田民格,卢昌荆.Delphi程序设计[M].北京:清华大学出版社,北京交通大学出版社,2007-9:286-310 [4] Macro Cantu.Delphi6[M].王辉译.北京:电子工业出版社,2002:578-598 [5] 田民格.Delphi开发无纸化考试系统[J].三明学院学报,2005,22(2):214-218 [6] 田民格.无纸化考试系统的安全问题[J].三明高等专科学校学报,2004,21(2):88-94 欢迎阅读本文档! sunshine
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服