首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ReadProcessMemory()不适用于像0x2840C6C68D8这样的长地址

ReadProcessMemory()是一个Windows API函数,用于从指定进程的虚拟内存中读取数据。它的原型如下:

代码语言:txt
复制
BOOL ReadProcessMemory(
  HANDLE  hProcess,
  LPCVOID lpBaseAddress,
  LPVOID  lpBuffer,
  SIZE_T  nSize,
  SIZE_T  *lpNumberOfBytesRead
);

参数解释如下:

  • hProcess:要读取内存的进程句柄。
  • lpBaseAddress:要读取的内存起始地址。
  • lpBuffer:用于存储读取数据的缓冲区。
  • nSize:要读取的字节数。
  • lpNumberOfBytesRead:实际读取的字节数。

然而,ReadProcessMemory()函数在处理长地址时可能会遇到问题。长地址通常是指64位操作系统中的地址,它们由16个十六进制数字组成,比如0x2840C6C68D8。由于Windows API函数的限制,ReadProcessMemory()函数在32位进程中无法正确处理64位地址。

为了解决这个问题,可以使用其他方法来读取长地址的内存数据。一种常见的方法是使用指针链,通过多次调用ReadProcessMemory()函数来读取连续的内存块。另一种方法是使用更高级的调试技术,如使用调试器来读取目标进程的内存。

总结起来,ReadProcessMemory()函数不适用于像0x2840C6C68D8这样的长地址。如果需要读取长地址的内存数据,可以考虑使用指针链或调试技术来实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

readprocessmemory函数分析_in the process

大家好,又见面了,我是你们朋友全栈君。 函数功能:该函数从指定进程中读入内存信息,被读取区域必须具有访问权限。...lpNumberOfBytesRead); 参数: hProcess:进程句柄 lpBaseAddress:读出数据地址 lpBuffer:存放读取数据地址 nSize:读出数据大小...lpBuffer, int nSize, out int lpNumberOfBytesRead); 这个函数有五个参数,第一个参数是 进程句柄,由OpenProcess函数获取;第二个参数是要读出数据地址...,使用CE等辅助工具可取得;第三个参数是用于存放读取数据地址;第四个参数是 要读出数据大小;第五个参数是读出数据实际大小。...发布者:全栈程序员栈,转载请注明出处:https://javaforall.cn/185866.html原文链接:https://javaforall.cn

36120

Readprocessmemory用法

大家好,又见面了,我是你们朋友全栈君。 函数功能:该函数从指定进程中读入内存信息,被读取区域必须具有访问权限。...lpNumberOfBytesRead); 参数: hProcess:进程句柄 lpBaseAddress:读出数据地址 lpBuffer:存放读取数据地址 nSize:读出数据大小 lpNumberOfBytesRead..., int nSize, out int lpNumberOfBytesRead); 这个函数有五个参数,第一个参数是 进程句柄,由OpenProcess函数获取;第二个参数是要读出数据地址...,使用CE等辅助工具可取得;第三个参数是用于存放读取数据地址;第四个参数是 要读出数据大小;第五个参数是读出数据实际大小。...发布者:全栈程序员栈,转载请注明出处:https://javaforall.cn/185788.html原文链接:https://javaforall.cn

33820

ReadProcessMemory与WriteProcessMemory用例分析

首先介绍一个函数VirtualProtectEx,它用来改变一个进程虚拟地址中特定页里某一区域保护属性,这句话有些咬嘴,直接从MSDN中翻译过来,简单来说就是改变某一进程中虚拟地址保护属性,如果以前是只读...,第二个参数lpBaseAddress为要读取内容地址,当然你事先要了解你要读取内容地址。...使用ReadProcessMemory()函数,可以获得该进程内存空间中信息,或是用于监测进程执行情况,或是将进程内数据备份,然后调用writeProcessMemory()进行修改,必要时再还原该进程数据...将内存内容更改后,别忘了调用VirtualProtectEx()恢复内存原来保护属性。 下面看个例子,该例子是用于如何设置和移除断点,类似调试器功能。...发布者:全栈程序员栈,转载请注明出处:https://javaforall.cn/185948.html原文链接:https://javaforall.cn

