我正在使用 Windows 7 Professional x64。
我需要挂钩 DefWindowProcW 程序。但是当我尝试通过 获取它的地址时GetProcAddress()
,它返回NtdllDefWindowProcW()
位于 ntdll.dll 中的地址。开头有一个真正的user32
函数跳转。DefWindowProcW()
NtdllDefWindowProcW()
有没有办法获得真正的程序地址而不是 ntdll 程序?
这就是所谓的转发导出。该功能是在早期版本的 Windows 中的 user32 中实现的。但在某个时候,微软决定将其移入 ntdll。为了避免破坏应用程序,user32 导出转发到"NtdllDefWindowProc_W"
ntdll 中命名的函数。
ntdll中的转发地址是函数实际实现的地方。它可能随后调用 user32 是一个实现细节。所以,如果你想钩住DefWindowProcW
,你可以很好地钩住你调用返回的地址
GetProcAddress(GetModuleHandle("user32.dll"), "DefWindowProcW")