打造一款属于自己的远程控制软件(二)

前一篇文章介绍了软件的整体架构,接下来对被控端进行详细讲解,主要介绍被控端各个功能模块的关键技术以及开发过程中遇到的坑,希望对各位读者有借鉴作用。

被控端工作流程

应用程序初始化阶段初始化工作界面、从地址文件读取反向连接的ip地址和端口作为MyClientThread线程的启动参数。MyClientThread启动后执行GetClientSystemInfo函数获取本机信息并传至控制端显示。而后进入while(1)循环等待接收控制端传来的控制命令。进入switch_case结构解析命令,执行相应函数。将执行结果发送到控制端,继续进入循环等待。

获取计算机信息

GetClientSystemInfo传入一个SYSTEMINIT结构的引用,对该结构的定义在common.h文件中,该结构定义如下:

调用GetComputerName、GetUserName、GetVersionEx、GlobalMemoryStatus来分别获取计算机名、当前用户名、操作系统版本、内存信息。CPU的信息通过查询注册表来获取,通过打开不同的注释(3个中只能打开一个)获取CPU的不同信息,这里我们选择获取CPU的频率信息。

这里专门定义了一个CGetHDSerial类来封装序列号读取相关的操作。CGetHDSerial的成员函数如下:

函数调用关系为:

获取服务

参数为存放SERVICEINFO指针类型的容器。SERVICE数据结构定义为:

这里用到OpenSCManager函数,该函数建立了一个到服务控制管理器的连接,并打开指定的数据库。第一个参数为计算机名,若为NULL则指向本地计算机。第二个参数指定将要打开的服务控制管理数据库的名称,这里为NULL,表示指向本地默认。第三个参数为服务访问控制管理器的权限。执行成功返回一个服务控制管理器数据库的句柄ScManager。

由返回的句柄调用EnumServicesStatus函数枚举当前系统服务

获取进程列表

GetProcessList参数为PROCESSINFO指针类型的容器。PROCESSINFO数据结构在common.h中定义。

首先调用CreateToolhelpSnapshot获得当前系统中所有进程的快照,返回快照句柄。第二步调用Process32First获得第一个进程快照信息info,得到进程PID和进程名称。为了得到当前进程加载模块的完整路径,需要调用OpenProcess来打开对应进程对象。然而通过几次打开失败后发现,原来在默认的情况下进程的一些访问权限是没有被启用的,即使你是Administrator,所以很重要的一步就是提升当前进程的权限(启用这些权限),所以先调用OpenProcessToken打开相关进程的访问令牌(参数自己百度),而后调用EnablePrivilege提升当前进程权限,这样就可以打开进程对象了。第三步,通过while循环获得其他进程的信息。

CGetScreenToBitmap类用来获取当前屏幕画面转化成位图信息。

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2018-03-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员同行者

django权限管理(Permission)

1.3K40
来自专栏黑泽君的专栏

用gcc编译c语言程序以及其编译过程

对于初学c语言编程的我们来说,学会如何使用gcc编译器工具,对理解c语言的执行过程,加深对c语言的理解很重要!!!

17110
来自专栏Golang语言社区

Go语言中的管道(Channel)总结

管道(Channel)是Go语言中比较重要的部分,经常在Go中的并发中使用。今天尝试对Go语言的管道来做以下总结。总结的形式采用问答式的方法,让答案更有目的性。...

43760
来自专栏JarvanMo的IT专栏

Node.js文件路径的坑

没错,我想读取system-config.json中的配置。刚开始,无论如何也读不到,连个错误信息也没有。调试了一番,终于出了一个错误信息: no such ...

21440
来自专栏DeveWork

WordPress免插件仅代码实现文章浏览次数的方法(2)

上一篇文章中已经给出了一种纯代码实现实现文章浏览次数的方法,今天再来提供另外一种。如果之前的不能实现,可以用这个来试试。代码来源于willian大师的my_vi...

208100
来自专栏LuckQI

Java多线程总结三

8520
来自专栏Laoqi's Linux运维专列

nginx的502问题

36350
来自专栏Android-薛之涛

Android-多线程

        通俗的说:我们平日里打开的QQ,微信,简书,都是一个进程。进程是程序的一次动态执行过程,它需要经历从代码加载,代码执行到执行完毕的一个完整的过程...

10620
来自专栏Java工程师日常干货

【SpringBoot专题】多环境配置及swagger前言多环境配置分析swagger

在上一篇博客《【SpringBoot专题】快速体验 》中已经带领大家初步了解了SpringBoot,本篇博客将为大家介绍多环境配置、swagger等相关内容。

12440
来自专栏前端杂货铺

深入seajs源码系列一

简述         前端开发模块化已经是大势所趋,目前模块化的规范有很多,众所周知的有commonJS,Module/Wrappings和AMD等,而且ES6...

31590

扫码关注云+社区

领取腾讯云代金券