readprocessmemory error 299

转载 2013年12月04日 18:40:09

I try to read all commited pages of a process (Win7-64). On most pages it works but it fails for a few pages. I cannot explain why. Here is my test programme (compiled x32, tested in Win7-64):

#include <windows.h>

void main()
{
    HANDLE hProc = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION,FALSE,GetCurrentProcessId());

    SYSTEM_INFO si;
    ZeroMemory(&si,sizeof(SYSTEM_INFO));
    GetSystemInfo(&si);

    char* buf = new char[si.dwPageSize];

    for (unsigned i = 0; i < 0x7fff0; i++)
    {
        void* baseOffs = (void*) (i * si.dwPageSize);
        MEMORY_BASIC_INFORMATION mbi;
        ZeroMemory(&mbi,sizeof(MEMORY_BASIC_INFORMATION));

        if (VirtualQueryEx(hProc, baseOffs, &mbi, sizeof(MEMORY_BASIC_INFORMATION)) == 0)
        {
            MessageBox(NULL, TEXT("VirtualQueryEx failed"),TEXT(""),MB_OK);
        }

        if (mbi.State == MEM_COMMIT)
        {
            SIZE_T numByteWritten = 0;
            if(ReadProcessMemory(hProc, baseOffs,buf,si.dwPageSize,&numByteWritten) == FALSE)
                OutputDebugString(TEXT("bad\n")); //GetLastError()==ERROR_PARTIALLY_READ; numByteWritten == 0;
            else
                OutputDebugString(TEXT("good\n"));

        }
    }

    delete[] buf;
}

I tired to look into the MEMORY_BASIC_INFORMATION for the failing pages but I didn't find anything strange there. Also the number of failing pages varies from run to run (in average about 5). WHat prevents me from reading these pages? Do I need to adjust some privilges in the process token?


A little bit of debugging and somethings interesting is identified: all pages that fail have protection bit PAGE_GUARD set (see MSDN doc). As I interpret the docs, it is by design that you cannot read these pages with ReadProcessMemory.

if(ReadProcessMemory(hProc, baseOffs,buf,si.dwPageSize,&numByteWritten) == FALSE) {
    assert(mbi.Protect & 0x100);
    OutputDebugString(TEXT("bad\n")); //GetLastError()==ERROR_PARTIALLY_READ; numByteWritten == 0; 
}
else {
    assert(!(mbi.Protect & 0x100));
    OutputDebugString(TEXT("good\n")); 
}

windows 编程ReadProcessMemory 使用中遇到的问题解决

本次锻炼的本来是对ReadProcessMemory 里边的NtReadVirtualMemory 进行反汇编,为了验证反汇编成功,需要先使用NtReadVirtualMemory 的上层函数Read...
  • duhaomin
  • duhaomin
  • 2013年10月30日 16:08
  • 2465

ReadProcessMemory函数读取基址时输出却变成了一个地址,请教一下大家

我用ReadProcessMemory函数想读出QQ对对碰游戏的棋盘数组的数据可是输出的却是一个地址,但是用同样的方法读取座位号的基址就可以正确输出作为号,所以想请教一下大家这是什么原因,以下是代码:...
  • zhuchanjiang2443
  • zhuchanjiang2443
  • 2017年01月19日 01:45
  • 360

关于WriteProcessMemory 错误 GetLastError = 299

做64位程序dll注入时候出现  WriteProcessMemory的299错误 ,查找错误代码 解释为 “仅完成部分的 ReadProcessMemory 或 WriteProcessMemory...
  • qiufeng19880207
  • qiufeng19880207
  • 2017年08月15日 16:10
  • 167

Readprocessmemory用法

函数功能:该函数从指定的进程中读入内存信息,被读取的区域必须具有访问权限。 函数原型:BOOL ReadProcessMemory(HANDLE hProcess,LPCVOID lpBaseAddr...
  • coolszy
  • coolszy
  • 2010年04月24日 15:22
  • 29065

访问进程私有地址空间--ReadProcessMemory

ReadProcessMemory函数用于读取其他进程的数据。我们知道自远古时代结束后,user模式下的进程都有自己的地址空间,进程与进程间互不干扰,这叫私有财产神圣不可侵犯。但windows里还真就...
  • wjtxt
  • wjtxt
  • 2011年07月26日 09:36
  • 2747

ReadProcessMemory/C++的探索

ReadProcessMemory 函数msdn说明: BOOL WINAPI ReadProcessMemory( _In_   HANDLE hProcess, _In_   LPC...
  • cql342624757
  • cql342624757
  • 2013年06月03日 08:45
  • 3912

Win64 驱动内核编程-27.强制读写受保护的内存

强制读写受保护的内存     某些时候我们需要读写别的进程的内存,某些时候别的进程已经对自己的内存读写做了保护,这里说四个思路(两个R3的,两个R0的)。  方案1(R3):直接修改别人内...
  • u013761036
  • u013761036
  • 2017年03月31日 00:06
  • 3706

关于Win7 x64下过TP保护(应用层)

关于Win7 x64下过TP保护(应用层)(转) 调试对象:DXF 调试工具:CE、OD、PCHunter、Windbg 调试先言:TP的应用层保护做得比较多,包括对调试器的检测,比如CE工具...
  • chaoguodong
  • chaoguodong
  • 2017年10月28日 21:55
  • 550

读取其他进程的数据

假设需要读取的进程为Exe可执行程序A1、根据A的实际打开程序名:A.exe,来找到这个程序的窗口句柄(和进程句柄不同)typedef struct tagWNDINFO { DWORD dw...
  • guoguojune
  • guoguojune
  • 2016年08月18日 15:04
  • 969

写进程内存

#include #include using namespace std; int main() {         //获取句柄         HWND hwnd;      ...
  • aasmfox
  • aasmfox
  • 2016年12月09日 10:58
  • 222
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:readprocessmemory error 299
举报原因:
原因补充:

(最多只允许输入30个字)