我想首先说我是C ++的新手。 我正在尝试构建一个简单的控制台应用程序,通过更改单个字节数组来修改绘图工具的功能。
我找到了需要更改的字节数组,并尝试按照本教程进行操作,但最终用于dll注入,这不是我想做的http://guidedhacking.com/showthread.php?3981
如果有人能以任何方式帮助我如何在控制台应用程序中进行签名扫描,那将非常感激。
答案 0 :(得分:0)
我会阅读ReadProcessMemory,这是一种从外部读取数据而不需要DLL注入的好方法。
没有回答签名扫描问题。我会以块的形式读取目标进程的内存,比方说1024字节,并在块上运行模式匹配函数。
但是这个领域真的不适合C ++初学者,除非您之前使用过其他语言。
答案 1 :(得分:0)
自从制作完该教程以来,我还制作了一个外部模式扫描视频教程。它并不是完美的,我伤心地说。但是,让您开始使用的是我目前正在使用的代码,但现在还没有失败:
内部模式扫描功能:
char* ScanIn(char* pattern, char* mask, char* begin, unsigned int size)
{
unsigned int patternLength = strlen(mask);
for (unsigned int i = 0; i < size - patternLength; i++)
{
bool found = true;
for (unsigned int j = 0; j < patternLength; j++)
{
if (mask[j] != '?' && pattern[j] != *(begin + i + j))
{
found = false;
break;
}
}
if (found)
{
return (begin + i);
}
}
return nullptr;
}
用于外部模式扫描的包装:
char* ScanEx(char* pattern, char* mask, char* begin, char* end, HANDLE* hProc)
{
char* currentChunk = begin;
char* match = nullptr;
SIZE_T bytesRead;
while (currentChunk < end)
{
MEMORY_BASIC_INFORMATION mbi;
//return nullptr if VirtualQuery fails
if (!VirtualQueryEx(hProc, currentChunk, &mbi, sizeof(mbi)))
{
return nullptr;
}
char* buffer = new char[mbi.RegionSize];
if (mbi.State == MEM_COMMIT && mbi.Protect != PAGE_NOACCESS)
{
DWORD oldprotect;
if (VirtualProtectEx(hProc, mbi.BaseAddress, mbi.RegionSize, PAGE_EXECUTE_READWRITE, &oldprotect))
{
ReadProcessMemory(hProc, mbi.BaseAddress, buffer, mbi.RegionSize, &bytesRead);
VirtualProtectEx(hProc, mbi.BaseAddress, mbi.RegionSize, oldprotect, &oldprotect);
char* internalAddress = ScanIn(pattern, mask, buffer, bytesRead);
if (internalAddress != nullptr)
{
//calculate from internal to external
uintptr_t offsetFromBuffer = internalAddress - buffer;
match = currentChunk + offsetFromBuffer;
delete[] buffer;
break;
}
}
}
currentChunk = currentChunk + mbi.RegionSize;
delete[] buffer;
}
return match;
}
然后您将其命名为:
ScanEx("\x29\x7b\x00\x8b\xc7", "xx?xx", moduleBase, moduleEnd, &hProc);
我想到的想法是使用ReadProcessMemory一次将一个内存区域从目标进程中复制到本地进程中,然后在该缓冲区上运行我们的ScanIn()内部扫描功能。在目标内存中移动时,请检查内存页面是否具有正确的保护并声明其是有效的内存区域。
这里最大的警告是:如果您的模式跨两个区域进行桥接,则此函数将找不到它。但是在过去的三年中,使用它没有任何问题。