控制台中的C++签名扫描程序

C++ Signature Scanner in Console

本文关键字:扫描 程序 C++ 控制台      更新时间:2023-10-16

我想首先说我对C++非常陌生。我正试图构建一个简单的控制台应用程序,只需更改一个字节数组即可修改绘制工具的功能。

我已经找到了需要更改的字节数组,并尝试遵循本教程,但它最终被用于dll注入,这不是我想要做的http://guidedhacking.com/showthread.php?3981

如果有人能以任何方式帮助我如何在控制台应用程序中进行签名扫描,我将不胜感激。

自从那个教程制作完成后,我还制作了一个外部模式扫描视频教程。我很难过地说,这并不完美。但让你从这里开始的是我目前使用的代码,它还没有让我失败:

内部模式扫描功能:

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("x29x7bx00x8bxc7", "xx?xx", moduleBase, moduleEnd, &hProc);

我想到的想法是使用ReadProcessMemory一次将一个内存区域从目标进程复制到本地进程中,然后在该缓冲区上运行我们的ScanIn()内部扫描函数。当您在目标内存中移动时,您会检查内存页是否具有正确的保护和状态,以确认它是一个有效的内存区域。

这里最大的警告是:如果你的模式跨越两个区域,这个函数找不到它。但我在过去3年里使用它没有遇到任何问题。

我会读取ReadProcessMemory,这是一种在不需要DLL注入的情况下从外部读取数据的好方法。

没有回答签名扫描问题。我会以块的形式读取目标进程的内存,比如1024字节,并在块上运行模式匹配函数。

但这个领域真的不适合C++初学者,除非你以前在其他语言中使用过它。