首页 > 系统相关 >19.12 Boost Asio 获取远程进程

19.12 Boost Asio 获取远程进程

时间:2023-11-09 14:14:51浏览次数:30  
标签:Asio std PROCESSENTRY32 socket process boost 19.12 include Boost

远程进程遍历功能实现原理与远程目录传输完全一致,唯一的区别在于远程进程枚举中使用EnumProcess函数枚举当前系统下所有活动进程,枚举结束后函数返回一个PROCESSENTRY32类型的容器,其中的每一个成员都是一个进程信息,只需要对该容器进行动态遍历即可得到所有的远程主机列表。

服务端代码如下所示,首先代码中通过read_some第一次接收到对端进程数量,接着通过第一个循环,将接收到的字符串数据强制转换为PROCESSENTRY32类型的结构,并将结构存入vector容器内,第二个循环则用于枚举输出我们整理好的容器列表。

#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <vector>
#include <Windows.h>
#include <tlhelp32.h>
#include <boost/lexical_cast.hpp>

using namespace boost;
using namespace boost::asio;
using namespace std;

int main(int argc, char* argv[])
{
  io_service io_service;
  ip::tcp::acceptor acceptor(io_service, ip::tcp::endpoint(ip::tcp::v4(), 6666));
  ip::tcp::socket socket(io_service);
  acceptor.accept(socket);
  boost::system::error_code error_code;

  // 接收客户端的进程数量
  char process_count[32] = { 0 };
  socket.read_some(boost::asio::buffer(process_count), error_code);
  std::cout << "接收到的进程数量: " << process_count << std::endl;

  std::vector<PROCESSENTRY32> recv_process_list;

  // 循环接收客户端进程结构体
  for (int x = 0; x < lexical_cast<int>(process_count); x++)
  {
    // 接收字节序,并存入本地列表中
    char recv_buffer[sizeof(PROCESSENTRY32)] = { 0 };
    socket.read_some(boost::asio::buffer(recv_buffer, sizeof(PROCESSENTRY32)), error_code);

    // 强转指针
    PROCESSENTRY32 *ptr = (PROCESSENTRY32 *)recv_buffer;
    // 将每一个 PROCESSENTRY32 结构存入vector容器
    recv_process_list.push_back(*ptr);
  }

  // 循环输出 PROCESSENTRY32 测试是否可读取
  for (int x = 0; x < recv_process_list.size(); x++)
  {
    std::cout << "进程PID: " << recv_process_list[x].th32ProcessID 
      << "父进程PID: " << recv_process_list[x].th32ParentProcessID 
      << "进程名称: " << recv_process_list[x].szExeFile << std::endl;
  }

  std::system("pause");
  return 0;
}

客户端代码如下所示,其实现原理与文件传输功能完全一致,此处只是更换了一个EnumProcess函数,其传输方式此处就不在赘述。

#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <vector>
#include <Windows.h>
#include <tlhelp32.h>
#include <boost/lexical_cast.hpp>

using namespace boost;
using namespace boost::asio;
using namespace std;

// 输出系统进程信息,并出入vector容器中返回给调用者
std::vector<PROCESSENTRY32> EnumProcess()
{
  std::vector<PROCESSENTRY32> process_info;

  PROCESSENTRY32 pe32 = { 0 };
  pe32.dwSize = sizeof(PROCESSENTRY32);

  // 获取全部进程快照
  HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (INVALID_HANDLE_VALUE != hProcessSnap)
  {
    // 获取快照中第一条信息
    BOOL bRet = Process32First(hProcessSnap, &pe32);
    while (bRet)
    {
      // 将进程快照到的列表加入到容器中
      process_info.push_back(pe32);

      // 获取快照中下一条信息
      bRet = Process32Next(hProcessSnap, &pe32);
    }
    CloseHandle(hProcessSnap);
  }
  return process_info;
}

int main(int argc, char * argv[])
{
  io_service io_service;
  ip::tcp::socket socket(io_service);
  ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 6666);

  boost::system::error_code error_code;
  socket.connect(ep, error_code);

  // send_process_list 存储需要发送的结构体
  std::vector<PROCESSENTRY32> send_process_list = EnumProcess();

  // 首先将当前进程数量发送给服务端
  std::string process_count = lexical_cast<std::string>(send_process_list.size());
  std::cout << "当前进程数量: " << process_count << std::endl;
  socket.write_some(boost::asio::buffer(process_count));

  // 循环发送每一个进程结构
  for (int x = 0; x < send_process_list.size(); x++)
  {
    // 定义发送字节序缓冲区
    char send_buffer[sizeof(PROCESSENTRY32)] = { 0 };

    // 拷贝字节序并发送字节序
    memcpy(send_buffer, &send_process_list[x], sizeof(PROCESSENTRY32));
    socket.write_some(boost::asio::buffer(send_buffer, sizeof(PROCESSENTRY32)));
  }

  std::system("pause");
  return 0;

}

