Windows核心编程 进程遍历与文件加密

news2024/11/17 0:02:03

目录

进程的遍历

CreateToolhelp32Snapshot

Process32First

Process32Next

文件加密 使用openssl库进行DES加密


进程的遍历

什么是快照:虚拟中的快照: 我们在分析病毒,分析木马的时候,不能在真机分析,在虚拟机中分析,把病毒丢到虚拟机中,分析之前把环境配好,拍照保存;然后进行分析,分析过后,想从头再分析,就把快照一恢复,就可以恢复成刚配好环境的虚拟机;

快照遍历进程的思路:
我们遍历进程也是通过快照的方式,把当前的系统的信息创建一份快照——(创建快照的)那一刻所有进程的信息,到快照里面浏览这些信息;

CreateToolhelp32Snapshot

CreateToolhelp32Snapshot是Windows操作系统中的一个函数,用于创建一个系统快照,其中包含当前运行的进程和模块的信息。

HANDLE CreateToolhelp32Snapshot(
  DWORD dwFlags,
  DWORD th32ProcessID
);

参数解释如下:

  • dwFlags:指定要创建快照的类型。常见的取值包括:

    • TH32CS_SNAPPROCESS:创建包含当前运行进程的快照。
    • TH32CS_SNAPTHREAD:创建包含当前运行线程的快照。
    • TH32CS_SNAPMODULE:创建包含当前加载模块的快照。
    • TH32CS_SNAPMODULE32:创建包含当前加载模块的快照,返回32位模块结构。
    • TH32CS_SNAPALL:创建包含当前运行进程、线程和模块的快照。
  • th32ProcessID:指定要创建快照的进程ID,通常为0表示当前进程。

CreateToolhelp32Snapshot函数会返回一个句柄,用于表示创建的系统快照。这个句柄可以用于后续的遍历操作,通过调用其他函数(如Process32First、Process32Next、Module32First等)来获取系统快照中的进程和模块信息。

这个函数通常用于获取系统中运行的进程和模块的信息,例如获取进程列表、查找特定进程、遍历模块信息等。通过遍历系统快照,可以获得进程、线程和模块的详细信息,进而进行相应的操作和分析。

Process32First

Process32First是Windows操作系统中的一个函数,用于在通过CreateToolhelp32Snapshot函数创建的进程快照中获取第一个进程的信息。

函数原型如下:

BOOL Process32First(
  HANDLE           hSnapshot,
  LPPROCESSENTRY32 lppe
);

参数解释如下:

  • hSnapshot:通过CreateToolhelp32Snapshot函数创建的进程快照的句柄。

  • lppe:指向PROCESSENTRY32结构的指针,用于接收第一个进程的信息。

Process32First函数会将第一个进程的信息填充到lppe指向的PROCESSENTRY32结构中,并返回一个布尔值来指示操作是否成功。如果函数返回TRUE,则表示成功获取第一个进程的信息,如果返回FALSE,则表示获取失败。

PROCESSENTRY32结构定义如下:

typedef struct tagPROCESSENTRY32 {
  DWORD     dwSize;
  DWORD     cntUsage;
  DWORD     th32ProcessID;
  ULONG_PTR th32DefaultHeapID;
  DWORD     th32ModuleID;
  DWORD     cntThreads;
  DWORD     th32ParentProcessID;
  LONG      pcPriClassBase;
  DWORD     dwFlags;
  TCHAR     szExeFile[MAX_PATH];
} PROCESSENTRY32;

这个结构包含了进程的各种信息,包括进程ID、父进程ID、线程数量、进程优先级等。

Process32First函数通常与Process32Next函数一起使用,用于遍历进程快照中的所有进程。首先使用Process32First获取第一个进程的信息,然后使用Process32Next依次获取后续进程的信息,直到遍历完整个进程列表。

Process32Next

Process32Next是Windows操作系统中的一个函数,用于在通过CreateToolhelp32Snapshot函数创建的进程快照中获取下一个进程的信息。

函数原型如下:

BOOL Process32Next(
  HANDLE           hSnapshot,
  LPPROCESSENTRY32 lppe
);

参数解释如下:

  • hSnapshot:通过CreateToolhelp32Snapshot函数创建的进程快照的句柄。

  • lppe:指向PROCESSENTRY32结构的指针,用于接收下一个进程的信息。