60120

用户层下API逆向分析及重构

&API-MS-Win-Core-Memory-L1-1-0.ReadProcessMemory> 函数,在kenel32.dll中,mov edi,edi 是用于热补丁技术所保留,这段代码仔细看其实除了...我们希望自己代码中直接传递参数,并且直接调用调用ntdll.KiFastSystemCall函数。因此我们需要模拟call指令,call指令本质就是将返回地址入栈,并跳转。...在 User 层和 Kernel 层分别定义了一个 _KUSER_SHARED_DATA结构区域,用于 User 层和 Kernel 层共享某些数据,它们使用固定地址值映射,_KUSER_SHARED_DATA...结构区域在 User 和 Kernel 层地址分别为: User 层地址为:0x7ffe0000 Kernnel 层地址为:0xffdf0000 虽然指向是同一个物理页,但在ring3层是只读,在...直接sysenter进内核,这样可以规避所有三环hook。

86481

用户层下API逆向分析及重构

&API-MS-Win-Core-Memory-L1-1-0.ReadProcessMemory> 函数,在kenel32.dll中,mov edi,edi 是用于热补丁技术所保留,这段代码仔细看其实除了...我们希望自己代码中直接传递参数,并且直接调用调用ntdll.KiFastSystemCall函数。因此我们需要模拟call指令,call指令本质就是将返回地址入栈,并跳转。...在 User 层和 Kernel 层分别定义了一个 _KUSER_SHARED_DATA结构区域,用于 User 层和 Kernel 层共享某些数据,它们使用固定地址值映射,_KUSER_SHARED_DATA...结构区域在 User 和 Kernel 层地址分别为: User 层地址为:0x7ffe0000 Kernnel 层地址为:0xffdf0000 虽然指向是同一个物理页,但在ring3层是只读,在...直接sysenter进内核,这样可以规避所有三环hook。

60810

createprocess error=2_CreateProcess

