如何使用签名模式进行挂钩
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(数据执行保护)——您的挂钩也需要解决这个问题。
我喜欢替换静态函数地址:
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(数据执行保护)——您的挂钩也需要解决这个问题。