Process32Next函数会将下一个进程的信息填充到lppe指向的PROCESSENTRY32结构中,并返回一个布尔值来指示操作是否成功。如果函数返回TRUE,则表示成功获取下一个进程的信息,如果返回FALSE,则表示获取失败。

需要注意的是,在使用Process32Next函数之前,必须先调用一次Process32First函数来获取第一个进程的信息。然后,通过反复调用Process32Next函数来遍历进程快照中的所有进程。

Process32First和Process32Next函数结合使用,可以遍历进程快照中的所有进程,并获取它们的详细信息,比如进程ID、父进程ID、线程数量等。这对于进程管理、进程监控和诊断等场景非常有用。

测试代码

#include <tlhelp32.h>

void CProcessDlg::OnBnClickedButton6()
{
	BOOL           bRet      = FALSE; 
    PROCESSENTRY32 pe32      = {0}; 

	//创建快照
	HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	
	//从快照中获取进程信息
	pe32.dwSize = sizeof(PROCESSENTRY32);

	if (Process32First(hProcessSnap, &pe32))
	{
		do
		{
			CString strFmt;
			strFmt.Format("[proc] PID: %d [path:%s", pe32.th32ProcessID, pe32.szExeFile);
			OutputDebugString(strFmt);
		} while (Process32Next(hProcessSnap, &pe32));
	}
	CloseHandle(hProcessSnap);
}

修改一下

// Travel.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//遍历当前进程信息
#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
int main()
{
    HANDLE hProcessSnap = NULL; 
    //创建,获取进程的信息
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    if (hProcessSnap == INVALID_HANDLE_VALUE)
        return (FALSE);
    //结构体
    PROCESSENTRY32 pe32 = { 0 }; 
    //填写结构体中的第一个成员
    pe32.dwSize = sizeof(PROCESSENTRY32); 
    if (Process32First(hProcessSnap, &pe32))
    {
        //First成功之后,进入循环 
        //循环的时候调一下next,通过xxx拿一下进程的信息
        do
        {
            printf("pid:%d\t name:%s\r\n", pe32.th32ProcessID, pe32.szExeFile);
        } while (Process32Next(hProcessSnap, &pe32)); 
    } 
    CloseHandle(hProcessSnap); 
}

注意:

  • 和资源管理器中进程对比是一样的;
  • 和Process Hacker 中进程对比少,我们的进程是三环下的,Process Hacker是可以拿到内核进程的;

文件加密 使用openssl库进行DES加密

下载地址:Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions

创建一个多字节控制台项目

include和 lib文件放在项目目录中。

附加包含目录

附加包含库目录

测试代码

// Encripte.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include "include/openssl/des.h"
#pragma comment(lib,"libcrypto.lib")
#pragma comment(lib,"Crypt32.lib")
#pragma comment(lib,"ws2_32.lib")
//#pragma warning(disable:4996)
int main()
{
    // 使用DES_cblock定义一个密钥变量key,并使用DES_random_key生成一个随机密钥。
    DES_cblock key;
    DES_random_key(&key);
    
    // 使用DES_key_schedule定义一个密钥调度变量schedule,并使用DES_set_key_checked函数将生成的密钥设置到调度中。
    DES_key_schedule schedule;
    DES_set_key_checked(&key, &schedule);
    
    // 定义输入明文input,并将其加密后存放到output中,使用DES_ecb_encrypt函数进行加密操作。
    const_DES_cblock input = "hello";
    DES_cblock output;
    DES_ecb_encrypt(&input, &output, &schedule,DES_ENCRYPT);
	printf("Encrypted!\n");
    
    // 打印加密后的密文。
	printf("ciphertext: ");
	int i;
	for (i = 0; i < sizeof(input); i++)
		printf("%02x", output[i]);
	printf("\n");

	// 使用DES_ecb_encrypt函数将密文output解密,解密后的明文存放在input中。
	DES_ecb_encrypt(&output, &input, &schedule, DES_DECRYPT);
	printf("Decrypted!\n");
	printf("cleartext:%s\n", input);


}

加密文件 解密文件

//
#include <iostream>
#include <windows.h>
#include "include/openssl/des.h"
#pragma comment(lib,"libcrypto.lib")
#pragma comment(lib,"Crypt32.lib")
#pragma comment(lib,"ws2_32.lib")
//#pragma warning(disable:4996)

//解密
#define ENCRIPT

