GetProcAddress(new IntPtr(0xac8),“SomeFoo”中的常量句柄,它是如何可能的
本文关键字:句柄 常量 何可能 SomeFoo IntPtr new 0xac8 GetProcAddress | 更新日期: 2023-09-27 18:30:16
在反转程序时面临代码(c#):
IntPtr address = GetProcAddress(new IntPtr(0xac8), "SomeFoo");
如果我理解正确,这个句柄通常来自
HMODULE WINAPI LoadLibrary(_In_ LPCTSTR lpFileName);
或者,例如,从
HMODULE WINAPI GetModuleHandle(_In_opt_ LPCTSTR lpModuleName);
此句柄是动态的,永远不会指向同一地址两次。
问题是:在什么情况下可以使用硬编码句柄?
UPD:这个技巧不可能以通常的方式奏效。所以,似乎这个调用是由内核驱动程序挂钩的,这个地址"0xac8"只是这个驱动程序识别我的程序调用的键。
问题是:在什么情况下可以使用硬编码句柄?
首先,假设正常使用,没有我能想到的情况。当然,任何模块句柄都不能具有0xac8
的值,因为模块句柄是一个地址。并且该地址是系统保留的区域的一部分,并且始终无法访问该地址的内存。
所以,如果是这样,那么我相信你对这个调用进行了错误的逆向工程。
另一方面,也许你已经正确地逆向工程了。在这种情况下,我们不是在谈论正常使用。因此,也许该进程已经挂钩LoadLibrary
在传递这样的模块句柄时执行一些特殊行为。但在这一点上,我们只能推测。
顺便说一句,您还说,"这个句柄是动态的,永远不会两次指向同一个地址"。好吧,模块完全有可能重复加载到同一地址。模块具有首选加载地址,如果可能,系统会尝试通过在加载模块的每个进程中的相同地址加载模块来降低物理内存成本。但是,您不能在编译时假定将使用什么地址。