首页 > 系统相关 >R3枚举进程模块的方法

R3枚举进程模块的方法

时间:2023-03-24 12:12:13浏览次数:37  
标签:lpstrModuleFileName R3 Current Ldr 枚举 模块 sizeof NULL moduleEntry

R3层枚举进程模块的方法有以下三种:
1.ToolHelp库
2.PsApi库
3.遍历Peb中的Ldr链表

1.ToolHelp库:

点击查看代码
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 0);
	if (hSnapshot == INVALID_HANDLE_VALUE)
	{
		_tprintf(_T("CreateToolhelp32Snapshot Error\r\n"));
		return;
	}
	MODULEENTRY32 moduleEntry;
	moduleEntry.dwSize = sizeof(moduleEntry);
	TCHAR lpstrModuleFileName[260];
	
	int count = 0;
	if (Module32First(hSnapshot, &moduleEntry))
	{
		while (Module32Next(hSnapshot, &moduleEntry))
		{
			count++;
			GetModuleFileName(moduleEntry.hModule, lpstrModuleFileName, sizeof(lpstrModuleFileName));
		
			_tprintf(_T("第%d个模块  名称为:%s 基地址:0x%08x 大小:%d\r\n"), count, lpstrModuleFileName, moduleEntry.modBaseAddr, moduleEntry.modBaseSize);
		}
	}

2.PsApi库:

点击查看代码
HMODULE hmProcess[1000];
	DWORD dwNeeded = 0;
	TCHAR lpstrModuleFileName[260];
	EnumProcessModules(GetCurrentProcess(), hmProcess, sizeof(hmProcess), &dwNeeded);
	DWORD dwModuleCount = dwNeeded / sizeof(DWORD);
	MODULEINFO moduleInfo;
	for (int i = 0; i < dwModuleCount; i++)
	{
		
		GetModuleFileName(hmProcess[i], lpstrModuleFileName, sizeof(lpstrModuleFileName));
		GetModuleInformation(GetCurrentProcess(), hmProcess[i], &moduleInfo, sizeof(moduleInfo));
		_tprintf(_T("第%d个模块  名称为:%s  基地址:0x % 08x 大小 : % d 入口点 : 0x % 08x\r\n"), (i+1), lpstrModuleFileName, moduleInfo.lpBaseOfDll, moduleInfo.SizeOfImage, moduleInfo.EntryPoint);
	}

3.遍历Ldr链表:

点击查看代码
#include<iostream>
#include<Windows.h>
#include <Winternl.h> 
#include<tchar.h>


typedef NTSTATUS(NTAPI* LPFN_NTQUERYINFORMATIONPROCESS)(IN HANDLE ProcessHandle,
	IN PROCESSINFOCLASS ProcessInformationClass,
	OUT PVOID ProcessInformation,
	IN ULONG ProcessInformationLength,
	OUT PULONG ReturnLength OPTIONAL);

void _tmain()
{
	HMODULE hModule = NULL;
	LPFN_NTQUERYINFORMATIONPROCESS _NtQueryInformationProcess = NULL;
	_PROCESS_BASIC_INFORMATION ProcessbBasicInfo = { 0 };
	ULONG NeededLen = 0;
	NTSTATUS Status = FALSE;
	PPEB_LDR_DATA Ldr = NULL;
	PLIST_ENTRY InMemoryOrderModuleList = NULL;
	PLIST_ENTRY Current = NULL;
	PLDR_DATA_TABLE_ENTRY Entry = NULL;
	_tsetlocale(LC_ALL, _T("Chinese-simplified"));//使当前程序支持中文

	//使用NtQueryInformationProcess获取InMemoryOrderLinks地址
	hModule = GetModuleHandle(_T("ntdll.dll"));
	if (hModule == NULL)
	{
		printf("GetModuleHandle fail.\r\n");
		return;
	}

	_NtQueryInformationProcess = (LPFN_NTQUERYINFORMATIONPROCESS)GetProcAddress(hModule, "NtQueryInformationProcess");
	if (_NtQueryInformationProcess == NULL)
	{
		printf("GetProcAddress fail.\r\n");
		return;
	}


	Status = _NtQueryInformationProcess(GetCurrentProcess(), ProcessBasicInformation, &ProcessbBasicInfo, sizeof(ProcessbBasicInfo), &NeededLen);
	if (!NT_SUCCESS(Status))
	{
		_tprintf(_T("NtQueryInformationProcess fail.\r\n"));
		return;
	}

	Ldr = ProcessbBasicInfo.PebBaseAddress->Ldr;
	Current = Ldr->InMemoryOrderModuleList.Flink;
	do
	{
		Entry = (PLDR_DATA_TABLE_ENTRY)Current;
		_tprintf(_T("DllName:%s\t DllBase:0x:%x\r\n"), Entry->FullDllName.Buffer,Entry->DllBase);
		Current = Current->Flink;
	} while (Current!=NULL&&Current->Flink !=&Ldr->InMemoryOrderModuleList);


	_tprintf(_T("input anykey to exit\r\n"));
	_gettchar();


}