#ifdef ENCRIPT
#define DES_FUNC DES_ENCRYPT
#else
#define DES_FUNC DES_DECRYPT
#endif
using namespace std;
int main()
{
	// 定义一个密钥key,并使用DES_set_key_checked函数将密钥设置到调度中。
	DES_cblock key =
	{ '\x8a','\xf4', '\x19', '\x04', '\x51', '\x13', '\x67', '\x15' };
	/*DES_random_key(&key);*/

	DES_key_schedule schedule;
	DES_set_key_checked(&key, &schedule);

	// 创建源文件和目标文件的句柄,分别用于读取源文件和写入目标文件。
	const char* szSrcFile = "E:\\CR41\\第2阶段\\Windows\\08-管道\\OpenSSL-Win32_3 - 副本.zip";
	const char* szDstFile = "E:\\CR41\\第2阶段\\Windows\\08-管道\\OpenSSL-Win32_3 - 副本00.zip";

	// 创建源文件和目标文件的映射,用于分块读取和写入数据。
	HANDLE hSrcFile = CreateFile
	(
		szSrcFile,
		GENERIC_READ,
		0, NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL
	);
	if (hSrcFile == INVALID_HANDLE_VALUE)
	{
		cout << "文件打开失败:" << hSrcFile << endl;
		return 0;
	}

	HANDLE hDstFile = CreateFile
	(
		szDstFile,
		GENERIC_WRITE | GENERIC_READ,
		0, NULL,
		CREATE_ALWAYS,
		FILE_ATTRIBUTE_NORMAL,
		NULL
	);
	if (hDstFile == INVALID_HANDLE_VALUE)
	{
		cout << "文件打开失败:" << hDstFile << endl;
		CloseHandle(hDstFile);
		return 0;
	}


	HANDLE hSrcMapFile = CreateFileMapping
	(
		hSrcFile,
		NULL,
		PAGE_WRITECOPY,
		0, 0,
		NULL
	);
	if (hSrcMapFile == NULL)
	{
		cout << "文件映射失败:" << szSrcFile << endl;
		CloseHandle(hSrcMapFile);
		CloseHandle(hSrcFile);
		CloseHandle(hDstFile);
		return 0;
	}

	DWORD dwFileSize = GetFileSize(hSrcFile, NULL);

	HANDLE hDstMapFile = CreateFileMapping
	(
		hDstFile,
		NULL,
		PAGE_READWRITE,
		0, dwFileSize,
		NULL
	);
	if (hDstMapFile == NULL)
	{
		cout << "文件映射失败:" << hDstFile << endl;

		CloseHandle(hDstMapFile);
		CloseHandle(hSrcFile);
		CloseHandle(hDstFile);
		return 0;
	}

	//循环映射
	DWORD dwCount = dwFileSize / 0x10000;

	for (DWORD dwIdx = 0; dwIdx < dwCount; ++dwIdx)
	{
		LPBYTE pSrcData = (LPBYTE)MapViewOfFile
		(
			hSrcMapFile,
			FILE_MAP_READ,
			0, 0x10000 * dwIdx,
			0x10000
		);
		LPBYTE pDstData = (LPBYTE)MapViewOfFile
		(
			hDstMapFile,
			FILE_MAP_WRITE,
			0, 0x10000 * dwIdx,
			0x10000
		);

		//循环加密
		for (
			DWORD dwOfSet = 0;
			dwOfSet < 0x10000;
			dwOfSet += sizeof(const_DES_cblock)
			)
		{

			DES_ecb_encrypt(
				(const_DES_cblock*)(pSrcData + dwOfSet),
				(DES_cblock*)(pDstData + dwOfSet),
				&schedule, DES_FUNC
			);

		}
		//取消映射
		UnmapViewOfFile(pDstData);
		UnmapViewOfFile(pSrcData);

	}

	//判断有没有不够0x10000的数据

	if (dwFileSize % 0x10000 > 0)
	{
		DWORD dwAvail = dwFileSize % 0x10000;
		LPBYTE pSrcData = (LPBYTE)MapViewOfFile
		(
			hSrcMapFile,
			FILE_MAP_READ,
			0, (dwFileSize / 0x10000) * 0x10000,
			dwAvail
		);
		LPBYTE pDstData = (LPBYTE)MapViewOfFile
		(
			hDstMapFile,
			FILE_MAP_WRITE,
			0, (dwFileSize / 0x10000) * 0x10000,
			dwAvail
		);
		// 加密

		DWORD dwCount = dwAvail % sizeof(const_DES_cblock) == 0
			? dwAvail / sizeof(const_DES_cblock)
			: dwAvail / sizeof(const_DES_cblock) + 1;
		for (size_t i = 0; i < dwCount; i++)
		{
			//不足以8个字节的不加密
			//最后一次 不加密了
			if ((dwAvail % sizeof(const_DES_cblock) != 0)
				&& (i == dwCount - 1))
			{
				memcpy(pDstData + i * sizeof(const_DES_cblock),
					pSrcData + i * sizeof(const_DES_cblock),
					dwAvail % sizeof(const_DES_cblock));
				break;
			}
			DES_ecb_encrypt
			(
				(const_DES_cblock*)(pSrcData + i * sizeof(const_DES_cblock)),
				(DES_cblock*)(pDstData + i * sizeof(const_DES_cblock)),
				&schedule,
				DES_FUNC
			);
		}
	}

	cout << "结束" << endl;



}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【多线程】-- 02 线程创建之实现Runnable初识多线程并发问题

