WIN32核心编程 - 进程操作(二) 遍历进程 - 进程通信

  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> 链接点击跳转博客主页

目录

遍历进程

CreateToolhelp32Snapshot

EnumProcesses

NtQuerySystemInformation

进程通信

clipboard

FileMapping

NamedPipe

Mailslot


遍历进程

CreateToolhelp32Snapshot

#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>

int main()
{
	HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (hSnap != INVALID_HANDLE_VALUE)
	{
		setlocale(LC_ALL, "chs");
		PROCESSENTRY32 pe32 = { 0 };
		pe32.dwSize = sizeof(pe32);

		BOOL bRet = Process32First(hSnap, &pe32);
		while (bRet)
		{
			wprintf(L"%s %d\r\n", pe32.szExeFile, pe32.th32ProcessID);
			if (lstrcmp(pe32.szExeFile, L"die.exe") == 0)
			{
				HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
				if (hProcess != NULL)
				{
					TerminateProcess(hProcess, 0);
					CloseHandle(hProcess);
				}
			}
			bRet = Process32Next(hSnap, &pe32);
		}

		CloseHandle(hSnap);
	}

	return 0;
}

EnumProcesses

#include <iostream>
#include <Windows.h>
#include <Psapi.h>

int main()
{
	DWORD dwProcessCount = 0;
	DWORD dwProcessIdArr[1024] = { 0 };
	if (!EnumProcesses(dwProcessIdArr, sizeof(dwProcessIdArr), &dwProcessCount))
	{
		return 0;
	}

	for (size_t i = 0; i < dwProcessCount / 4; i++)
	{
		printf("ProcessId -> [%d] \r\n", dwProcessIdArr[i]);
		HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessIdArr[i]);
		if (hProcess != NULL)
		{
			DWORD dwModuleCount = 0;
			HMODULE hMod = NULL;
			if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &dwModuleCount))
			{
				TCHAR szName[MAX_PATH] = { 0 };
				if (GetModuleBaseName(hProcess, hMod, szName, sizeof(szName) / sizeof(TCHAR)))
				{
					printf("%ws \r\n", szName);
				}
			}
		}

	}

	return 0;
}

NtQuerySystemInformation

  #include <iostream>
#include <Windows.h>

/*
	NTSTATUS
	NtQuerySystemInformation(
	__in SYSTEM_INFORMATION_CLASS SystemInformationClass,
	__out_bcount_opt(SystemInformationLength) PVOID SystemInformation,
	__in ULONG SystemInformationLength,
	__out_opt PULONG ReturnLength
	);
*/
#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
#define SystemProcessInformation 5
typedef LONG KPRIORITY;
typedef NTSTATUS(WINAPI* NtQuerySystemInformation)(DWORD, PVOID, ULONG, PULONG);
typedef struct _UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;    
    PWCH   Buffer;
} UNICODE_STRING;
typedef struct _SYSTEM_PROCESS_INFORMATION {
    ULONG NextEntryOffset;
    ULONG NumberOfThreads;
    LARGE_INTEGER SpareLi1;
    LARGE_INTEGER SpareLi2;
    LARGE_INTEGER SpareLi3;
    LARGE_INTEGER CreateTime;
    LARGE_INTEGER UserTime;
    LARGE_INTEGER KernelTime;
    UNICODE_STRING ImageName;
    KPRIORITY BasePriority;
    HANDLE UniqueProcessId;
    HANDLE InheritedFromUniqueProcessId;
    ULONG HandleCount;
    ULONG SessionId;
    ULONG_PTR PageDirectoryBase;
    SIZE_T PeakVirtualSize;
    SIZE_T VirtualSize;
    ULONG PageFaultCount;
    SIZE_T PeakWorkingSetSize;
    SIZE_T WorkingSetSize;
    SIZE_T QuotaPeakPagedPoolUsage;
    SIZE_T QuotaPagedPoolUsage;
    SIZE_T QuotaPeakNonPagedPoolUsage;
    SIZE_T QuotaNonPagedPoolUsage;
    SIZE_T PagefileUsage;
    SIZE_T PeakPagefileUsage;
    SIZE_T PrivatePageCount;
    LARGE_INTEGER ReadOperationCount;
    LARGE_INTEGER WriteOperationCount;
    LARGE_INTEGER OtherOperationCount;
    LARGE_INTEGER ReadTransferCount;
    LARGE_INTEGER WriteTransferCount;
    LARGE_INTEGER OtherTransferCount;
} SYSTEM_PROCESS_INFORMATION, * PSYSTEM_PROCESS_INFORMATION;

