VC/MFC 访问进程内存,代码片段

#include "StdAfx.h"
#include <TlHelp32.h>
#include "ProcessMemory.h"

//打开进程内存
BOOL CProcessMemory::Open(INT nPID)
{
	HANDLE hToken;
	INT    nFlag;
	nFlag = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
	if(!nFlag)
	{
		OutputDebugString(_T("OpenProcessToken Fail!\n"));
		return 0;
	}
	SetPrivilege(hToken, SE_DEBUG_NAME, TRUE);
	::CloseHandle(hToken);
	m_hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, nPID);
	if (m_hProc == INVALID_HANDLE_VALUE)
		return FALSE;
	return TRUE;
}

BOOL CProcessMemory::Open(LPCTSTR pzProcessName)
{
	INT nPID;
	nPID = GetProcessID(pzProcessName);
	return Open(nPID);
}

//设置进程权限
int CProcessMemory::SetPrivilege(HANDLE hToken, LPCTSTR lpszStr, BOOL bEnable)
{
	TOKEN_PRIVILEGES tp;
	LUID luid;

	BOOL bRet;
	bRet = LookupPrivilegeValue(NULL, lpszStr, &luid);
	if(bRet == FALSE)
	{
		OutputDebugString(_T("Lookup Privilege Value Fail!\n"));
		return FALSE;
	}

	tp.PrivilegeCount = 1;
	tp.Privileges[0].Luid = luid;

	if(bEnable)
		tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
	else
		tp.Privileges[0].Attributes = 0;

	bRet = AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
	return bRet;
}


//写入
DWORD CProcessMemory::Write(LPVOID lpBaseAddress,  LPVOID lpBuffer, DWORD nSize)
{
	BOOL  bRet;
	DWORD dwReaded = 0;

	//句柄无效
	if(m_hProc == NULL)
		return FALSE;

	bRet = ::WriteProcessMemory(m_hProc, lpBaseAddress, lpBuffer, nSize, &dwReaded);
	if (bRet == FALSE)
		dwReaded = 0;
	return dwReaded;
}

//读取
DWORD CProcessMemory::Read(LPCVOID  lpBaseAddress,  LPVOID lpBuffer, DWORD nSize)
{
	BOOL  bRet;
	DWORD dwReaded = 0;

	//句柄无效
	if(m_hProc == NULL)
		return FALSE;

	bRet = ::ReadProcessMemory(m_hProc, lpBaseAddress, lpBuffer, nSize, &dwReaded);
	if (bRet == FALSE)
		dwReaded = 0;
	return dwReaded;
}

//关闭
void CProcessMemory::Close()
{
	if (m_hProc)
	{
		::CloseHandle(m_hProc);
	}
}

//根据进程名,返回第一个进程实例的PID
INT CProcessMemory::GetProcessID(LPCTSTR pzProcessName)
{	
	BOOL bRet;
	CString szExeName(pzProcessName);
	HANDLE hProcess;
	PROCESSENTRY32 procEntry;
	procEntry.dwSize = sizeof(PROCESSENTRY32); 
	
	//进行进程快照
	hProcess=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
	//开始进程查找
	bRet=Process32First(hProcess,&procEntry);

	//循环比较,得出ProcessID
	while(bRet)
	{
		if(0 == szExeName.Compare(procEntry.szExeFile))
			return procEntry.th32ProcessID;
		bRet=Process32Next(hProcess,&procEntry);
	}
	return 0;
}


VC/MFC 访问进程内存,代码片段

 

转载于:https://www.cnblogs.com/kerndev/p/5537398.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值