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

C++ 如何使用签名模式进行挂钩,c++,hook,reverse-engineering,ida,C++,Hook,Reverse Engineering,Ida,我想替换静态函数地址: AddressOfHookSoundFunction = (DWORD)GetModuleHandleA("myfile.exe") + 0x0F3B65; // good: 4406117 (integer) 使用签名模式becouse更灵活: SigScan Scanner; AddressOfHookSoundFunction = Scanner.FindPattern("myfile.exe", "\x55\

我想替换静态函数地址:

AddressOfHookSoundFunction = (DWORD)GetModuleHandleA("myfile.exe") + 0x0F3B65; // good: 4406117 (integer)
使用签名模式becouse更灵活:

SigScan Scanner;

 AddressOfHookSoundFunction = Scanner.FindPattern("myfile.exe", "\x55\x8B\xEC\x83\xEC\x14\x53\x56\x8B", "xxxxxxxxx"); // bad: 3685831 (integer)
但该值不同,仅适用于静态地址:0x0F3B65

以下是IDA截图:

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

以下是扫描仪的代码:

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;
    }
};
class-SigScan
{
公众:
//用于获取有关执行模块的信息
MODULEINFO获取MODULEINFO(char*szModule)
{
MODULEINFO modinfo={0};
HMODULE HMODULE=GetModuleHandleA(szModule);
if(hModule==0)
返回modinfo;
GetModuleInformation(GetCurrentProcess(),hModule,&modinfo,sizeof(MODULEINFO));
返回modinfo;
}
//用于在另一进程的内存中查找签名/模式
DWORD FindPattern(字符*模块、字符*模式、字符*掩码)
{
MODULEINFO mInfo=GetModuleInfo(模块);
DWORD base=(DWORD)mInfo.lpbaseofdl;
DWORD大小=(DWORD)mInfo.SizeOfImage;
DWORD图案长度=(DWORD)strlen(掩模);
对于(DWORD i=0;i

你能帮帮我吗?

问题似乎是你没有区分指针和整数。
FindPattern
的返回值是一个
DWORD
,但实际返回的是一个断开的地址
base+i
。我之所以说“断开”,是因为在Win64上,它会丢失地址的前32位

无论如何,由于返回的值是一个地址,很明显,它可能不同于偏移量
0x0F3B65
。使用ASLR(地址空间布局随机化),地址可以因运行而异。您可能只想返回
i
,还想删除
DWORD base=(DWORD)mInfo.lpbaseofdl中损坏的强制转换。这也修复了以后的
char*
强制转换


顺便说一句,这是进一步错误的,因为它丢失了一个
常量
;现在代码段不可写。请参阅DEP(数据执行预防)-您的钩子也需要解决这个问题。

找到并=掩码[j]='?'| |模式[j]=*(char*)(base+i+j)
是一种代码,其中一些()有助于提高可读性——我甚至不想弄清楚它是否正确。我想你的意图是找到&=(掩码[j]='?'| |模式[j]=*(字符*)(基+I+j))。是的,我确认。谢谢。由于错误太多,最好重写代码以查找签名。