Windows黑客编程之功能技术(上)

描述

  • 利用进程快照CreateToolhelp32Snapshot,进行进程、线程、进程模块的遍历
  • 利用FindFirstFileFindNextFile,进行文件目录的遍历

进程快照的遍历

遍历进程

BOOL EnumProcess()
{
	PROCESSENTRY32 pe32 = { 0 };
	pe32.dwSize = sizeof(PROCESSENTRY32);
	// 获取全部进程快照
	HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (INVALID_HANDLE_VALUE == hProcessSnap)
	{
		ShowError("CreateToolhelp32Snapshot");
		return FALSE;
	}

	// 获取快照中第一条信息
	BOOL bRet = ::Process32First(hProcessSnap, &pe32);
	while (bRet)
	{
		// 显示 Process ID
		printf("[%d]\t", pe32.th32ProcessID);

		// 显示 进程名称
		printf("[%s]\n", pe32.szExeFile);

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

	// 关闭句柄
	::CloseHandle(hProcessSnap);

	return TRUE;
}

遍历线程

OOL EnumThread()
{
	THREADENTRY32 te32 = { 0 };
	te32.dwSize = sizeof(THREADENTRY32);
	// 获取全部线程快照
	HANDLE hThreadSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
	if (INVALID_HANDLE_VALUE == hThreadSnap)
	{
		ShowError("CreateToolhelp32Snapshot");
		return FALSE;
	}

	// 获取快照中第一条信息
	BOOL bRet = ::Thread32First(hThreadSnap, &te32); 
	while (bRet)
	{
		// 显示 Owner Process ID
		printf("[%d]\t", te32.th32OwnerProcessID);

		// 显示 Thread ID
		printf("[%d]\n", te32.th32ThreadID);

		// 获取快照中下一条信息
		bRet = ::Thread32Next(hThreadSnap, &te32);
	}

	// 关闭句柄
	::CloseHandle(hThreadSnap);

	return TRUE;
}

遍历进程模块

BOOL EnumProcessModule(DWORD dwProcessId)
{
	MODULEENTRY32 me32 = { 0 };
	me32.dwSize = sizeof(MODULEENTRY32);
	// 获取指定进程全部模块的快照
	HANDLE hModuleSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId);
	if (INVALID_HANDLE_VALUE == hModuleSnap)
	{
		ShowError("CreateToolhelp32Snapshot");
		return FALSE;
	}

	// 获取快照中第一条信息
	BOOL bRet = ::Module32First(hModuleSnap, &me32);
	while (bRet)
	{
		// 显示 Process ID
		printf("[%d]\t", me32.th32ProcessID);

		// 显示 模块加载基址
		printf("[0x%p]\t", me32.modBaseAddr);

		// 显示 模块名称
		printf("[%s]\n", me32.szModule);

		// 获取快照中下一条信息
		bRet = ::Module32Next(hModuleSnap, &me32);
	}

	// 关闭句柄
	::CloseHandle(hModuleSnap);

	return TRUE;
}

文件遍历

  • 利用递归来遍历文件目录,注意要过滤当前目录和上层目录
#include "stdafx.h"
#include "FileSearch.h"


void SearchFile(char *pszDirectory)
{
	// 搜索指定类型文件
	DWORD dwBufferSize = 2048;
	char *pszFileName = NULL;
	char *pTempSrc = NULL;
	WIN32_FIND_DATA FileData = {0};
	BOOL bRet = FALSE;
	
	// 申请动态内存
	pszFileName = new char[dwBufferSize];
	pTempSrc = new char[dwBufferSize];
	
	// 构造搜索文件类型字符串, *.*表示搜索所有文件类型
	::wsprintf(pszFileName, "%s\\*.*", pszDirectory);

	// 搜索第一个文件
	HANDLE hFile = ::FindFirstFile(pszFileName, &FileData);
	if (INVALID_HANDLE_VALUE != hFile)
	{
		do
		{
			// 要过滤掉 当前目录"." 和 上一层目录"..", 否则会不断进入死循环遍历
			if ('.' == FileData.cFileName[0])
			{
				continue;  
			}
			// 拼接文件路径	
			::wsprintf(pTempSrc, "%s\\%s", pszDirectory, FileData.cFileName);
			// 判断是否是目录还是文件
			if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)        
			{
				// 目录, 则继续往下递归遍历文件
				SearchFile(pTempSrc);
			}
			else                                                            
			{
				// 文件
				printf("%s\n", pTempSrc);
			}

		    // 搜索下一个文件
		} while (::FindNextFile(hFile, &FileData));
	}

	// 关闭文件句柄
	::FindClose(hFile);
	// 释放内存
	delete []pTempSrc;
	pTempSrc = NULL;
	delete []pszFileName;
	pszFileName = NULL;
}
posted @ 2023-02-26 08:04  z5onk0  阅读(320)  评论(0编辑  收藏  举报