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.

结束语

利用该系统将管理员从频繁的开关机中解脱出来

使用证

明效果是明显的

对客户端程序的改进更是让监控更加实用可