多线程 2 线程创建 2.2 实现Runnable接口 【学习提示】查看JDK帮助文档 定义MyRunnable类实现Runnable接口实现run()方法&#xff0c;编写线程执行体创建线程对象&#xff0c;调用start()方法启动线程 package com.duo.demo01;//创建线程方式二&#xff1a;实现Runnable接…

分布式事务,一致性理论, 两阶段提交(2PC), 三阶段提交(3PC),Seata分布式事务方案

文章目录 分布式事务&#xff1a;1、一致性理论2、两阶段提交&#xff08;2PC&#xff09;3、三阶段提交&#xff08;3PC&#xff09;4、Seata分布式事务方案 上一篇降到了 分布式锁&#xff0c;先来和大家聊一聊分布式事务&#xff0c; 分布式锁的链接如下&#xff1a; http…

位图的详细讲解

位运算操作符&#xff1a;或&#xff0c;与&#xff0c;异或&#xff0c;按位取反。 操作符 |两个中有一个是一则为一&两个都是一则为一^相同为零&#xff0c;不同为一~零变成一&#xff0c;一变成零 什么是位运算符: 位运算是直接对整型数据的二进制进行运算。 位图概念…

物流公司打印用什么软件,佳易王物流运单打印管理系统软件下载

物流公司打印用什么软件&#xff0c;佳易王物流运单打印管理系统软件下载 软件特色&#xff1a; 1、功能实用&#xff0c;操作简单&#xff0c;不会电脑也会操作&#xff0c;软件免安装&#xff0c;已内置数据库。 2、物流开单打印&#xff0c;可以打印两联单或三联单&#x…

X-RAY POC编写

POC(Proof of Concept) - 利用证明 POC&#xff0c;Proof of Concept&#xff0c;意思是 利用证明。这个短语会在漏洞报告中使用&#xff0c;漏洞报告中的POC则是一段说明或者一个攻击的漏洞介绍&#xff0c;使得读者能够确认这个漏洞是真实存在的。 EXP(Exploit) - 漏洞利用…

GDPU 数据结构 天码行空11

文章目录 数据结构实验十一 图的创建与存储一、实验目的二、实验内容三、【实验源代码】&#x1f37b; CPP版&#x1f37b; c 语言版&#x1f37b; java版 四、【实验结果】五、【实验总结】 数据结构实验十一 图的创建与存储 一、实验目的 1、 理解图的存储结构与基本操作&a…

【STM32】新建工程

学习来源&#xff1a;[2-2] 新建工程_哔哩哔哩_bilibili 目前STM32的开发主要有基于寄存器的开发方式、基于标准库也就是库函数的方式和基于HAL库的方式。本学习是基于库函数的方式。&#xff08;各种资料去百度云下载&#xff09; 1 建立工程文件夹 Keil中新建工程&#xf…

高性能Mysql第三版学习(一)

学习目标&#xff1a; 高性能Mysql第3版 学习内容&#xff1a; MySQL架构与历史Mysql基座测试服务器性能Schema与数据类型优化创建高性能的索引查询性能优化Mysql高级特性Explain 学习时间&#xff1a; 周一至周五晚上 9点—晚上10点周六晚上9点-10点周日晚上9 点-10点 学习…

