优秀的毕业设计论文网
计算机 JAVA 电子信息 单片机 机械机电 模具 土木工程 建筑结构 论文
热门搜索词:网络 ASP.NET 汽车 电气 数控 PLC

一种简单木马

以下是资料介绍,如需要完整的请充值下载.
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
  
资料介绍:

3 系统设计
3.1 系统总体设计
3.1.1 设计目标
本程序利用VC6.0++这一集成开发平台,在Windows环境下开发的一个基于远程控制的简单木马实现。木马编写采用C/S结构,包括服务端Server和客户端Client。Client上单击每一个按钮,就向Server端发送一个字母消息,Server端收到对应的字母消息后,用相应的函数进行判断,根据收到的具体字母,Server端调用相应的函数来具体实现每一个功能。系统客户端和服务端通信如图3-1:
图3-1系统通信 think58

[来源:http://www.think58.com]

3.1.2 功能介绍
程序中将对远程被控主机实现以下操作:获取远程被控计算机系统基本信息、锁定远程被控计算机的鼠标操作、锁定远程被控计算机的键盘操作、注销重启和关闭被控计算机、隐藏并开启被控计算机的任务栏、向被控计算机发送消息、获取并杀死远程被控计算机的进程。具体功能如图3-2: think58.com [资料来源:www.THINK58.com]

[资料来源:THINK58.com]

think58好,好think58

[资料来源:http://www.THINK58.com]

本文来自think58 [资料来源:THINK58.com]

内容来自think58 [来源:http://think58.com]

think58.com [来源:http://www.think58.com]

[资料来源:http://THINK58.com]

本文来自think58 [资料来源:THINK58.com]

think58 [版权所有:http://think58.com]


图3-2具体功能图
3.2 具体功能实现
3.2.1 获取信息功能
当Server先在被控计算机上启动以后,Client输入被控计算机IP如:192.168.0.5,就可以连接上服务端,Client 端单击获取信息按钮,Server端收到Client发过来的消息并响应,然后Server端调用四个API函数:调用函数GetSystemInfo()来返回当前系统的信息,调用函数GlobalMemoryStatus()来获得当前可用的物理和虚拟内存信息,调用函数GetVersionEx()来返回当前操作系统的版本信息,调用函数GetSystemMetrics()来返回与Windows环境有关的信息。Server通过调用以上函数,得到系统消息,并返回给Client. Client 端收到Server返回的消息并显示在文本框中如图3-3: [来源:http://www.think58.com]

内容来自think58

[资料来源:http://think58.com]

[资料来源:http://THINK58.com]

[资料来源:THINK58.com]

本文来自think58 [来源:http://www.think58.com]

think58.com [资料来源:http://think58.com]

[资料来源:THINK58.com]

内容来自think58

[版权所有:http://think58.com]

[版权所有:http://think58.com]

本文来自think58

[资料来源:www.THINK58.com]

图3-3获取消息
客户端源获取消息控件的核心代码如下:
void CClientDlg::OnGetinformation()
{
// TODO: Add your control notification handler code here
m_message.ResetContent();
m_message.SendMessage(LB_SETHORIZONTALEXTENT,0,0);
pThreadInformation=::AfxBeginThread(_GetInformationThread,this);
}

内容来自think58

[资料来源:http://think58.com]

[资料来源:www.THINK58.com]

3.2.2 清除信息
此功能主要实现客户端文本框中对获取的系统信息和进程信息进行删除。当Client接收到Server返回的系统信息和进程信息以后,单击Client上面的清除信息按钮就可以清除掉文本框中的信息。本功能不需要要Server和Client进行通信,client通过调用成员函数CClientDlg::OnClean(){}中的函数CClientDlg::OnClean(){}就可以实现。Client端获取Server端系统信息并清除的效果如图3-4和3-5: copyright think58 [资料来源:http://think58.com]

图3-4获取信息 图3-5清除信息
客户端核心代码如下:
void CClientDlg::OnClean()
{
// TODO: Add your control notification handler code here
m_message.ResetContent();
m_message.SendMessage(LB_SETHORIZONTALEXTENT,0,0);
}
3.2.3 锁定鼠标和键盘
本功能主要实现锁定远程受控鼠标和键盘的移动,单击,双击等操作,具体实现方式如下:client端点击“锁定鼠标”或者“锁定键盘”按钮,发送消息到server端。Server端通过全局变量函数LockOrUnLockKey和LockOrUnLockMouse来判断是操作键盘还是鼠标,然后用相应的钩子(HOOK函数)来拦截Server端的消息来实现鼠标或键盘的锁定。client通过调用void CClientDlg::OnLockMouse() 函数向server端发送消息,激发server端的锁定鼠标函数响应;通过调用void CClientDlg::OnUnLockKeyBord() 函数激发server端的开启鼠标函数响应;通过调用void CClientDlg::OnLockKeyBord() 函数激发server端锁定键盘函数响应;通过调用void CClientDlg::OnUnLockKeyBord()函数激发server端开启键盘函数响应。锁定开启键盘和鼠标的效果图如图3-6: 内容来自think58

[资料来源:http://THINK58.com]

think58好,好think58

[资料来源:www.THINK58.com]

[版权所有:http://think58.com]

think58.com

[资料来源:http://think58.com]

[来源:http://www.think58.com]

think58

[资料来源:http://www.THINK58.com]

think58

[版权所有:http://think58.com]

图3-6 锁定鼠标
3.2.4 注销、重启和关机
这三个功能都是调用ExitWindowsEx函数实现,所不同的是远程重启和关机所需要的权限较高,需要把程序进程提权。远程重启和关机的实现比较类似,只是ExitWindowsEx的调用不同(重启EWX_REBOOT,关机EWX_SHUTDOWN)。服务端添加注销计算机函数LogOff(),重启计算机函数Reboot()和关机函数poweroff()。
核心代码如下:
注销功能是通过以下函数实现:
int CMainFrame::LogOff() //注销
{
ExitWindowsEx(EWX_LOGOFF,0);
return 0;
}
重新启动计算机通过以下函数实现:
int CMainFrame::Reboot() //重新启动
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
DWORD dwVersion; // 版本号
dwVersion = GetVersion(); //得到WINDOWS NT或Win32的版本号
if(dwVersion < 0x80000000)
{
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; //设置权限
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 本文来自think58 [来源:http://www.think58.com]
AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);
}
else //WIN系列其它系统
{
ExitWindowsEx(EWX_FORCE | EWX_REBOOT, 0);
}
return 0;
}
关机功能通过以下函数实现:
int CMainFrame::PowerOff() //关机
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
DWORD dwVersion; // 版本号
dwVersion = GetVersion(); //得到WINDOWS NT或Win32的版本号
if(dwVersion < 0x80000000) //用于判断WIN系列,从而设置相应的权限
{
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
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);
ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0);
}
else
{
ExitWindowsEx(EWX_FORCE | EWX_SHUTDOWN, 0); think58.com

[资料来源:http://think58.com]


}
return 0;
} 本文来自think58 [资料来源:http://think58.com]

3.2.5 隐藏并开启任务栏
当server与client连接以后,单击client的隐藏任务栏和开启任务栏按钮,就可以实现对server端任务栏的隐藏和开启的功能。这个功能的实现方式如下:client端点击“隐藏任务栏” ,并发送消息到server端。Server端通过添加HideTaskBar()函数来隐藏任务栏,添加UnHideTaskBar()函数来开启任务栏。隐藏任务栏和开启任务栏的具体效果如图3-7和3-8: think58 [资料来源:www.THINK58.com]

think58好,好think58

[资料来源:http://THINK58.com]

[版权所有:http://think58.com]


图3-7隐藏任务栏 内容来自think58 [资料来源:http://THINK58.com]

copyright think58 [资料来源:www.THINK58.com]

[资料来源:http://www.THINK58.com]


图3-8开启任务栏 本文来自think58 [资料来源:THINK58.com]

服务端核心代码:
隐藏任务栏HideTaskBar()函数具体实现如下:
int CMainFrame::HideTaskBar()
{
CWnd *task;
task = (CWnd*)FindWindow("Shell_TrayWnd", NULL);
task->ShowWindow(SW_HIDE);
return 0;
}
开启任务栏UnHideTaskBar()函数具体实现如下:
int CMainFrame::UnHideTaskBar()
{
CWnd *task;
task = (CWnd*)FindWindow("Shell_TrayWnd", NULL);
task->ShowWindow(SW_SHOW);
return 0;
}
客户端核心代码:
隐藏任务栏
void CClientDlg::OnHide()
{
CSocket sockClient;
sockClient.Create();
CString ip,strError;
m_ip.GetWindowText(ip); //获得IP
int conn=sockClient.Connect(ip, PORT-1);
if(conn==0)
{
AfxMessageBox("_SendMsgThread Connect错误!"+GetLastError());
sockClient.ShutDown(2);
sockClient.Close();
AfxEndThread(1L);
}
int end=0;
end=sockClient.Send("H",FLAG);
if(end==SOCKET_ERROR) 本文来自think58

[资料来源:http://think58.com]

{
AfxMessageBox("_SendMsgThread Send错误!"+GetLastError());
}
else if(end!=2)
{
AfxMessageBox("消息头错误");
}
}
如果连接正确应该返回2
开启任务栏函数
void CClientDlg::OnOpen()
{
// TODO: Add your control notification handler code here
CSocket sockClient;
sockClient.Create();
CString ip,strError;
m_ip.GetWindowText(ip); //获得IP
int conn=sockClient.Connect(ip, PORT-1);
if(conn==0)
{
AfxMessageBox("_SendMsgThread Connect错误!"+GetLastError());
sockClient.ShutDown(2);
sockClient.Close();
AfxEndThread(1L);
}
int end=0;
end=sockClient.Send("O",FLAG);
if(end==SOCKET_ERROR)
{
AfxMessageBox("_SendMsgThread Send错误!"+GetLastError());
}
else if(end!=2)
{
AfxMessageBox("消息头错误");
}
}
[资料来源:THINK58.com]