std::cout << "获取句柄成功" << std::endl; } else { std::cout << "获取句柄失败" << std::endl; } } ReadProcessMemory...函数声明如下,成功true失败返回false BOOL ReadProcessMemory ( HANDLE process,//要读取句柄 LPCVOID baseAddress,//要读取地址(...我个人觉得就是相对于HANDLE偏移地址) LPVOID buffer,//要把读到数据放到buffer,这是个指针 SIZE_T size,//要读取数据字节大小 SIZE_T *readSize...( HANDLE process,//要写入句柄 LPVOID baseAddress,//要写入地址,注意不是LPCVOID(多个C) LPCVOID buffer,//要写入数据指针 SIZE_T...发布者:全栈程序员栈,转载请注明出处:https://javaforall.cn/194599.html原文链接:https://javaforall.cn

47510

ReadProcessMemory会被检测到吗?_仅完成部分readprocess如何解决

大家好,又见面了,我是你们朋友全栈君。 ReadProcessMemory 从特定进程内存里读取数据。被读取整个位置应该是可读否则操作会失败。...BOOL WINAPI ReadProcessMemory( __in HANDLE hProcess , __in LPCVOID lpBaseAddress , __out LPVOID...lpBaseAddress:一个指向目标进程需要读取数据地址指针。在读取数据之前,系统将会确认需读取所有数据是否可读,如果不可读那么函数执行失败。...lpBuffer:指向要接收读取到数据缓冲区。 nSize:读取数据大小,单位为Bytes。 lpNumberOfBytesRead:指向一个变量,用于放置传送数据大小。...发布者:全栈程序员栈,转载请注明出处:https://javaforall.cn/186007.html原文链接:https://javaforall.cn

70830

C++内存加密动态免杀defender

前置知识 这里用到两个函数ReadProcessMemory、WriteProcessMemory: // 将指定地址范围中数据从指定进程地址空间复制到当前进程指定缓冲区。...在32位系统中函数地址为4字节,如果要修改MessageBox函数跳转到HookedMessageBox函数,MessageBox函数地址位12340000h,HookedMessageBox地址为12345678h...首先进入setHook函数,该函数用于设置挂钩,oldAddress保存了MessageBox函数地址: 使用ReadProcessMemory函数从内存中读取原始MessageBox函数前6个字节...加密了内存2,内存1也要进行一些处理,可以使用VirtualFree释放内存1,也可以内存2一样加密。...,如果函数调用地址在这一块内存页范围则表明这是shellcode申请地址,即内存2,这样就成功获取到内存2地址: void initVirtualAllocSet(PVOID callerAddress

2K61

读取与修改其他程序数据ReadWriteProcessMemory

4.在程序私有的2GB中,windows 98系列系统程序可用地址为4MB–2GB windows 2000系列系统程序可用地址为...修改后程序正确执行,但是在读取一些不可用内存地址时会有229错误(会有很多,是正常) ——仅完成部分 ReadProcessMemory 或WriteProcessMemory 请求。...DWORD g_arList[1024]; // 存放查找到地址列表 int g_nListCnt; // 有效地址个数 HANDLE g_hProcess; // 目标进程句柄...,与新值dwValue比较 // 在已经搜索出来地址中再次查找 for(int m=0;m<nOrgCnt;m++) { if(::ReadProcessMemory(g_hProcess...发布者:全栈程序员栈,转载请注明出处:https://javaforall.cn/194418.html原文链接:https://javaforall.cn

1.6K20

x86平台inline hook原理和实现

原理 对于正常执行程序,它函数调用流程大概是这样: 0x1000地址call指令执行后跳转到0x3000地址处执行,执行完毕后再返回执行call指令下一条指令。...指令内存地址;backCode接收一个长度为5字节数组缓冲区,用于备份原有的call指令;FuncBeCall参数接收一个返回值为void函数地址。...StartHook函数第3个参数接收一个函数地址,这个函数地址指向函数应该是这样: _declspec(naked) void OnCall() { ...... } OnCall函数用_declspec...(naked)修饰,被它修饰函数我们常称它为裸函数,裸函数特点是在编译生成时候不会产生过多用于平衡堆栈指令,这意味着在裸函数中我们要编写内联汇编控制堆栈平衡。...发布者:全栈程序员栈,转载请注明出处:https://javaforall.cn/155255.html原文链接:https://javaforall.cn

74910

error at hooking api ntprotect_read,match and write

编译环境:delphi 2010+windows 7 u ,用途读取其他程序中readprocessmemory和writeprocessmemory参数,但不知读取偏移即a+($b),b是怎么读...已实现 使用INLINE hookapi,CriticalSection临界区,dll分为动态loadlibry和静态加载 问题1:对多线程目标程序HOOK 卸载时会出现错误,应该是线程不断读写内存函数READPROCESSMEMORY...,但钩子正在卸载没有改回正确地址就被目标程序读取,导致目标程序处理错误API地址而出错,如果不是不停读写 卸载不会出现错误?...*后, 他对本进程所有模块IAT表都进行修改(使用WriteProcessMemory), 某线程可能此时访问正在被修改中IAT表, 可能call 到其它地址去。...发布者:全栈程序员栈,转载请注明出处:https://javaforall.cn/194475.html原文链接:https://javaforall.cn

61130

进程伪装详解

就不能够正常运行,所以我们如果想到实现进程伪装,最好选择就是伪装成系统必备exe,当我们进行进程伪装之后,在系统中显示就会是系统进程信息,但这个程序还是能够执行它正常功能,这样就达到了进程伪装...进程名和启动路径 那么这里我们改人如何获取进程这些信息呢,这里可以使用到ntdll.dll里面的NtQueryInformationProcess来获取进程PEB地址,这里稍微提一个概念,什么是...,这里拿到PEB结构之后我们就能够对进程一些属性进行修改就能够实现进程伪装效果,但是这里并不能够通过指针来直接速写内存数据,因为每个程序都有自己独立空间,所以这里就需要用到ReadProcessMemory...FS段寄存器指向当前TEB结构,在TEB偏移0x30处是PEB指针,通过这个指针即可取得PEB地址,可以通过汇编实现 __asm { mov eax,fs:[0x30] mov PEB,eax }...同理,0x70偏移则指向了 CommandLine为命令行参数 那么我们首先获取结构中PebBaseAddress和ProcessPamameters ::ReadProcessMemory(hProcess

65700

实战 | 进程伪装思路和研究

就不能够正常运行,所以我们如果想到实现进程伪装,最好选择就是伪装成系统必备exe,当我们进行进程伪装之后,在系统中显示就会是系统进程信息,但这个程序还是能够执行它正常功能,这样就达到了进程伪装...进程名和启动路径 那么这里我们改人如何获取进程这些信息呢,这里可以使用到ntdll.dll里面的NtQueryInformationProcess来获取进程PEB地址,这里稍微提一个概念,什么是...,这里拿到PEB结构之后我们就能够对进程一些属性进行修改就能够实现进程伪装效果,但是这里并不能够通过指针来直接速写内存数据,因为每个程序都有自己独立空间,所以这里就需要用到ReadProcessMemory...FS段寄存器指向当前TEB结构,在TEB偏移0x30处是PEB指针,通过这个指针即可取得PEB地址,可以通过汇编实现 __asm { mov eax,fs:[0x30] mov PEB,eax }...同理,0x70偏移则指向了 CommandLine为命令行参数 那么我们首先获取结构中PebBaseAddress和ProcessPamameters ::ReadProcessMemory(hProcess

1K20

C#_对内存操作

用.net方法是: Process[] p = Process.GetProcessesByName("winmine"); p[0].Id;这样就能返回相应进程PID了。...[] buffer,int size,int[] nor); readrpocessmemory可以用来读取某个进程地址值。...第一个参数就是上面API返回值;第二个是要读取进程地址;第三个参数为读取出内容,要求为指针,它相当于一个out类型参数,读出内容并不是以函数返回值方式得到;第四个为读取值字节大小,int为...int[] result=new int[1]; int[] lpdw=new int[1];//这样定义就可以了,一个元素数组,能起到指针作用。...流行工具是OD,本菜鸟还没研究透,另外CE这个工具也是必不可少,例如上面的地址0x1005194就是用CE找出来,CE怎么使用呢,再说就扯太远了,网上有不少教程,有兴趣可以查一下。

74920

进程伪装详解

就不能够正常运行,所以我们如果想到实现进程伪装,最好选择就是伪装成系统必备exe,当我们进行进程伪装之后,在系统中显示就会是系统进程信息,但这个程序还是能够执行它正常功能,这样就达到了进程伪装...NtQueryInformationProcess来获取进程PEB地址,这里稍微提一个概念,什么是PEB?...,这里拿到PEB结构之后我们就能够对进程一些属性进行修改就能够实现进程伪装效果,但是这里并不能够通过指针来直接速写内存数据,因为每个程序都有自己独立空间,所以这里就需要用到ReadProcessMemory...FS段寄存器指向当前TEB结构,在TEB偏移0x30处是PEB指针,通过这个指针即可取得PEB地址,可以通过汇编实现 __asm { mov eax,fs:[0x30] mov PEB,eax }...和ProcessPamameters ::ReadProcessMemory(hProcess, pbi.PebBaseAddress, &peb, sizeof(peb), NULL); ::ReadProcessMemory

1.9K40
领券