int main()
{
    NTSTATUS status = NULL;
	HMODULE hModule = NULL;
    ULONG uLength = 0xFFFFF;
    ULONG uRet = 0;
    NtQuerySystemInformation pFun  = NULL;
    PSYSTEM_PROCESS_INFORMATION pInfo = NULL;

	//NtQuerySystemInformation
	hModule = LoadLibrary(TEXT("ntdll.dll"));
	pFun = (NtQuerySystemInformation)GetProcAddress(hModule, "NtQuerySystemInformation");
    pInfo = (PSYSTEM_PROCESS_INFORMATION)malloc(uLength);
    status = pFun(SystemProcessInformation, pInfo, uLength, &uRet);
    if (NT_SUCCESS(status))
    {
        while (pInfo->NextEntryOffset)
        {
            printf("%ws %d \r\n", pInfo->ImageName.Buffer, pInfo->UniqueProcessId);
            pInfo = (PSYSTEM_PROCESS_INFORMATION)((PUCHAR)pInfo + pInfo->NextEntryOffset);
        }
    }
	return 0;
}

进程通信

clipboard

#include <iostream>
#include <Windows.h>

int main()
{
	//CTRL C
	#if 0
	const char* str = "Hello 0xCC";

	//打开剪贴板 OpenClipboard
	if (!OpenClipboard(NULL)) return 0;

	//清空剪贴板 EmptyClipboard
	if (!EmptyClipboard())
	{
		CloseClipboard();
		return 0;
	}

	//分配内存区 GlobalAlloc
	HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, strlen(str) + 1);
	if (hMem == NULL)
	{
		CloseClipboard();
		return 0;
	}

	PVOID pBuffer = GlobalLock(hMem);
	if (pBuffer == NULL)
	{
		CloseClipboard();
		return 0;
	}

	memcpy(pBuffer, str, strlen(str) + 1);
	GlobalUnlock(hMem);

	//设置剪贴板 SetClipboard
	SetClipboardData(CF_TEXT, hMem);

	//关闭剪贴板 CloseClipboard
	CloseClipboard();
	#endif 

	//CTRL V
	#if 0
	//打开剪贴板 OpenClipboard
	if (!OpenClipboard(NULL)) return 0;

	//获取剪贴板 GetClipboardData
	HANDLE hData = GetClipboardData(CF_TEXT);
	if (hData == NULL)
	{
		CloseClipboard();
		return 0;
	}

	PCHAR pStr = (PCHAR)GlobalLock(hData);
	std::cout << pStr << std::endl;
	GlobalUnlock(hData);

	//关闭剪贴板 CloseClipboard
	CloseClipboard();
	
	#endif

	return 0;
}

FileMapping

#include <iostream>
#include <windows.h>

int main()
{
	//创建文件映射对象
	HANDLE hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,0xFF,TEXT("0xCCShare"));
	if (hMapFile == NULL)
	{
		std::cout << "CreateFileMapping ErrorCode -> " << GetLastError() << std::endl;
		return 0;
	}

	//映射对象视图
	LPVOID lpBuffer = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
	if (lpBuffer == NULL)
	{
		std::cout << "MapViewOfFile ErrorCode -> " << GetLastError() << std::endl;
		return 0;
	}

	//写入共享内存数据
	char szStr[] = "Exit";
	memcpy(lpBuffer, szStr, sizeof(szStr));

	//等待进程读取
	std::cout << "Success Share Mem " << std::endl;
	std::cin.get();

	//释放资源
	UnmapViewOfFile(lpBuffer);
	CloseHandle(hMapFile);

	return 0;
}
#include <iostream>
#include <windows.h>

