c++ 过程的阅读内容

kqhtkvqz  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(149)

我试图读取当前进程的内容来找到一个模式,我通过调用GetModuleHandleA()获得一个指向基址的指针,然后想循环通过它并保持匹配字节,但我不知道我可以循环通过的最大大小是多少?
我试图读取文件的大小,并使用文件大小作为最大循环计数器。
以下是我目前为止写的代码,

const char buf[] = { 0x40, 0x35, 0x02, 0x00, 0x78, 0x00 };

    char ProcessFilePath[MAX_PATH];
    GetModuleFileNameA(NULL, ProcessFilePath, MAX_PATH);
    HANDLE hFile = CreateFileA(ProcessFilePath,
        GENERIC_READ,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL);
    if (hFile == INVALID_HANDLE_VALUE)
        return -1;
    LARGE_INTEGER size;
    GetFileSizeEx(hFile, &size);

    const unsigned char* lpImage = (unsigned char*)GetModuleHandleA(NULL);

    int maincounter = 0;
    int patternsize = sizeof(buf);
    for (int maincounter = 0; maincounter < size.LowPart; maincounter++)
    {
        printf("%02x", lpImage[maincounter]);
    }

如何读取所有进程内存?确定进程内存大小的正确方法是什么?为了澄清,我试图读取进程内存并匹配函数签名的字节序列。目标是找到函数在内存中的位置。
谢谢

b4lqfgs4

b4lqfgs41#

感谢@500 -内部服务器错误评论,我使用了ToolHelp API,我的问题得到了解决。MODULEENTRY32有两个成员modBaseSize用于大小,modBaseAddr用于地址。

DWORD GetModuleBaseAddress() 
{ 
  
    MODULEENTRY32 me32  = { sizeof(MODULEENTRY32) }; 
    HANDLE hSnapshot    = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId()); 

    if (hSnapshot == INVALID_HANDLE_VALUE) {
        return 0; 
    }
        
    if (Module32First( hSnapshot, &me32 )) { 
        CloseHandle( hSnapshot );
        cout << me32.modBaseSize<< endl;
        cout << me32.modBaseAddr << endl; 
    }

    CloseHandle(hSnapshot); 
    return 0; 
}

相关问题