2024年4月18日发(作者:)
2008
年第
6
期
福建电脑
179
基于
VC6.0
实现计算机的远程关机
、
重起和注销
朱高华
,
郑天明
(
周口师范学院河南周口
466001
)
摘要
:
在
VC6.0
下利用
WinSock
控件编写服务器与客户端的程序
,
通过服务器与客户端的通信
,
调用
WINDOWSAPI
实现对客户端计算机的远程控制
,
并给出了部门核心代码
。
在客户端利用微软提供的
DETOUR
库和
HOOKAPI
技术
,
确保客
户端程序不被
WINDOWS
任务管理器强行关闭
,
提高服务器对客户端控制的可靠性
。
关键词
:
WINSOCK
,
WINDOWSAPI
,
HOOK
,
DETOUR
,
关机
、
重起和注销
现在很多高校都有学生机房
,
在管理和维护计算机的时候
,
经常要让计算机关机
、
重起和注销等操作
。
这是一项很繁重的工
作
。
为了避免这种简单重复的操作
,
笔者开发了一个计算机远程
控制系统
,
较好的解决了这个问题
。
下文以该系统为例
,
详细介
绍了远程控制的实现
。
1.
设计思想
在
C/S
结构中
,
服务器端和客户端通过
TCP/IP
协议进行通
信
。
首先
,
服务器和客户端通过
WINSOCK
控件进行连接
,
一旦
连上
,
服务器就可以向客户端发送控制消息
。
客户机收到该控制
信息后
,
对其进行分析
,
确认要进行的操作如关机
、
重起或注销
,
并调用相应的
API
函数
,
实现该过程
。
2.
服务器和客户端程序实现
2.1
下面给出主要的代码
:
2.1.1
服务器端
:
创建监听的
SOCKET
m_pListenSocket=newCListenSocket(this);
if(m_pListenSocket->Create(m_Port))
{
if(!m_pListenSocket->Listen(5))
{
MessageBox("
设置监听
SOCKET
时失败
!
","
提示
!
",MB_OK);
deletem_pListenSocket;
}
}
else
{
MessageBox("
创建
SOCKET
时失败
!
","
提示
!
",MB_OK);
deletem_pListenSocket;
}
}
建立连接
:
MessageBox("
和服务器进行连接出错
!
","
提示
!
",MB_OK);
returnNULL;
}
returnm_pTempSocket;
}
客户端调用
Receive(ControlMessage,500)
接受控制信息
,
分
析控制信息
,
最后调用相应的
API
函数完成操作
:
Switch(ControlMessage)
{
Case"LOGOFF":
::EXitWindowsEx(EWX_LOGOFF,0);
Case"SHUTDOWN":
::ExitWindwosEx(EWX_SHUTDOWN,0);
Case"REBOOT":
::ExitWindwosEx(EWX_REBOOT,0);
}
2.2
对该系统的进一步完善
为了不影响客户端计算机的使用
,
我们将客户端窗体进行
隐藏
,
这可以通过重载
DefWindowProc
函数来实现
:
DefWindowProc(UINTmessage,WPARAMwParam,LPARAMlParam)
{
if(message==133)
ShowWindow(SW_HIDE);
returnCDialog::DefWindowProc(message,wParam,lParam);
}
CAcceptSocket*pSocket=newCAcceptSocket(m_pServerDlg);
if(Accept(*pSocket))
{
MessageBox(NULL,"
同意连接请求
!","
提示
!",MB_OK);
m_pServerDlg->m_l(pSocket);
}
else
deletepSocket;
这样也可以实现客户端程序在任务管理器程序栏的隐身
,
防止客户端被非法关闭
。
在使用该系统的过程中
,
发现有些学生还是可以通过任务
管理器关闭进程的功能
,
强行结束客户端程序
,
下面我们就来分
析如何解决这个问题
。
我们知道
,
任务管理器关闭用户进程首先
要调用
OPENPROCEES
函数打开进程
,
将获得的进程句柄
pHandle
传递给
TerminateProcess
函数
,
强行结束进程
。
这就提示
我们可以使用
HOOKAPI
技术
,
拦截
OPENPROCESS
函数
,
如果
发现是监控进程
,
返回一个空值
。
这样
TerminateProcees
就得不
到要结束进程的句柄
,
也就无法结束该进程了
。
这个拦截功能
,
我们可以通过微软提供的
DETOURS
库简单方便的实现
。
下面给出部分代码
:
#include"detours.h"
#pragmacomment(lib,"")
HANDLEWINAPINewOpenProcess(DWORDdwDesiredAccess,BOOLbIn鄄
heritHandle,DWORDdwProcessId);
DETOUR_TRAMPOLINE(HANDLEWINAPINewOpenProcess(DWORD
dwDesiredAccess,BOOLbInheritHandle,DWORDdwProcessId),OpenProcess);
DWORDGetProcessIdFromName(LPCTSTRname);
HANDLEWINAPIJackOpenProcess(DWORDdwDesiredAccess,BOOLbIn鄄
heritHandle,DWORDdwProcessId)
{
if(dwProcessId==GetProcessIdFromName((LPCTSTR)""))
{
returnNULL;
}
HANDLEnResult=NewOpenProcess(dwDesiredAccess,bInheritHandle,dwPro鄄
cessId);returnnResult;
}
向客户端发送控制消息
:
CAcceptSocket*CurrentSocket=newCAcceptSocket(this);
CurrentSocket=(CAcceptSocket*)this->m_d();
(ControlMessage,Strlen(ControlMessage),0);
2.1.2
客户端程序
:
发送连接请求
:
CClientSocket*CClientDlg::ConnectToServer()
{
CClientSocket*m_pTempSocket=newCClientSocket(this);
if(!(m_pTempSocket->Create()))
{
deletem_pTempSocket;
MessageBox("
创建
SOCKET
出错
!
","
提示
!
",MB_OK);
returnNULL;
}
if(!m_pTempSocket->Connect((LPCTSTR)m_Address,m_Port))
{
deletem_pTempSocket;
将该拦截模块做成
DLL
文件
,
客户端程序加载该文件
,
并
为任务管理器程序安装钩子
,
实现该拦截功能
:
(
下转第
180
页
)
180
福建电脑
2008
年第
6
期
使用
C++
开发教学用
SimpleTron
虚拟计算机
曾浩
(
南京化工职业技术学院信息系江苏南京
210048
)
摘要
:
本文研究了如何开发一种称为
SimpleTron
的虚拟计算机
,
讨论了该计算机的结构和性能
,
并指出其在教学中的
应用价值
。
关键词
:
虚拟计算机
随着计算机软硬件技术的进步
,
计算机的人机接口变得越
来越友好
,
使用也越来越方便
,
同时
,
由于软硬件的层层封装
,
计
算机底层与使用者越来越远
,
从而增加了学习计算机原理课程
的学生的学习困难
,
尤其是很难找到一个合适的实验平台
。
一些
虚拟机软件如
VMware
,
模拟的是现实计算机
,
并没有体现计算
机的本质特征
,
源程序也没有公开
。
本文使用
C++
开发了一个称
为
SimpleTron
的虚拟计算机
,
它具有
CPU
,
控制器
,
内存等体现
计算机本质特征的部分
,
源程序全部公开
,
可以供教学时参考
,
并可以在此基础上让学生扩充和改进该计算机的功能以作练习
之用
,
使大学的计算机基础
,
计算机原理等相关课程有一个良好
的学习开发平台
。
作者在教学中使用之取得了良好的效果
。
Simpletron
计算机
,
顾名思义
,
它是一个简单的机器
,
同时它
也具有强大的功能
。
Simpletron
只能运用于它能理解的唯一语
言
,
即
Simpletron
机器语言
(
简称
SML
)
编写的程序
。
Simpletron
包含一个累加器
(
一个
"
特殊寄存器
"
),
存放
Simpletron
用于计算和处理的各种信息
。
Simpletron
中的所有信
息都是按照
"
字
"
来处理的
。
字是带符号的
4
位十进制数
,
例如
+
3364
,
-1293
,
+0007
,
-0001
,
等等
。
Simpletron
带有
100
个字的内
存
,
并且这些字通过它们的位置编号
00
,
01
,…
,99
被引用
。
在运
行一个
SML
程序之前
,
我们必须把程序载入或者放置到内存
。
每个
SML
程序的第一条指令
(
或语句
)
总是放在位置
00
处
。
模
拟器从这个位置开始执行
。
使用
SML
编写的每条指令占用
Simpletron
内存中的一个
字
;
因此
,
指令是带符号的
4
位十进制数
。
假设
SML
指令的符号
总是正号
,
但是数据字的符号可正可负
。
Simpletron
内存中的每
个位置可以包含一条指令
,
程序使用的一个数据值或未用到的
(
即未定义的
)
内存区
。
每个
SML
指令的前两位数字是操作码
,
指定要进行的操作
。
SML
指令的后两位数字是操作数
,
也就是要操作的字的内
存位置
。
现在让我们考虑下面的
SML
程序
(
如图
2
所示
)
从键盘读
入两个数
,
然后计算并打印它们的和
。
指令
+1007
从键盘读入第
一个数字
,
并把它存放的内存位置
07
(
初始化为
0
)
处
。
指令
+
1008
读入下一个数到内存位置
08
处
。
载入指令
+2007
,
把第一
个数放置
(
复制
)
到累加器
,
然后加法指令
+3008
把第二个数和
累加器中的数相加
。
所有的
SML
算术运算指令都把它们的结果
留在累加器中
。
存储指令
+2109
把结果放回
(
复制
)
到内存位置
09
。
然后
,
写入指令
+1109
取得这个数并打印它
9
作为一个带符
号的
4
位十进制
)。
停止指令
+4300
终止执行
。
图
1Simpletron
机器语言
(
SMK
)
操作码
图
2SML
示例
下面对
SimpleTron
的软件结构作一分析
。
首先是一个初始
化模块
,
用于定义各个指令代码
,
初始化一个简单数组作为内存
区域
,
定义各个寄存器
,
并且全部清零
。
然后启动一个输入模块
,
用于接受用户输入的
SML
指令
,
输入完毕后进入执行逻辑模
块
。
执行逻辑模块先将指令的操作码和操作数分离
,
用一个多路
分支语句判断操作码从而执行不同的操作
,
模拟了
CPU
和控制
器的运作
。
最后
,
通过一个屏幕输出模块将机器状态输出供参
考
。
以上简要描述了
SimpleTron
的原理和结构
,
在实际使用中
,
还可以作必要的扩充
,
如扩展内存容量
,
对内存作分区保护等
,
这些内容在教学上具有很大的使用价值
。
参考文献
:
1.H.
,
P..
张引等译
C++
大学教程
(
第五版
)
.
北京
:
电子工
业出版社
,
2007.
2.
张福炎
,
孙志挥
.
信息技术教程
.
南京大学出版社
,
2004.
3.
徐君毅
.
单片微型计算机原理
.
北京
:
人民邮电出版社
,
2004.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
(
上接第
179
页
)
hinstDLL=LoadLibrary((LPCTSTR)"");
hkprcMsgProc=(HOOKPROC)GetProcAddress(hinstDLL,"MsgProc");
hhookMsg=SetWindowsHookEx(WH_GETMESSAGE,hkprcMsgProc,hinst鄄
DLL,0);
靠
。
参考文献
:
1.
丁展
、
刘海英
VisualC++
网络通信编程人民邮电出版社
yRichter
《
Windows
核心编程
》
机械工业出版社
3.
结束语
利用该系统将管理员从频繁的开关机中解脱出来
,
使用证
明效果是明显的
。
对客户端程序的改进更是让监控更加实用可
发布评论