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 *。
答案 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);
一旦你正确定义了基础,我认为你的代码可以正常工作