读者可自行编译上述代码片段,并依次运行服务端与客户端,此时读者可清晰的看到目标主机中所运行的完整进程列表。

标签:Asio,std,PROCESSENTRY32,socket,process,boost,19.12,include,Boost
From: https://www.cnblogs.com/LyShark/p/17819598.html

相关文章

  • 19.13 Boost Asio 发送TCP流数据
    Boost框架中默认就提供了针对TCP流传输的支持,该功能可以用来进行基于文本协议的通信,也可以用来实现自定义的协议。一般tcp::iostream会阻塞当前线程,直到IO操作完成。首先来看服务端代码,如下所示在代码中首先通过GetFileSize读取文件行数,当有了行数我们就可以使用循环的方式依次调......
  • 19.13 Boost Asio 发送TCP流数据
    Boost框架中默认就提供了针对TCP流传输的支持,该功能可以用来进行基于文本协议的通信,也可以用来实现自定义的协议。一般tcp::iostream会阻塞当前线程,直到IO操作完成。首先来看服务端代码,如下所示在代码中首先通过GetFileSize读取文件行数,当有了行数我们就可以使用循环的方式依次调......
  • 19.13 Boost Asio 发送TCP流数据
    Boost框架中默认就提供了针对TCP流传输的支持,该功能可以用来进行基于文本协议的通信,也可以用来实现自定义的协议。一般tcp::iostream会阻塞当前线程,直到IO操作完成。首先来看服务端代码,如下所示在代码中首先通过GetFileSize读取文件行数,当有了行数我们就可以使用循环的方式依次调......
  • 19.6 Boost Asio 文本压缩传输
    Base64是一种二进制到文本的编码方案,用于将二进制数据转换为ASCII字符串格式。它通过将二进制数据流转换为一系列64个字符来工作,这些字符都可以安全地传输到设计用于处理文本数据的系统中。如下代码中我们使用Boost中提供的base64_from_binary头文件实现两个函数,其中Base64Decode......
  • 19.7 Boost Asio 传输序列化数据
    序列化和反序列化是指将数据结构或对象转换为一组字节,以便在需要时可以将其存储在磁盘上或通过网络传输,并且可以在需要时重新创建原始对象或数据结构。序列化是将内存中的对象转换为字节的过程。在序列化期间,对象的状态被编码为一组字节,并可以保存或传输到另一个位置。序列化后的......
  • Daleks' Invasion 题解
    Daleks'Invasion题目大意给定一张无向带权图,对于每条边求一个最大的\(x\),使得将这条边的边权修改为\(x\)后这条边能位于这张图的最小生成树上。思路分析没事干了就把之前写过的题拉出来水题解。我们先把原图的最小生成树求出来,考虑每条边\((u,v)\),分类讨论:如果这条边......
  • 网站顺滑不卡,Booster插件值得更多跨境电商商家选择
    随着电子商务的不断发展,现在的人们对网站的要求也变得越来越高。据Kissmetrics的一项调查数据显示,有47%的人希望网站在2秒钟内打开,网站如果超过3秒还没有动静,那么有40%的人会选择离开。所以对跨境电商商家来说,提高网站打开速度,优化客户使用体验,就显得十分重要了。那么有什么工......
  • 19.10 Boost Asio 同步文件传输
    在原生套接字编程中我们介绍了利用文件长度来控制文件传输的方法,本节我们将采用另一种传输方式,我们通过判断字符串是否包含goodbyelyshark关键词来验证文件是否传输结束了,当然了这种传输方式明显没有根据长度传输严谨,但使用这种方式也存在一个有点,那就是无需确定文件长度,因为无需......
  • 19.10 Boost Asio 同步文件传输
    在原生套接字编程中我们介绍了利用文件长度来控制文件传输的方法,本节我们将采用另一种传输方式,我们通过判断字符串是否包含goodbyelyshark关键词来验证文件是否传输结束了,当然了这种传输方式明显没有根据长度传输严谨,但使用这种方式也存在一个有点,那就是无需确定文件长度,因为无需......
  • 解决xgboost\core.py", ValueError: feature_names may not contain [, ] or <
    解决"xgboost\core.py",ValueError:feature_namesmaynotcontain[,]or<在使用xgboost进行特征工程时,有时会遇到类似下面的错误提示:pythonCopycodeFile"xgboost\core.py",lineXXX,inset_inforaiseValueError('feature_namesmaynotcontain[,]o......