ReadProcessMemory/C++的探索[通俗易懂]

ReadProcessMemory/C++的探索[通俗易懂]ReadProcessMemory函数msdn说明:BOOLWINAPIReadProcessMemory(_In_   HANDLEhProcess,_In_   LPCVOIDlpBaseAddress,_Out_  LPVOIDlpBuffer,_In_   SIZE_TnSize,_Out_  SIZE_T*lpNumberOfByte

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

ReadProcessMemory 函数msdn说明:

BOOL WINAPI ReadProcessMemory(
  _In_   HANDLE hProcess,
  _In_   LPCVOID lpBaseAddress,
  _Out_  LPVOID lpBuffer,
  _In_   SIZE_T nSize,
  _Out_  SIZE_T *lpNumberOfBytesRead
);

Parameters

hProcess [in]

A handle to the process with memory that is being read. The handle must have PROCESS_VM_READ access to the process.

进程句柄

lpBaseAddress [in]

A pointer to the base address in the specified process from which to read. Before any data transfer occurs, the system verifies that all data in the base address and memory of the specified size is accessible for read access, and if it is not accessible the function fails.

读取内存的基址(关键,因为不是随便取一个就能读出来的)

lpBuffer [out]

A pointer to a buffer that receives the contents from the address space of the specified process.

读出内容后输出的缓冲区的头地址

nSize [in]

The number of bytes to be read from the specified process.

需要读取内存的大小

lpNumberOfBytesRead [out]

A pointer to a variable that receives the number of bytes transferred into the specified buffer. If lpNumberOfBytesRead is NULL, the parameter is ignored.

实际读取内存的大小

Return value

If the function succeeds, the return value is nonzero.

如果成功,返回非0。

If the function fails, the return value is 0 (zero). To get extended error information, call GetLastError.

如果失败,返回0,错误可通过GetLastError获得

The function fails if the requested read operation crosses into an area of the process that is inaccessible.

重点:当操作进入了进程不可读取的部分时会失败,大多数人犯的错误。

Remarks

ReadProcessMemory copies the data in the specified address range from the address space of the specified process into the specified buffer of the current process. Any process that has a handle with PROCESS_VM_READ access can call the function.

函数需要进程的PROCESS_VM_READ 权限

The entire area to be read must be accessible, and if it is not accessible, the function fails.

关于探索旅程的废话说一点:

开始按实验报告上的要求基址填了0x,其它查了下msdn函数原型简单写出了程序,运行一下,结果就悲剧的读取失败。

下面是错误的代码:

STARTUPINFO si;	PROCESS_INFORMATION pi;	HANDLE hProcess=NULL;	ZeroMemory( &si, sizeof(si) );	si.cb = sizeof(si);	ZeroMemory( &pi, sizeof(pi) );	if(!CreateProcess(L".\\memoryinfo_child2.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))	{		printf( "CreateProcess2 failed (%d)\n", GetLastError() );	}	WaitForSingleObject( pi.hProcess, 1000 );	byte *readtemp=new byte[256*16];	DWORD dwNumberOfBytesRead;	hProcess = OpenProcess(PROCESS_ALL_ACCESS,		FALSE, pi.dwProcessId );	if(hProcess !=NULL)	{		int i=0x00000000;		if(!ReadProcessMemory(hProcess,(LPCVOID)i,readtemp,0x10,&dwNumberOfBytesRead)){			i++;		}		printf("readsuccess:");		for(int i=0;i<dwNumberOfBytesRead;i++){			printf("\n");			printf("%X",readtemp[i]);		}		printf("\n");	}	CloseHandle( pi.hProcess );	CloseHandle( pi.hThread );

然后查了各种博客,讲得大同小异,有的说权限不对,有的说地址不对,然后我看到可以用GetLastError(菜鸟一枚,勿喷)获取错误代码,我用了后发现代码是5,然后用IDE工具中的错误查看器查出错误是:

仅完成部分的 ReadProcessMemory 或 WriteProcessMemory 请求。没啥帮助,不过 至少学会GetLastError(菜鸟一枚,勿喷),,,

对于基址不对,有人说得用CE工具查看(表示CE是神马东东),然后百度了下,原来CE的全称是ChartEngine,大神一般用来游戏作弊,没想到今日居然用来做作业。。。怒下。

居然支持中文版,感动,,,

用ChartEngine查看了子进程的内存,果然基址至少20000以上,还且经常会变。基址换了之后,真的读取成功了,感动得泪流满面。

后来由于基址在程序运行前会变化,所有用了while语句,直到成功时才跳出循环,苦逼,,,这么简单的东西搞了半天,主要基础没打好,,,,

下面是正确的代码:

STARTUPINFO si;	PROCESS_INFORMATION pi;	HANDLE hProcess=NULL;	ZeroMemory( &si, sizeof(si) );	si.cb = sizeof(si);	ZeroMemory( &pi, sizeof(pi) );	if(!CreateProcess(L".\\memoryinfo_child2.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))	{		printf( "CreateProcess2 failed (%d)\n", GetLastError() );	}	WaitForSingleObject( pi.hProcess, 1000 );	byte *readtemp=new byte[256*16];	DWORD dwNumberOfBytesRead;	hProcess = OpenProcess(PROCESS_ALL_ACCESS,		FALSE, pi.dwProcessId );	if(hProcess !=NULL)	{		int i=0x00020000;		while(!ReadProcessMemory(hProcess,(LPCVOID)i,readtemp,0x10,&dwNumberOfBytesRead)){			i++;		}		printf("readsuccess:");		for(int i=0;i<dwNumberOfBytesRead;i++){			printf("\n");			printf("%X",readtemp[i]);		}		printf("\n");	}	CloseHandle( pi.hProcess );	CloseHandle( pi.hThread );

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/185838.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Modelsim的安装教程

    Modelsim的安装教程提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、Modelsim安装二、激活成功教程1.拷贝Crack文件夹中的文件2.激活成功教程过程可能出现的错误前言Modelsim的安装与激活成功教程使用一、Modelsim安装打开下在之后的文件夹,直接双击exe文件进行安装。不熟悉时,可以直接使用默认路径进行安装,不进行路径上的修改。1、下载并解压好文件包,然后运行安装程序根据向导提示进行软件安装2、依提示安装软件过程中需要注意的是,会有三个弹出框提示,首先是是否创建桌面快捷方式提示

  • debian重置root密码_ubuntu怎么给用户root权限

    debian重置root密码_ubuntu怎么给用户root权限1.登录recoverymode2.用passwd修改root用户的密码3.再登录普通桌面模式后就可以使用su切换到root用户

    2022年10月18日
  • CLION输入激活码【在线注册码/序列号/破解码】

    CLION输入激活码【在线注册码/序列号/破解码】,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 用Python做一个“以图搜番“的应用程序,再也不用愁动漫图片的出处了!

    用Python做一个“以图搜番“的应用程序,再也不用愁动漫图片的出处了!文章目录前言PyQt5界面设计使用QtDesigner绘制界面视频部件插入小技巧解码器下载功能实现trace.moeAPI介绍与视频使用Nuitka打包成exe文件前言喜欢看动漫的朋友们大概都能体会到一个难受的事情,就是在论坛或者群聊里面看到一张动漫截图,很想知道它的出处,但百度搜了一圈却也没有一个可靠结果,就很郁闷。今天就来带大家用Python做一个简单的“以图搜番”小应用。应用本身的实现不是很难的事情,其实就是调用别人的API接口来实现,主要目的还是通过这个案例来学习以下内容:学习如何用Py

  • 【软件工程】详细设计说明书

    【软件工程】详细设计说明书详细设计说明书1引言1.1编写目的说明编写这份详细设计说明书的目的,指出预期的读者。该文档实在概要设计的基础上,进一步的细化系统结构,展示了软件啊结构的图标,物理设计,数据结构设计,及算法设计,详细的介绍了系统各个模块是如何实现的,包括涉及到的算法,逻辑流程等,为下一步系统的实现和测试做准备!1.2背景说明:a.软件名称:机房收费系统;b.本项目的任务提出者:米新江…

  • 使用内存盘加快开发效率 (UltraRAMDisk,Jetbrains Idea,java)

    使用内存盘加快开发效率 (UltraRAMDisk,Jetbrains Idea,java)环境:Windows1020H2IntelliJIDEA2020.2.4x64JDK1.8内存盘软件:内存盘软件ultraramdisk官方地址CSDN资源链接://TODO硬件:i797001TB机械盘ddr426668G*2步骤0:内存大小根据实际内存去分配合理的大小动态分配内存根据需要备份和恢复根据自身需要,(关机速度会很慢内存盘内所有数据会写入到该镜像文件内)步骤1:我这边是选择直接将已有的idea软件…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号