标签:lpstrModuleFileName,R3,Current,Ldr,枚举,模块,sizeof,NULL,moduleEntry
From: https://www.cnblogs.com/hanpto/p/17251102.html

相关文章

  • SAP成本控制(CO)模块常用的事务代码清单,大家可以将其放在收藏夹中,方便使用!
    成本中心KA01创建成本要素KA02修改成本要素KA03显示成本要素KA04删除成本要素KA23成本要素清单KAH1创建成本要素组KAH2修改成本要素组KAH3显示成本要素组......
  • UD FMC-702 双通道1.25G ADC+12.6G DAC模块
    UDFMC-702双通道接收+双通道发射FMC模块满足VITA57.1单宽、导冷规范。模块ADC支持国产GM4680、B9680或进口AD9680采集芯片,DAC支持AD9171/AD9172/AD9173/AD9174/AD9175......
  • 工程:上课时间调整模块修改
    上课时间调整模块修改1(2023-02-27)序号修改任务完成情况1分页功能(当某页只剩一行数据时,点击删除时应该把总页数减一)√2按照调整前的上课时间排序(默认降序......
  • logging模块
    #coding=utf-8importloggingfromloggingimporthandlersimporttimedefmylogger():#创建一个记录器,命名为testlogger=logging.getLogger('test')......
  • [FastAPI-07]路径参数-枚举
    fromenumimportEnumfromfastapiimportFastAPIapp=FastAPI()#路径参数枚举值'''编程语言三种分类:pythonjavago'''#继承str枚举EnumclassLangNam......
  • Linux 中间件 | Perl 及 Perl 模块安装
    Perl作为脚本语言,应用范围也比较广泛。本文环境,AmazonLinuxrelease2,全程用root用户。Perl安装一、通常系统会自带,先确认一下rpm-qa|grepperl二、没有自带,......
  • gzip模块详解
    包方法:GzipFileopengzip_file=gzip.open('B5-H.pickle.gz')>>>type(tar_file)<class'gzip.GzipFile'>tar_file1=gzip.GzipFile('testtar.tar')>>>type(ta......
  • 语音识别模块
      https://item.taobao.com/item.htm?spm=a1z09.2.0.0.7ea92e8dSnWrPM&id=664937015643&_u=m1qf7bf5ed2f      LU-ASR01常见问题:1.可以自定义唤醒词吗? ......
  • 修改U8启用模块日期以下以库存为例
    注意:以下方法仅适用于你所调整区间没有对应的表单业务发生,如确实要调整,需要删除调整区间内的业务表单,以下场景仅适用于初始化工作未完成需要重新初始化及业务单据不多情况:......
  • “一网统管”视频汇聚平台EasyCVR视频调阅模块新增“点击加载上次记录”功能
    EasyCVR视频融合平台基于云边端一体化架构,部署轻快、功能灵活,平台可支持多协议、多类型设备接入,在视频能力上,可实现视频直播、录像、回放、检索、云存储、告警上报、语音对......