读取模式扫描c ++访问冲突读取内存

时间:2018-01-08 11:06:37

标签: readprocessmemory

FindPattern函数看起来像这样

DWORD FindPattern(DWORD base ,char *module, char *pattern, char *mask)
{
    MODULEINFO mInfo = GetModuleInfo(module);
    DWORD size = (DWORD)mInfo.SizeOfImage;
    DWORD patternLength = (DWORD)strlen(mask);

    for (DWORD i = 0; i < size - patternLength; i++)
    {
        bool found = true;
        for (DWORD j = 0; j < patternLength; j++)
        {
            found &= mask[j] == '?' || pattern[j] == *(char*)(base + i + j);
        }
        if (found)
        {
            return base + i;
        }
    }

    return NULL;
}

我正在使用像这样的功能

DWORD aAddy = FindPattern(BaseAddress,(char*)("ros.exe"),
                const_cast<LPSTR>("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\0x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFA\x44\x00\x00\x00\x3F\x00\x00\x00\x00"),
                const_cast<LPSTR>("???????????????x??????????????????????????????????????????????????????????????????????xx???x????"));

调试时我在j = 15时遇到错误并且掩码[j] ='x' 抛出异常显示访问冲突读取位置“base”

有人可以帮我解决j = 15的错误或者我错误地传递参数吗?

我无法通过char *模式就像(“ros.exe”)它给我的错误 不能将争论者char *转换为char *。

1 个答案:

答案 0 :(得分:0)

Gee代码看起来很熟悉:P

您在'base'上获得访问冲突,因为您没有对作为'base'参数传入的'BaseAddress'具有读取权限。我们不知道“BaseAddress”是什么,因为您没有在发布的代码中包含如何分配该变量的值。也许它是未初始化的,或者您需要使用VirtualProtect()来获取读取权限。我假设你没有初始化它或传递错误的地址。

当j = 15时,它首次从'base'读取,因为这是char数组的第一个不是通配符的元素,这意味着你的代码不会从'base + i + j'读取,直到非发现-wildcard就是为什么它直到j = 15才会发生。

原始源代码包含此行以获取模块的基址,但您已修改/删除它。

 DWORD base = (DWORD)mInfo.lpBaseOfDll;

或者,您可以使用它来获取可执行文件的基址

 DWORD base = (DWORD)GetModuleHandle(NULL);

一旦你正确定义了基础,我认为你的代码可以正常工作