如何使用签名模式进行挂钩

How use signature pattern for hooking

我喜欢替换静态函数地址:

AddressOfHookSoundFunction = (DWORD)GetModuleHandleA("myfile.exe") + 0x0F3B65; // good: 4406117 (integer)

使用签名模式因为更灵活:

SigScan Scanner;

 AddressOfHookSoundFunction = Scanner.FindPattern("myfile.exe", "\x55\x8B\xEC\x83\xEC\x14\x53\x56\x8B", "xxxxxxxxx"); // bad: 3685831 (integer)

但值不同且仅工作静态地址:0x0F3B65

这里是 IDA 截图:

可能我插入了错误的转储信息。

这里是Scanner的代码:

class SigScan
{
public:
    // For getting information about the executing module
    MODULEINFO GetModuleInfo(char *szModule)
    {
        MODULEINFO modinfo = { 0 };
        HMODULE hModule = GetModuleHandleA(szModule);
        if (hModule == 0)
            return modinfo;
        GetModuleInformation(GetCurrentProcess(), hModule, &modinfo, sizeof(MODULEINFO));
        return modinfo;
    }

    // for finding a signature/pattern in memory of another process
    DWORD FindPattern(char *module, char *pattern, char *mask)
    {
        MODULEINFO mInfo = GetModuleInfo(module);
        DWORD base = (DWORD)mInfo.lpBaseOfDll;
        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;
    }
};

你能帮帮我吗?

问题似乎是您没有区分指针和整数。 FindPattern的return值是一个DWORD,但你实际上return是一个坏地址base + i。我说“损坏”是因为在 Win64 上这会丢失地址的前 32 位。

无论如何,由于 returned 值是一个地址,很明显这可能不同于偏移量 0x0F3B65。使用 ASLR(地址 Space 布局随机化),地址可以不同于 运行 运行。您可能只想 return i,并且还想删除 DWORD base = (DWORD)mInfo.lpBaseOfDll; 中损坏的演员表。这也修复了稍后的 char* 转换。

顺便说一句,因为它失去了一个 const;这些天代码段不可写。请参阅 DEP(数据执行保护)——您的挂钩也需要解决这个问题。