如何挂接VirtualProtect API。因为加载本身的DLL肯定会在其内存代码范围内执行。这是因为(如您所提到的),他们使用用户访问权限,因此他们必须使用进程用户空间API。
NTSYSAPI NTSTATUS NTAPI ZwProtectVirtualMemory(
IN HANDLE ProcessHandle,
IN PVOID * BaseAddress,
IN SIZE_T * NumberOfBytesToProtect,
IN ULONG NewAccessProtection,
OUT PULONG OldAccessProtection
);
如果您在程序开始时挂钩,则可以过滤出可疑保护呼叫(启用代码执行的呼叫)。然后,我将扫描PE头或者在所请求的页面前面知道它的一个可加载的模块…注意:我认为这不是为常规DLL调用的,因为LoadLibrary处理这个内核空间。对? TODO:验证
通常,PE头位于第一个可执行代码前面的0x1000(4096)字节或一页。所以一个非常基本的方法可以扫描“MZ”标签:
char* pe = ((char*)BaseAddress) - 0x1000;
if ((NewAccessProtection == PAGE_EXECUTE || ... ) & pe[0] == 'M' && pe[0] == 'Z')
{
// do checks here
}
如果您需要有关API钩的更多信息,请在网上查询或阅读大量文章。另一个挂钩的候选人是:FlushInstructionCache(…)。但是我认为只有暴雪正在使用这个防守防骗模块,因为x86架构上没有理由称之为这个。
… 只是一个想法,
将