int main()
{
	//打开存在文件映射对象
	HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, TEXT("0xCCShare"));
	if (hMapFile == NULL)
	{
		std::cout << "OpenFileMapping ErrorCode -> " << GetLastError() << std::endl;
		return 0;
	}

	//映射对象视图
	LPVOID lpBuffer = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
	if (lpBuffer == NULL)
	{
		std::cout << "MapViewOfFile ErrorCode -> " << GetLastError() << std::endl;
		return 0;
	}

	std::cout << "Read Info -> " << static_cast<char*>(lpBuffer) << std::endl;
	std::cin.get();

	//获取共享内存数据
	if (strcmp((PCHAR)lpBuffer, "Exit") == 0)
	{
		ExitProcess(0);
	}

	//释放资源
	std::cout << "Free" << std::endl;
	UnmapViewOfFile(lpBuffer);
	CloseHandle(hMapFile);

	return 0;
}

NamedPipe

#include <iostream>
#include <Windows.h>

#define PIPE_NAME L"\\\\.\\pipe\\0xCCPipe"

int main()
{
	//创建命名管道
	HANDLE hNamedPipe = CreateNamedPipe(
		PIPE_NAME,
		PIPE_ACCESS_DUPLEX,
		PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
		PIPE_UNLIMITED_INSTANCES,
		4096,
		4096,
		NMPWAIT_USE_DEFAULT_WAIT,
		NULL);
	if (hNamedPipe == INVALID_HANDLE_VALUE)
	{
		std::cout << "CreateNamedPipe ErrorCode -> " << GetLastError() << std::endl;
		return 0;
	}

	//等待客户连接
	std::cout << "Waiting for client Connection" << std::endl;
	BOOL bRet = ConnectNamedPipe(hNamedPipe, NULL);
	if (!bRet)
	{
		std::cout << "ConnectNamedPipe ErrorCode -> " << GetLastError() << std::endl;
		CloseHandle(hNamedPipe);
		return 0;
	}
	std::cout << "Client Connected" << std::endl;

	//发送客户消息
	DWORD dwWrite = 0;
	char szBuffer[] = "Hello 0xCC";
	WriteFile(hNamedPipe, szBuffer, sizeof(szBuffer), &dwWrite, NULL);

	//接受客户消息
	CHAR szBuffer1[0xFF] = { 0 };
	DWORD dwRead = 0;
	ReadFile(hNamedPipe, szBuffer1, sizeof(szBuffer1), &dwRead, NULL);
	std::cout << szBuffer1 << std::endl;

	//清理资源
	CloseHandle(hNamedPipe);

	return 0;
}
#include <iostream>
#include <Windows.h>

#define PIPE_NAME L"\\\\.\\pipe\\0xCCPipe"

int main()
{
	//连接命名管道
	HANDLE hNamedPipe = CreateFile(
		PIPE_NAME,
		GENERIC_READ | GENERIC_WRITE,
		0,
		NULL,
		OPEN_EXISTING,
		NULL,
		NULL
	);
	if (hNamedPipe == INVALID_HANDLE_VALUE)
	{
		std::cout << "CreateNamedPipe ErrorCode -> " << GetLastError() << std::endl;
		return 0;
	}

	//接受服务消息
	CHAR szBuffer[0xFF] = { 0 };
	DWORD dwRead = 0;
	ReadFile(hNamedPipe, szBuffer, sizeof(szBuffer), &dwRead, NULL);
	std::cout << szBuffer << std::endl;

	//发送服务消息
	DWORD dwWrite = 0;
	char szBuffer1[] = "Hello 0xCC";
	WriteFile(hNamedPipe, szBuffer1, sizeof(szBuffer1), &dwWrite, NULL);

	//清理资源
	CloseHandle(hNamedPipe);

	return 0;
}

Mailslot

#include <iostream>
#include <windows.h>

