操作系统安全课程设计报告.docx
《操作系统安全课程设计报告.docx》由会员分享,可在线阅读,更多相关《操作系统安全课程设计报告.docx(22页珍藏版)》请在冰豆网上搜索。
操作系统安全课程设计报告
中南大学
操作系统安全
课程设计报告
学生姓名
指导教师
学院信息科学与工程学院
专业班级
完成时间2015年12月19日
目录
第一章概述2
第二章需求分析3
第三章总体设计5
第四章详细设计6
一.界面设计6
二.获取正在运行的进程及其信息8
三.结束进程9
四.获取其他信息10
五.绘制图表11
第五章调试分析15
第六章使用说明16
第七章测试结果17
第八章课程设计总结21
第九章参考文献22
操作系统安全课程设计
第一章概述
操作系统安全是整个计算机系统安全的重要基础,主要针对操作系统层面的安全进行剖析,是上层运行的重要保证。
与计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。
本课程设计的目的综合应用学生所学知识,建立安全系统的概念,理解和巩固操作系统基本理论、原理和方法,掌握安全操作系统开发的基本技能。
任务管理器是在Windows系统中管理应用程序和进程的工具,通常由Windows操作系统自带,也有提供增强功能的第三方软件。
通过任务管理器用户可以方便的查看当前运行的程序、进程、用户、网络连接以及系统对内存和CPU的资源占用,并可以强制结束某些程序和进程,此外还可以监控系统资源的使用状况。
Windows任务管理器首次出现是在1998年美国微软公司发行的Windows98操作系统中,此后微软的各个版本的Windows操作系统都集成了任务管理器。
任务管理器并不是Windows系统的专利,它广泛运用于各种操作系统中,在苹果公司的MacOS操作系统中有类似的活动监视器(ActivityMonitor),在基于Linux的ubuntu操作系统有相类似功能的系统监视器。
Windows任务管理器提供了有关计算机性能的信息,并显示了计算机上所运行的程序和进程的详细信息;如果连接到网络,那么还可以查看网络状态并迅速了解网络是如何工作的。
它的用户界面提供了文件、选项、查看、窗口、关机、帮助等六大菜单项,其下还有应用程序、进程、性能、联网、用户等五个标签页。
课题设计就是模拟Windows任务管理器,开发的一个Windows进程管理软件。
主要设计的是一个基于窗体的C#程序,在主对话框上面放置了一个标签控件,并创建了应用程序、进程和性能三个页面,标签控件用于选择并显示页面。
三个页面分别用于显示当前运行的窗口程序、进程及进程模块、系统资源使用情况。
程序还实现了结束任务、等对进程管理的基本功能。
在的设计过程中,通过调用WindowsAPI函数而获得任务、进程、线程模块,以及系统资源使用情况等信息。
最后在Windows10系统上进行测试,实现了进程管理的基本功能。
第二章需求分析
设计一个Windows或Linux下的进程管理与监控程序,要求该程序完成以下功能:
(1)可获取当前正在运行的所有进程,包括进程PID、进程名称、CPU使用情况、当前用户名、内存占用量等;
(2)能进一步获取各进程的所有线程情况;
(3)能通过命令终止某个进程的执行,终止时能将其子孙进程全部终止;
(4)要求界面友好。
关于Windows任务管理器:
任务管理器的用户界面提供了文件、选项、查看、窗口、关机、帮助等六大菜单项,例如“关机”菜单下可以完成待机、休眠、关闭、重新启动、注销、切换等操作,其下还有应用程序、进程、性能、联网、用户等五个标签页,窗口底部则是状态栏,从这里可以查看到当前系统的进程数、CPU使用比率、更改的内存<容量等数据,默认设置下系统每隔两秒钟对数据进行1次自动更新,当然你也可以点击“查看→更新速度”菜单重新设置。
1.应用程序
这里显示了所有当前正在运行的应用程序,不过它只会显示当前已打开窗口的应用程序,而QQ、MSNMessenger等最小化至系统托盘区的应用程序则并不会显示出来。
你可以在这里点击“结束任务”按钮直接关闭某个应用程序,如果需要同时结束多个任务,可以按住Ctrl键复选;点击“新任务”按钮,可以直接打开相应的程序、文件夹、文档或Internet资源,如果不知道程序的名称,可以点击“浏览”按钮进行搜索,其实这个“新任务”的功能看起来有些类似于开始菜单中的运行命令。
2.进程
这里显示了所有当前正在运行的进程,包括应用程序、后台服务等,那些隐藏在系统底层深处运行的病毒程序或木马程序都可以在这里找到,当然前提是你要知道它的名称。
找到需要结束的进程名,然后执行右键菜单中的“结束进程”命令,就可以强行终止,不过这种方式将丢失未保存的数据,而且如果结束的是系统服务,则系统的某些功能可能无法正常使用。
Windows的任务管理器只能显示系统中当前进行的进程,而ProcessExplorer可以树状方式显示出各个进程之间的关系,即某一进程启动了哪些其他的进程,还可以显示某个进程所调用的文件或文件夹,如果某个进程是Windows服务,则可以查看该进程所注册的所有服务,需要的朋友可以从下载。
3.性能
从任务管理器中我们可以看到计算机性能的动态概念,例如CPU和各种内存的使用情况。
CPU使用情况:
表明处理器工作时间百分比的图表,该计数器是处理器活动的主要指示器,查看该图表可以知道当前使用的处理时间是多少。
CPU使用记录:
显示处理器的使用程序随时间的变化情况的图表,图表中显示的采样情况取决于“查看”菜单中所选择的“更新速度”设置值,“高”表示每秒2次,“正常”表示每两秒1次,“低”表示每四秒1次,“暂停”表示不自动更新。
PF使用情况:
正被系统使用的页面文件的量。
页面文件使用记录:
显示页面文件的量随时间的变化情况的图表,图表中显示的采样情况取决于“查看”菜单中所选择的“更新速度”设置值。
总数:
显示计算机上正在运行的句柄、线程、进程的总数。
执行内存:
分配给程序和操作系统的内存,由于虚拟内存的存在,“峰值”可以超过最大物理内存,“总数”值则与“页面文件使用记录”图表中显示的值相同。
物理内存:
计算机上安装的总物理内存,也称RAM,“可用”表示可供使用的内存容量,“系统缓存”显示当前用于映射打开文件的页面的物理内存。
内核内存:
操作系统内核和设备驱动程序所使用的内存,“页面”是可以复制到页面文件中的内存,由此可以释放物理内存;“非分页”是保留在物理内存中的内存,不会被复制到页面文件中。
4.联网
这里显示了本地计算机所连接的网络通信量的指示,使用多个网络连接时,我们可以在这里比较每个连接的通信量,当然只有安装网卡后才会显示该选项。
5.用户
这里显示了当前已登录和连接到本机的用户数、标识(标识该计算机上的会话的数字ID)、活动状态(正在运行、已断开)、客户端名,可以点击“注销”按钮重新登录,或者通过“断开”按钮连接与本机的连接,如果是局域网用户,还可以向其他用户发送消息。
第三章总体设计
我决定用java语言完成本次课程设计的题目。
设计思路:
java可以通过一些命令拿到所需要的信息,比如系统版本名称、内存使用情况、CPU使用情况、进程状况、线程状况等等,拿到这些信息以后就可以制作一个简易的任务管理器了。
相对来说,java语言写界面是比较简单的,因此任务管理器的界面可以完全仿照Windows自带任务管理器的界面来完成。
下图为主要的设计方案,java中可以通过如下两个包来获取所需的信息,所以这些信息采用get、set方法获取后直接打印的方法展示。
进程的信息则需要获取权限,我采用用system函数调dos命令的方法来实现。
进程的新建、关闭也同样用dos命令完成。
Windows任务管理器由性能、进程、应用程序三大部分组成。
其实这三大部分是有机的联系在一起的,尤其是性能和进程,性能中除了CPU使用率以外,其余的数据都是由进程模块顺便取得的。
Windows的任务管理器通过NtQuerySystemInformation的调用来获取各类信息,如CPU使用率,内存使用率,句柄总数,线程总数,进程总数等等。
在任务管理器中的几乎所有信息都是来自该函数。
我的理解中,这两个包里的函数和方法都会用到这个函数。
java.lang.management.ManagementFactory
com.sun.management.OperatingSystemMXBean
在这个任务管理器中,除了应该可以显示上面提到的信息之外,还要有新建和结束进程、画出内存和CPU使用情况图的功能。
第四章详细设计
1.界面设计
预计设计为类似Windows自带的任务管理器的界面,需要用到java自有包java.awt.*,javax.swing.*。
这两个包中包含了许多制作窗口所需的方法。
这里需要用到许多控件来实现,如JTabbedPane控件,用于加入选项卡。
还需要放置表格用来显示进程的各项信息。
JTabbedPanejtp;
JPanelprocess_tab;
JPanelservice_tab;
JPanelfunction_tab;
//显示进程的表格
JTablepTable=newJTable();
//显示服务的表格
JTablesTable=newJTable();
//中间面板
JPanelmainpanel;
finalVectorpb=newVector(5);
finalVectorsb=newVector(5);
//进程信息面板
JLabelprocess_num;
各个面板的各项配置也在界面设计中完成,如选项卡出现的位置、名称以及颜色等。
//选项卡布局
publicvoidsetTab()throwsException{
jtp=newJTabbedPane(JTabbedPane.TOP);
process_tab=newJPanel();
process_tab.setLayout(null);
ProcessTab();
service_tab=newJPanel();
//service_tab.setLayout(null);
ServiceTab();
function_tab=newJPanel();
function_tab.setLayout(null);
FunctionTab();
process_tab.setBackground(Color.WHITE);
service_tab.setBackground(Color.WHITE);
function_tab.setBackground(Color.WHITE);
jtp.add("进程",process_tab);
jtp.add("待定",service_tab);
jtp.add("性能",function_tab);
mainpanel=newJPanel();
mainpanel.setBounds(0,0,545,580);
mainpanel.add(jtp);
this.getContentPane().add(mainpanel);
southPanel();
}
接着只要取到各项选项卡所需的信息,将其加入各个选项卡内即可,进程选项卡还需添加表格中各个选项,这里用一个字符串数组来完成。
Stringcname[]={"映像名称","用户名","优先权","PID","线程数"};
for(inti=0;i<5;i++)pb.add(cname[i]);
2.获取正在运行的进程及其信息
获得进程及其信息采用通过命令行获取的方式,在此之前必须先建立一个类(命名为ProcessImformation)来放置取到的信息,所需信息有:
进程名称、用户名、优先权、进程PID、线程数,建立一个函数,再增加该函数变量的get方法。
ProcessImformation(Stringcaption,Stringcsname,Stringpriority,
StringprocessId,StringthreadCount){
this.caption=caption;
this.csname=csname;
this.priority=priority;
this.processId=processId;
this.threadCount=threadCount;
取进程信息的命令:
StringprocCmd=System.getenv("windir")+"\\system32\\wbem\\wmic.exeprocessgetCaption,CSName,Priority,ProcessId,ThreadCount";
//取进程信息
readProcess(Runtime.getRuntime().exec(procCmd));
StringhandCmd=System.getenv("windir")+"\\system32\\wbem\\wmic.exeprocessgetName,HandleCount";
//取句柄信息
readHandle(Runtime.getRuntime().exec(handCmd));
hand.getOutputStream().close();
InputStreamReaderir=newInputStreamReader(hand.getInputStream());
LineNumberReaderinput=newLineNumberReader(ir);
Stringline=input.readLine();
intcn=line.indexOf("Name");
intch=line.indexOf("HandleCount");
while((line=input.readLine())!
=null){
if(line.length()inthandle=Integer.parseInt(line.substring(ch,cn-1).trim());
i+=handle;
}
proc.getOutputStream().close();
InputStreamReaderir=newInputStreamReader(proc.getInputStream());
LineNumberReaderinput=newLineNumberReader(ir);
Stringline=input.readLine();
intcapidx=line.indexOf("Caption");
intcmdidx=line.indexOf("CSName");
intprioidx=line.indexOf("Priority");
intpid=line.indexOf("ProcessId");
inttc=line.indexOf("ThreadCount");
while((line=input.readLine())!
=null){
if(line.length()//字段出现顺序:
Caption,CommandLine,Priority,ProcessId,ThreadCount
Stringcaption=line.substring(capidx,cmdidx-1).trim();
Stringcaname=line.substring(cmdidx,prioidx-1).trim();
Stringpriority=line.substring(prioidx,pid-1).trim();
StringprocessId=line.substring(pid,tc-1).trim();
StringThreadCount=line.substring(tc,line.length()-1).trim();
proce[i]=newProcessImformation(caption,caname,priority,processId,ThreadCount);
//intth=Integer.parseInt(ThreadCount);
i=i+1;
//t+=th;
}
3.结束进程
结束进程同样通过命令行实现,在进程表格中选中某进程后点击结束进程按钮,弹出对话框显示“确定要结束进程(加入进程名称)吗?
”,点击“是”后可以结束进程。
//结束进程按钮
JButtonkill=newJButton("结束进程(E)");
kill.setBounds(400,425,98,23);
kill.addActionListener(this);
process_tab.add(kill);
用户点击按钮之后转到如下函数:
publicvoidactionPerformed(ActionEventargs){
if(args.getActionCommand().equals("结束进程(E)")){
if(pTable.getSelectedRow()!
=-1){
if(pTable.getValueAt(pTable.getSelectedRow(),0)!
=null){
//Toolkit.getDefaultToolkit().beep();
Stringpname=pTable.getValueAt(pTable.getSelectedRow(),0).toString();
pname=pname.replace("\"","");
pname=pname.trim();
intn=JOptionPane.showConfirmDialog(this,"确定要结束进程"+pname+"吗?
","确认对话框",JOptionPane.YES_NO_OPTION);
if(n==JOptionPane.YES_OPTION){
try{
Stringkill="wmicprocesswherename=\""+pname+"\"callterminate";
Runtime.getRuntime().exec(kill);
}catch(Exceptionex){
}
JOptionPane.showMessageDialog(this,pname+"已结束!
","消息",
JOptionPane.WARNING_MESSAGE);
}
}
}else
JOptionPane.showMessageDialog(this,"没有选中项!
","消息",
JOptionPane.WARNING_MESSAGE);
}
4.获取其他信息
获得其他信息的方式与获得进程及其信息的方式相同,在此之前必须先建立一个类(命名为OSInformation)来放置取到的信息,所需信息有:
操作系统名称及版本、总物理内存、已使用物理内存、剩余物理内存、CPU使用情况,建立一个函数,再增加该函数变量的get、set方法。
由于方法与获得进程及其信息的方法相同,不再赘述。
intkb=1024;
OperatingSystemMXBeanosmxb=
(OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean();
//操作系统
StringosName=System.getProperty("os.name");
StringosVersion=System.getProperty("os.version");
//总的物理内存
longtotalMemorySize=osmxb.getTotalPhysicalMemorySize()/(kb*kb);
//剩余的物理内存
longfreePhysicalMemorySize=osmxb.getFreePhysicalMemorySize()/(kb*kb);
//已使用的物理内存
LongusedMemory=
(osmxb.getTotalPhysicalMemorySize()-osmxb.getFreePhysicalMemorySize())/(kb*kb);
if(osName.toLowerCase().startsWith("windows")){
this.getProcessForWindows();
}
//构造返回对象
OSInformationinfoBean=newOSInformation();
infoBean.setFreePhysicalMemorySize(freePhysicalMemorySize);
infoBean.setOsName(osName+""+osVersion);
infoBean.setTotalMemorySize(totalMemorySize);
infoBean.setUsedMemory(usedMemory);
returninfoBean;
5.绘制图表
绘制CPU和内存使用情况。
首先需要建立一个坐标类,由于要绘制两个图,所以需要x1、x2、y1、y2四个坐标变量。
绘制图表需要用到时钟函数,令其可以自动刷新,自动取到所需的信息并且绘图。
每取到新的结果,旧的结果(上一个结果)则向左移动一格。
publicvoidupdateChart(){
//物理内存使用记录中的表格
for(inti=0;i<10;i++){
XYxy=newXY();
xy.x1=0;
xy.y1=(i+1)*13;
xy.x2=500;
xy.y2=(i+1)*13;
if(!
checkEqual(xy,X_memory_record))X_memory_record.add(xy);
}
Y_memory_record.clear();
for(inti=0;i<70;i++){
XYxy=newXY();
xy.x1=(i+1)*13-move;
xy.y1=0;
xy.x2=(i+1)*13-move;
xy.y2=200;
if(!
checkEqual(xy,Y_memory_record))Y_memory_record.add(xy);
}
//物理内存使用记录中的数据
Listtemp_memory_reco