网络工具软件开发实训指导书.docx
- 文档编号:11494413
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:29
- 大小:137.89KB
网络工具软件开发实训指导书.docx
《网络工具软件开发实训指导书.docx》由会员分享,可在线阅读,更多相关《网络工具软件开发实训指导书.docx(29页珍藏版)》请在冰点文库上搜索。
网络工具软件开发实训指导书
《网络工具软件开发实训》指导书
课程类别:
专业必修课
适用对象:
信息安全技术专业(3年制)
独立实践学时:
27
一、实训内容及要求
《网络工具软件开发实训》目的是培养学生使用VisualC++平台开发网络工具软件的开发能力。
(一)实训内容如下:
1.讨论组程序设计与开发
2.远程关机与远程唤醒工具开发
3.sniffer、IP工具开发
(二)实训要求如下:
按照实训指导书的要求完成程序源代码的编写,并调试、运行成功。
(三)需提交资料
实训结束时,学生需要提供以下资料:
1.实训报告
2.程序源代码
二、实训过程(含步骤)
1.查看实训指导书的要求,分析实现方法
2.编写程序源代码
3.调试程序
4.完成实训报告
三、实训报告的编写指导
要规定详细的报告格式,要求明确,可操作性强,审批报告的评分标准等
四、实训学时分配
学时分配:
实训教学总学时数为27学时,其中讲授学时5,实操22
学时分配表
序号
实训内容
学时
其中
讲授
实操
其他
1
讨论组程序设计与开发
12
2
10
2
远程关机与远程唤醒工具开发
6
1
5
3
sniffer、IP工具开发
6
1
5
4
总结、实训报告
3
1
2
学时总计
27
5
22
五、参考资料:
讨论组程序开发指导书
一.任务描述
界面如图所示:
通过点击单选按钮,选择要进入的聊天室,然后单击“进入”按钮,弹出聊天信息对话框,如下图:
具体的聊天功能参考教材第5章的实例。
二.要点提示——如何弹出新的对话框?
首先,在左侧的资源列表里,插入一个新的对话框。
然后,用鼠标双击对话框,选择为其创建一个新的类,类名叫CChat。
最后在需要弹出该对话框的地方写出如下代码:
测试,是否能够弹出对话框?
三.实现步骤
1.创建工程,在工程中添加一个新的对话框,并给它建立类。
(具体步骤见上面)
2.在主界面上给每个单选按钮添加消息响应函数(即鼠标双击每个单选按钮,自动生成函数),在每个函数中给聊天室的IP地址赋值。
如图:
一共有6个单选按钮,仿照上面,要给6个聊天室的IP地址都赋值。
变量roomIP是自己定义的类的成员变量,CString类型,用来保存每个聊天室的多播地址。
3.给聊天对话框界面上添加相应的功能。
1.在对话框类的构造函数里添加代码,创建新线程。
2.在线程里实现循环接收所有发到指定聊天室的聊天信息,并显示在界面上的ListBox控件里。
3.给“发送”按钮添加消息响应函数,实现发送聊天信息的功能。
4.给“退出聊天室”按钮添加消息响应函数,实现退出和关闭的功能。
此部分的代码参考教材第五章的实例完成
四.任务扩展
要求:
在聊天室界面上添加两个新的按钮,分别是“保存”和“浏览”。
单击“保存”按钮,程序将聊天信息保存到本地文件bc.txt。
单击“浏览”按钮,程序将本地文件bc.txt的内容显示到界面上的列表中。
提示:
文件新建、写、读关闭等操作参考教材第3章。
CFile类应用:
CFile类是MFC文件类的基类,提供非缓冲方式的二进制磁盘输入、输出功能;并直接通过派生类来支持文本文件和内存文件。
提供访问本地文件内容的功能,不支持访问网络文件的功能。
CFile类的声明保存在afx.h头文件中。
CFile类的成员变量:
m_hFile:
表示一个打开文件的操作系统文件句柄。
✧创建文件
创建一个CFile对象时,可以采用3种方法实现:
(1)CFilemyFile;
myFile.Open(LPCTSTRlpFileName,UINTnOpenFlags,CFileException*pError=NULL);
(2)CFilemyFile(inthFile);采用句柄方式创建。
使用该创建方法,在之前需要调用CreateFile()函数,该函数的声明如下:
HANDLECreateFile(
LPCTSTRlpFileName,//文件名称
DWORDdwDesiredAccess,//文件访问的模式
DWORDdwShareMode,//文件的共享模式
LPSECURITY_ATTTRIBUTElpSecurityAttribute,
DWORDdwCreationDisposition,//访问方式
DWORDdwFlagsAndAttribute,//文件属性
HANDLEhTemplateFile,//临时文件句柄
);
(3)CFile(LPCTSTRlpFileName,UINTnOpenFlags);
lpFileName是文件名称,可以是相对路径,绝对路径或者网络路径。
nOpenFlags是打开文件的方式。
打开文件可选用的方式有:
CFile:
:
modeCreate:
构造新文件,如果文件存在,则长度变为0。
CFile:
:
modeNoTruncate:
该属性和modeCreate联合使用,可以达到如下效果:
如果文件存在,则不会将文件的长度置为0,如果不存在,则会由modeCreate属性来创建一个新文件。
CFile:
:
modeRead:
以只读方式打开文件
CFile:
:
modeWrite:
以写方式打开文件
CFile:
:
modeReadWrite:
以读、写方式打开文件
CFile:
:
modeNoInherit:
阻止文件被子进程继承
CFile:
:
shareDenyNone:
不禁止其它进程读写访问文件,但如果文件已经被其它进程以兼容模式打开,则创建文件失败。
CFile:
:
shareDenyRead:
打开文件,禁止其它进程读此文件,如果文件已经被其它进程以兼容模式打开,或被其它进程读,则create失败。
CFile:
:
shareDenyWrite:
打开文件,禁止其它进程写此文件,如果文件已经被其它进程以兼容模式打开,或被其它进程写,则create失败。
CFile:
:
shareExclusive:
以独占模式打开文件,禁止其它进程对文件的读写,如果文件已经被其它模式打开读写(即使是当前进程),则构造失败。
CFile:
:
typeText:
对回车、换行设置特殊进程(仅用于派生类)
CFile:
:
typeBinary:
设置二进制模式(仅用于派生类)
(4)virtualvoidClose();
关闭文件和对应的CFile对象。
如果在删除了对象之前没有关闭文件,那么析构函数会关闭文件。
如果是用new方式创建的CFile对象,那么你必须在删除了CFile对象后关闭文件。
Close函数将设置m_hFile为CFile:
:
hFileNull。
该函数和创建CFile对象函数成对使用。
(5)virtualBOOLOpen(
LPCTSTRlpFileName,
UINTnOpenFlags,
CFileException*pError=NULL);
参数前面已有详解,此处不做赘述。
✧读写文件
(1)virtualUINTCFile:
:
Read(void*lpBuf,UINTnCount);
该函数的功能是从文件中读取文件内容。
返回值是读出的字节数,可能与nCount相等,也可能小于nCount。
参数lpBuf:
存放读出的文件内容的空间地址。
参数nCount:
从文件读出的最大字节数。
(2)virtualvoidWrite(constvoid*lpBuf,UINTnCount);
该函数的功能是向文件中写数据。
参数lpBuf:
存储要写入文件的数据的空间地址。
参数nCount:
要写入文件的数据的字节数。
远程关机——shutdown
程序设计与实现
InitiateSystemShutdown()有一个参数LPTSTRlpMachineName,可以指定为网络上的计算机名字(或IP地址),也就是说,可以远程关闭网络上的他计算机(如果你的用户在该计算机上有足够的权限的话)。
调用InitiateSystemShutdown()函数关闭远程计算机需要先获得SE_SHUTDOWN_NAME权限,可以通过AdjustTokenPrivileges()函数来修改进程的权限。
远程关机应用程序运行界面如图8-2所示:
图8-2远程关机程序运行界面
创建一个基于对话框的应用程序,界面上有一个文本输入框,用来输入要被关闭的计算机名(或IP地址),界面下方有三个按钮,第一个按钮实现远程重启计算机的功能,第二个按钮实现远程关闭计算机的功能,第三个按钮关闭对话框。
给文本编辑框添加一个关联的成员变量m_host,类型是CString。
给“重启”和“关机”按钮添加消息处理函数。
“重启”按钮的消息处理函数实现源代码如下:
voidCShutDownDlg:
:
OnRestart()
{
UpdateData(TRUE);
char*host;
host=m_host.GetBuffer(m_host.GetLength());
shutdownHost(host,TRUE);//调用shutdownHost函数实现远程重启计算机功能
}
“关机”按钮的消息处理函数实现源代码如下:
voidCShutDownDlg:
:
OnShutdown()
{
UpdateData(TRUE);
char*host;
host=m_host.GetBuffer(m_host.GetLength());
shutdownHost(host,FALSE);//调用shutdownHost函数实现远程关闭计算机功能
}
/*----------------------------------------------------------------------------------
线程函数名:
shutdownHost
属性:
CShutDownDlg类的成员函数(需自定义)
功能:
远程关闭或重启计算机
参数hostName--将被关闭的计算机名或IP地址
参数flag--值为TRUE表示要重启,值为FALSE表示要关机
--------------------------------------------------------------------------------------*/
BOOLCShutDownDlg:
:
shutdownHost(char*hostName,boolflag){
HANDLEhToken;
TOKEN_PRIVILEGEStkp;
BOOLfResult;
//得到进程的令牌句柄
if(!
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|
TOKEN_QUERY,&hToken)){
MessageBox("获取进程的令牌句柄出错","Error",MB_OK);
returnfalse;
}
//获得一个权限对应的LUID值
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount=1;//数组元素的个数
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;//使能一个权限
//对访问令牌进行修改
AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
if(GetLastError()!
=ERROR_SUCCESS){
MessageBox("修改访问令牌出错","Error",MB_OK);
returnfalse;
}
fResult=InitiateSystemShutdown(hostName,//要关闭的计算机名或IP地址
"程序将要关闭",//被关闭计算机上显示的信息
10,//关机前的延迟时间
FALSE,//对未保存的应用程序是否强制关闭
flag);//TRUE表示要重启,值为FALSE表示要关机
if(!
fResult){
MessageBox("远程关机调用出错","Error",MB_OK);
returnfalse;
}
tkp.Privileges[0].Attributes=0;
AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
if(GetLastError()!
=ERROR_SUCCESS){
MessageBox("AdjustTokenPrivilegesdisablefailed.","Error",MB_OK);
returnfalse;
}
returntrue;
}
远程关机——木马
程序设计与实现
程序分成两个部分,一个是控制端程序,一个是木马。
控制端程序功能是由用户输入要控制的计算机,并选择“注销”、“关闭”或者“重启”操作,控制端程序将用户的要求发送给目标计算机上木马程序,由木马程序针对目标计算机进行相应操作。
运行界面如图8-3所示:
图8-3控制端程序运行界面
界面上部有一个文本编辑框,让用户输入要操作的计算机,给该文本编辑框添加一个关联的成员变量m_ip,类型是CString。
界面中间部分是上个单选按钮控件,让用户选择要进行的操作。
鼠标双击每个单选按钮,会自动给每个单选按钮添加消息处理函数,一旦用户选中该按钮,就会执行该按钮的消息处理函数。
三个单选按钮的消息处理函数代码如下:
voidCControlerDlg:
:
OnRadio0()
{
m_nType=0;//注销
}
voidCControlerDlg:
:
OnRadio1()
{
m_nType=1;//重启
}
voidCControlerDlg:
:
OnRadio2()
{
m_nType=2;//关机
}
其中的变量m_nType是用户自定义的CControlerDlg类的成员变量,类型是int。
(在CControlerDlg类的定义中写入代码:
intm_nType;)
界面下部是两个按钮,“远程控制”实现发送远程控制信息给木马程序的功能。
“关闭”按钮功能是关闭对话框。
“远程控制”按钮的消息处理函数实现代码如下:
voidCControlerDlg:
:
OnShut()
{
UpdateData(true);
//发送数据对象的定义
UpdateData(true);
CSocketm_SendSocket;//构造一个套接字对象
intport=8888;
//数据发送
m_SendSocket.Create(6666,SOCK_DGRAM);//创建一个套接字句柄(UDP)
m_SendSocket.SendTo(&m_nType,sizeof(int),port,m_ip);//发送数据给本地计算机
m_SendSocket.Close();
}
木马程序的功能是接收控制端程序发送来的操作要求,针对本地计算机进行“注销”、“关闭”或者“重启”操作。
程序运行界面如图8-4所示:
图8-4关闭计算机的木马程序界面
“启动”按钮实现接收控制端发送来的要求,并按照要求对本地计算机进行“注销”、“关闭”或者“重启”操作。
实现代码如下:
voidCShutDownDlg:
:
OnShutdown()
{
CSocketm_ReceiveSocket;//构造一个套接字对象
intnMeg;
//接收数据
m_ReceiveSocket.Create(8888,SOCK_DGRAM);
m_ReceiveSocket.Receive(&nMeg,sizeof(int));
OSVERSIONINFOOsInfo;//获取操作系统版本信息
switch(nMeg){
case0:
ExitWindowsEx(EWX_LOGOFF,0);//控制端要求注销
break;
case1:
//控制端要求重启
//获取操作系统版本信息
OsInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(&OsInfo);
//Windows98重启
if(OsInfo.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
{
:
:
ExitWindowsEx(EWX_REBOOT,0);
}
//Windows2000以上版本重启
if(OsInfo.dwPlatformId==VER_PLATFORM_WIN32_NT)
{
HANDLEhToken;
TOKEN_PRIVILEGEStkp;
if(!
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
{
MessageBox("无法打开存取令牌");
return;
}
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES) NULL,0);
if(GetLastError()!
=ERROR_SUCCESS)
{
MessageBox("无法重启");
return;
}
if(!
ExitWindowsEx(EWX_REBOOT,0))
MessageBox("无法重启");
}
break;
case2:
//控制端要求关机
//获取操作系统版本信息
OsInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
GetVersionEx(&OsInfo);
//Windows98重启
if(OsInfo.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS)
{
:
:
ExitWindowsEx(EWX_SHUTDOWN,0);
}
//Windows2000以上版本重启
if(OsInfo.dwPlatformId==VER_PLATFORM_WIN32_NT)
{
HANDLEhToken;
TOKEN_PRIVILEGEStkp;
if(!
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
{
MessageBox("无法打开存取令牌");
return;
}
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES) NULL,0);
if(GetLastError()!
=ERROR_SUCCESS)
{
MessageBox("无法重启");
return;
}
if(!
ExitWindowsEx(EWX_POWEROFF|EWX_FORCE,0))
MessageBox("无法重启");
}
break;
default:
break;
}
m_ReceiveSocket.Close();
}
远程唤醒
程序设计与实现
要想使用远程唤醒功能,首先必须知道要唤醒机器的MAC(MediumAccessControl)地址,MAC地址由用户输入。
程序运行后界面如图8-5所示:
图8-5远程唤醒程序运行界面
界面上有6个文本编辑框,用来输入网卡的MAC地址,这六个文本编辑框的关联成员变量是m_mac1、m_mac2、m_mac3、m_mac4、m_mac5、m_mac6。
“唤醒”按钮的功能是生成魔术包,并将魔术包以广播的发式发送出去,实现唤醒远程计算机的功能。
实现原代码如下:
voidCPowerOnDlg:
:
OnPoweron()
{
UpdateData(true);
CStringmacAddr=m_mac1+m_mac2+m_mac3+m_mac4+m_mac5+m_mac6;
//生成魔术包
BYTEmagicP[108];//存放魔术包数据
for(inti=0;i<6;i++)
magicP[i]=0xff;
for(i=0;i<6;i++){
magicP[i+6]=HexStrToInt(macAddr.Mid(i*2,2));
}
for(i=0;i<15;i++)
memcpy(&magicP[(i+2)*6],&magicP[6],6);
//启动WinSock
WSADATAWSAData;
if(WSAStartup(MAKEWORD(2,0),&WSAData)!
=0)
{
MessageBox("WSAStartupfailed!
");
return;
}
//创建socket
SOCKETsock=socket(AF_INET,SOCK_DGRAM,0);
if(sock==INVALID_SOCKET)
{
MessageBox("Socketcreateerror!
");
return;
}
//设置为广播发送
BOOLbOptVal=TRUE;
if(setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char*)&bOptVal,sizeof(BOOL))==SOCKET_ERROR)
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络工具 软件 开发 指导书