int main() 
{
    //创建邮槽
    HANDLE hMailSlot = CreateMailslot(
        TEXT("\\\\.\\mailslot\\0xCCMailSlot"),
        0,
        MAILSLOT_WAIT_FOREVER,
        NULL
    );
    if (hMailSlot == INVALID_HANDLE_VALUE) return 0;

    //读取邮槽
    while (TRUE)
    {
        DWORD dwRead = 0;
        char szBuffer[0xFF] = { 0 };
        BOOL bRet = ReadFile(hMailSlot, szBuffer, sizeof(szBuffer), &dwRead, NULL);
        if (!bRet) break;
        std::cout << szBuffer << std::endl;
    }

    //清理资源
    CloseHandle(hMailSlot);
    
    return 0;
}
#include <iostream>
#include <Windows.h>

int main()
{
	// 打开邮槽
	HANDLE hMailSlot = CreateFile(
		TEXT("\\\\.\\mailslot\\0xCCMailSlot"),
		GENERIC_READ | GENERIC_WRITE,
		FILE_SHARE_READ,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL
	);
	if (hMailSlot == INVALID_HANDLE_VALUE) return 0;

	// 写入邮槽
	DWORD dwWrite = 0;
	char szBuffer[] = "Hello 0xCC";
	WriteFile(hMailSlot, szBuffer, sizeof(szBuffer), &dwWrite, NULL);

	//清理资源
	CloseHandle(hMailSlot);

	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/772275.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SAPUI5基础知识10 - i18与国际化

1. 背景 i18n 是 “internationalization” 的缩写&#xff0c;其中的 18 是 “internationalization” 这个单词中间的字符数。i18n 是一种让应用程序支持多种语言的方法&#xff0c;也就是我们通常所说的国际化。 在SAPUI5中&#xff0c;i18n主要通过使用资源模型&#xff…

Matplotlib 文本

可以使用 xlabel、ylabel、text向图中添加文本 mu, sigma 100, 15 x mu sigma * np.random.randn(10000)# the histogram of the data n, bins, patches plt.hist(x, 50, densityTrue, facecolorg, alpha0.75)plt.xlabel(Smarts) plt.ylabel(Probability) plt.title(Histo…

【️讲解下Laravel为什么会成为最优雅的PHP框架?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

540. 有序数组中的单一元素(中等)

540. 有序数组中的单一元素 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;540. 有序数组中的单一元素 2.详细题解 方法一&#xff1a;若不限定时间复杂度&#xff0c;则扫描遍历一遍即可找到仅出现一次的数&#xff0c;具体实现见Pyth…

Maven Archetype 自定义项目模板:高效开发的最佳实践

文章目录 前言一、Maven Archetype二、创建自定义 Maven Archetype三、定制 Archetype 模板四、手动创建 Archetype 模板项目五、FAQ5.1 如何删除自定义的模板5.2 是否可以在模板中使用空文件夹 六、小结推荐阅读 前言 在软件开发中&#xff0c;标准化和快速初始化项目结构能够…

什么是JSON ,ajax和json关系

一. JSON 1 JSON概述 JavaScript对象文本表示形式&#xff08;JavaScript Object Notation : js对象简写) json是js对象 json是目前 前后端数据交互的主要格式之一 * java对象表示形式User user new User();user.setUsername("后羿");user.setAge(23);user.setSex…

开发国际短剧系统的策略解析

一、明确项目目标和需求 1、功能需求&#xff1a;确定系统应具备的基本功能&#xff0c;如用户注册、登录、浏览短剧、评论、分享、个性化推荐等。 2、性能需求&#xff1a;确保系统能够承受高并发访问&#xff0c;保证视频流畅播放&#xff0c;减少卡顿和延迟。 3、跨文化传播…

中序遍历的两种实现——二叉树专题复习

递归实现&#xff1a; /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right)…

【算法】(C语言):堆排序

堆&#xff08;二叉树的应用&#xff09;&#xff1a; 完全二叉树。最大堆&#xff1a;每个节点比子树所有节点的数值都大&#xff0c;根节点是最大值。父子索引号关系&#xff08;根节点为0&#xff09;&#xff1a;&#xff08;向上&#xff09;子节点x&#xff0c;父节点(x…

命令行升级ubuntu版本过程中出现的grub问题 解决

1、问题描述 使用命令行升级ubuntu18到20版本后&#xff0c;系统提示重启&#xff0c;使用reboot命令重启后&#xff0c;不显示服务器ip&#xff0c;或是显示但无法ssh远程连接服务器了&#xff0c;使用屏幕连接服务器后发现出现grub问题。 2、问题经过 命令行输入如下升级u…

【虚拟机】虚拟机网络无法访问问题【已解决】

【虚拟机】虚拟机无法上网问题【已解决】 问题探究解决方法法1&#xff1a;查看相关“网络服务”是否处于正常启动状态法2&#xff1a;重启网络法3&#xff1a;重新安装VMWare法4&#xff1a;使用NAT模式&#xff0c;每次打开win7都没连上网的解决办法 问题探究 安装了很多个虚…

Objection 对命令的批量操作

假定现在需要对好多不同的类进行批量hook&#xff0c;逐个hook非常繁琐&#xff0c;那么可以要将这些hook的类放到一个文件里&#xff0c;并且在这些类的前面加上hook命令&#xff0c;内容如下 使用如下命令执行该文件中的命令 objection -g 测试 explore -c d:/hookData/toHoo…

如何从腾讯云迁移到AWS

随着跨境出海潮不断扩大&#xff0c;企业越来越意识到将工作负载迁移到海外节点的必要性&#xff0c;以获取更多功能、灵活性和性能。然而&#xff0c;顺利迁移业务主机并确保业务稳定访问是一项具有挑战性的任务。在此挑战中&#xff0c;借助AWS迁移工具和迁移流程的强大支持&…

docker 安装 禅道

docker pull hub.zentao.net/app/zentao:20.1.1 sudo docker network create --subnet172.172.172.0/24 zentaonet 使用 8087端口号访问 使用禅道mysql 映射到3307 sudo docker run \ --name zentao2 \ -p 8087:80 \ -p 3307:3306 \ --networkzentaonet \ --ip 172.172.172.…

WIN32核心编程 - 进程操作(一) 进程基础 - 创建进程 - 进程句柄

公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 进程基础 进程的定义与概念 进程的组成 创建进程 可执行文件 CreateProces 执行流程 GetStartupInfo 进程终止 进程句柄 创建进程 打开进程 进程提权 内核模拟 回溯对象 自身进…

有哪些好用的eHR人事系统?国内外HR软件选型指南分享

在人力资源管理信息化这个问题上&#xff0c;不同行业的企业对人力资源管理软件的需求侧重点不一样&#xff0c;并且通常企业规模决定了企业需求的强烈程度&#xff0c;以及能花在这个软件采购上的预算。 首先需要对公司需要人力资源软件的目的和基本需求加以明确。你为什么想用…

软件测试必问必背面试题

01 软件测试理论部分 1.1 测试概念 1. 请你分别介绍一下单元测试、集成测试、系统测试、验收测试、回归测试 单元测试&#xff1a;完成最小的软件设计单元&#xff08;模块&#xff09;的验证工作&#xff0c;目标是确保模块被正确的编码集成测试&#xff1a;通过测试发现与…

【Linux】探索网络编程:TCP/UDP协议解析与Socket应用实例

文章目录 前言&#xff1a;1. 预备知识1.1 理解源IP地址和目的IP地址1.2 认识端口号1.3 理解"端口号"和"进程ID"1.4 理解源端口号和目的端口号1.5 认识TCP协议1.6 认识UDP协议1.6 TCP vs UDP 可靠性1.7 网络字节序 2. socket 编程接口2.1 socket 常见API2.…

为了SourceInsight从Linux回到Windows

什么是SourceInsight 现在上网搜索这个软件&#xff0c;大多数说他是一个代码阅读软件&#xff1b;但是在官方的说法里面&#xff0c;这是一款支持多语言的编辑器。大概长这样&#xff1a; 看起来十分老旧是吧&#xff0c;但是他其实他已经是第四代了哈哈哈。其实这个软件是我…

LeetCode 全排列

思路&#xff1a;这是一道暴力搜索问题&#xff0c;我们需要列出答案的所有可能组合。 题目给我们一个数组&#xff0c;我们很容易想到的做法是将数组中的元素进行排列&#xff0c;如何区分已选中和未选中的元素&#xff0c;容易想到的是建立一个标记数组&#xff0c;已经选中的…