公众号留言功能还有可能开放吗?

为什么公众号没有留言功能&#xff1f;2018年2月12日&#xff0c;TX新规出台&#xff1a;根据相关规定和平台规则要求&#xff0c;我们暂时调整留言功能开放规则&#xff0c;后续新注册帐号无留言功能。这就意味着2018年2月12日号之后注册的公众号不论个人主体还是组织主体&…

初出茅庐的小李博客之C语言必备知识共用体

C语言必备知识共用体 共用体是一种构造数据类型&#xff0c;有时候也称之为联合体。 它的用途&#xff1a; 使几个不同类型的变量共占一段内存。 共用体举例 union 共用体名 { 类型标识符 成员名;类型标识符 成员名; };union data //共用体名字是data{ int i; …

面试题:什么是自旋锁?自旋的好处和后果是什么呢?

文章目录 什么是自旋自旋和非自旋的获取锁的流程 自旋锁的好处AtomicLong 的实现实现一个可重入的自旋锁示例自旋的缺点适用场景 什么是自旋 “自旋”可以理解为“自我旋转”&#xff0c;这里的“旋转”指“循环”&#xff0c;比如 while 循环或者 for 循环。“自旋”就是自己…

初学剪辑者找视频素材就上这6个网站

视频剪辑必备的6个素材网站&#xff0c;高清无水印&#xff0c;还可以免费下载&#xff0c;无版权限制&#xff0c;赶紧收藏起来&#xff01; 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库网素材非常丰富&#xff0c;网站主要以设计类素材为主&#…

宝塔 Linux 面板安装一个高大上的论坛程序 —— Flarum

这个是很早搭建的版本,基于宝塔面板,比较复杂,如果想要简单的搭建方法,可以参看咕咕新写的这篇: 【好玩的 Docker 项目】10 分钟搭建一个高大上的论坛程序 购买腾讯云轻量应用服务器 待补充 登录服务器 待补充 BBR 加速脚本 BBR 加速脚本: BASH cd /usr/src &…

XML映射文件

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"org.mybatis.example.BlogMapper&q…

Chatbot开发三剑客:LLAMA、LangChain和Python

聊天机器人&#xff08;Chatbot&#xff09;开发是一项充满挑战的复杂任务&#xff0c;需要综合运用多种技术和工具。在这一领域中&#xff0c;LLAMA、LangChain和Python的联合形成了一个强大的组合&#xff0c;为Chatbot的设计和实现提供了卓越支持。 首先&#xff0c;LLAMA是…

蓝牙运动耳机哪个好?蓝牙运动耳机排行榜前十名

​在运动中&#xff0c;音乐可以激发你的热情和动力&#xff0c;而一款好的运动耳机则可以让你更好地享受音乐。然而&#xff0c;市面上的运动耳机品牌和型号众多&#xff0c;质量参差不齐。所以&#xff0c;今天精选了5款市面上比较优秀的运动耳机给大家参考&#xff0c;是你运…

【开源】基于JAVA的车险自助理赔系统

项目编号&#xff1a; S 018 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S018&#xff0c;文末获取源码。} 项目编号&#xff1a;S018&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 车…

Vatee万腾的科技冒险:Vatee独特探索力量的数字化征程

在数字化时代的激流中&#xff0c;Vatee万腾以其独特的科技冒险精神&#xff0c;引领着一场前所未有的数字化征程。这不仅仅是一次冒险&#xff0c;更是对未知的深度探索&#xff0c;将科技的力量推向新的高度。 Vatee万腾在科技领域敢于挑战传统&#xff0c;积极探索未知的可能…

ThreeJs实现简单的动画

上一节实现可用鼠标控制相机的方式实现动态效果&#xff0c;但很多时候是需要场景自己产恒动态效果&#xff0c;而不是通过鼠标拖动&#xff0c;此时引入一个requestAnimationFrame方法&#xff0c;它实际上是通过定时任务的方式&#xff0c;每隔一点时间改变场景中内容后重新渲…

详解:什么是“智能合同管理”

未来已来&#xff0c;行业数字化进行的如火如荼&#xff0c;并逐步驶入深水区。合同是企业开展经营活动的重要文件&#xff0c;也是风险管控的核心地带&#xff0c;做好合同管理对企业运营效率的提升至关重要。近年来&#xff0c;合同管理已经跟随企业数字化的浪潮进入转型时期…