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

目录

进程的遍历

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.mfbz.cn/a/187759.html

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

相关文章

NX二次开发UF_CURVE_ask_curve_turn_angle 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_curve_turn_angle Defined in: uf_curve.h int UF_CURVE_ask_curve_turn_angle(tag_t curve, double orientation [ 3 ] , double * angle ) overview 概述 Returns …

希尔伯特变换-matlab仿真

希尔伯特变换&#xff08;hilbert transform&#xff09;简介 在信号处理中我们常见的有傅里叶变换&#xff0c;用来分析频域信息&#xff0c;还有拉普拉斯变换和z变换&#xff0c;用于系统分析系统响应。短时傅里叶分析和小波分析用于时频分析。希尔伯特变换似乎听到的比较少…

unigui同页面内重定向跳转,企业微信内部应用开发获取用户code例子

procedure TMainForm.UniFormCreate(Sender: TObject); varurl: string;code: string; begin //如果没有code值&#xff0c;将进行重定向if UniApplication.Parameters.Values[code] thenbeginurl :https://open.weixin.qq.com/connect/oauth2/authorize?appid你们的企业ID&…

基于springBoot+Vue的停车管理系统

开发环境 IDEA JDK1.8 MySQL8.0Node 系统简介 本项目为前后端分离项目&#xff0c;前端使用vue&#xff0c;后端使用SpringBoot开发&#xff0c;主要的功能有用户管理&#xff0c;停车场管理&#xff0c;充值收费&#xff0c;用户可以注册登录系统&#xff0c;自主充值和预…

中间件渗透测试-Server2131(解析+环境)

B-10&#xff1a;中间件渗透测试 需要环境的加qq 任务环境说明&#xff1a; 服务器场景&#xff1a;Server2131&#xff08;关闭链接&#xff09; 服务器场景操作系统&#xff1a;Linux Flag值格式&#xff1a;Flag&#xff5b;Xxxx123&#xff5d;&#xff0c;括…

中职网安-Linux操作系统渗透测-Server2130(环境加qq)

B-9:Linux操作系统渗透测 任务环境说明:  服务器场景:Server2130  服务器场景操作系统:Linux(关闭链接) 1.通过本地PC中渗透测试平台Kali对靶机场景进行系统服务及版本扫描渗透测试,并将该操作显示结果中Apache服务对应的版本信息字符串作为Flag值提交; 2.…

UML建模图文详解教程08——部署图

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl本文参考资料&#xff1a;《UML面向对象分析、建模与设计&#xff08;第2版&#xff09;》吕云翔&#xff0c;赵天宇 著 部署图概述 部署图(deployment diagram)也被译作配置…

详细解答T-SNE程序中from sklearn.manifold import TSNE的数据设置,包括输入数据,绘制颜色的参数设置,代码复制可用!!

文章目录 前言——TSNE是t-Distributed Stochastic Neighbor Embedding的缩写1、可运行的T-SNE程序2. 实验结果3、针对上述程序我们详细分析T-SNE的使用方法3.1 加载数据3.2 TSNE降维3.3 绘制点3.4 关于颜色设置&#xff0c;颜色使用的标签数据的说明cy 总结 前言——TSNE是t-D…

针对String、StringBuffer、Stringbuilder区别及使用场景

可变性&#xff08;Mutability&#xff09;&#xff1a; String&#xff1a; 字符串是不可变的。一旦创建了一个字符串对象&#xff0c;它的值就不能被修改。任何对字符串的操作实际上都是创建了一个新的字符串对象。 StringBuilder&#xff1a; 字符串生成器&#xff0c;是可…

stm32实现0.96oled图片显示,菜单功能

stm32实现0.96oled图片显示&#xff0c;菜单功能 功能展示简介代码介绍oled.coled.holedfont.h&#xff08;字库文件&#xff09;main函数 代码思路讲解 本期内容&#xff0c;我们将学习0.96寸oled的进阶使用&#xff0c;展示图片&#xff0c;实现菜单切换等功能&#xff0c;关…

【送书福利-第二十八期】《从概念到现实:ChatGPT和Midjourney的设计之旅》

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号&#xff1a;程序员洲洲。 &#x1f388; 本文专栏&#xff1a;本文…

Flutter开发警告Constructors in ‘@immutable‘ classes should be declared as ‘const‘

文章目录 警告信息报错代码警告原因修改后的代码 警告信息 Flutter开发遇到如下警告 Constructors in ‘immutable’ classes should be declared as ‘const’. 报错代码 class TaskWidget extends StatefulWidget {final String title;final bool isChecked;final int ord…

MFIN 6201 Practice Question

MFIN 6201 Practice Question WeChat: ye1-6688

三菱PLC编码器转速测量功能块(梯形图和ST代码)

编码器转速测量功能块算法公式详细讲解请参考下面文章链接: SMART PLC编码器转速测量功能块(高速计数器配置+梯形图)-CSDN博客文章浏览阅读427次。里工业控制张力控制无处不在,也衍生出很多张力控制专用控制器,磁粉制动器等,本篇博客主要讨论PLC的张力控制相关应用和算法,…

【Netty专题】Netty调优及网络编程中一些问题补充(面向面试学习)

目录 前言阅读对象阅读导航笔记正文一、如何选择序列化框架1.1 基本介绍1.2 在网络编程中如何选择序列化框架1.3 常用Java序列化框架比较 二、Netty调优2.1 CONNECT_TIMEOUT_MILLIS&#xff1a;客户端连接时间2.2 SO_BACKLOG&#xff1a;最大同时连接数2.3 TCP_NODELAY&#xf…

【JavaEE初阶】Thread 类及常见方法、线程的状态

目录 1、Thread 类及常见方法 1.1 Thread 的常见构造方法 1.2 Thread 的几个常见属性 1.3 启动⼀个线程 - start() 1.4 中断⼀个线程 1.5 等待⼀个线程 - join() 1.6 获取当前线程引用 1.7 休眠当前线程 2、线程的状态 2.1 观察线程的所有状态 2.2 线程状态和状…

Jmeter接口自动化测试操作流程

在企业使用jmeter开展实际的接口自动化测试工具&#xff0c;建议按如下操作流程&#xff0c; 可以使整个接口测试过程更规范&#xff0c;更有效。 接口自动化的流程&#xff1a; 1、获取到接口文档&#xff1a;swagger、word、excel ... 2、熟悉接口文档然后设计测试用例&am…

RK3568驱动指南|第八篇 设备树插件-第73章 设备树插件使用实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

Mysql 解决Invalid default value for ‘created_at‘

在mysql版本 8.0 和 5.* 之间数据互导的过程中&#xff0c;老是会出现各种错误&#xff0c;比如 这个created_at 一定要有一个默认值&#xff0c; 但是我加了 default null 还是会报错&#xff0c;于是对照了其他的DDL 发现&#xff0c;需要再加 null default null 才行&#…

php通过curl方式发送接受xml数据

目录 1、php通过curl方式发送xml数据 2、php通过file_get_contents接受curl方式发送xml数据 1、php通过curl方式发送xml数据 <?php function sendXmlData($url, $xmlData) {$ch curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFE…