zoukankan      html  css  js  c++  java
  • windows api学习笔记读写其他进程的内存

    #include <windows.h>
    #include <iostream>
    using namespace std;
    
    
    HANDLE g_hProcess;
    
    BOOL ChangeMemory(DWORD dwValue)
    {
    	const DWORD dwOneGB = 1024*1024*1024;//1GB
    	const DWORD dwOnePage = 4*1024;//4KB
    	if(g_hProcess == NULL)
    	{
    		cout<<"打开进程失败"<<endl;
    		return false;
    	}
    	DWORD dwBase = 64*1024;//winNT为应用程序预留的是640KB到2GB的地址空间
    	for(;dwBase<2*dwOneGB;dwBase += dwOnePage)
    	{
    		BYTE arBytes[4096];//一页内存4KB
    		if(!::ReadProcessMemory(g_hProcess,(LPVOID)dwBase,arBytes,4096,NULL))//最后一个参数是返回的实际读取的字节数
    		{
    			cout<<"此页内存不可读"<<endl;
    			return false;
    		}
    		DWORD* pdw;
    		for(int i=0;i<(int)4*1024-3;i++)
    		{
    			pdw = (DWORD*)&arBytes[i];
    			if(pdw[0] == 2600)
    			{
    				::WriteProcessMemory(g_hProcess,(LPVOID)(dwBase+i),&dwValue,sizeof(DWORD),NULL);//最后一个参数是成功写入的字节数
    			}
    		}
    	}
    	return true;
    }
    int main()
    {
    	PROCESS_INFORMATION pi;
    	char szCommandLine[] = "cmd";
    	STARTUPINFO si;
    	::ZeroMemory(&si,sizeof(si));
    	si.cb = sizeof(si);
    	si.dwFlags = STARTF_USESHOWWINDOW;
    	si.wShowWindow = TRUE;
    	BOOL bRet = ::CreateProcess(
    		NULL,
    		szCommandLine,
    		NULL,
    		NULL,
    		FALSE,
    		CREATE_NEW_CONSOLE,
    		NULL,
    		NULL,
    		&si,
    		&pi
    		);
    	if(bRet)
    	{
    		cout<<"创建进程成功,注意新进程的win版本号"<<endl;
    		g_hProcess = ::OpenProcess(PROCESS_ALL_ACCESS,FALSE,pi.dwProcessId);
    		ChangeMemory(9999);
    		::Sleep(6000);
    	}
    	::CloseHandle(pi.hThread);
    	::CloseHandle(pi.hProcess);
    	char a;
    	cin>>a;
    }
    
  • 相关阅读:
    Div高度百分比
    字典树模板题 POJ 2503
    POJ 2828
    POJ 2186
    HDU 3397 双lazy标记的问题
    HDU 3911 区间合并求最大长度的问题
    CodeForces 444C 节点更新求变化值的和
    POJ 3667 线段树的区间合并简单问题
    HDU 4578 线段树复杂题
    UVAlive 3211 Now or Later
  • 原文地址:https://www.cnblogs.com/liulun/p/1663951.html
Copyright © 2011-2022 走看看