内存模块是否映射到进程的虚拟空间?

我看到,在Windows上函数EnumProcessModules返回一个指定的进程加载模块(其中一些应该是系统DLL如guard32.dll,version.dll等)。

我的问题是:这些模块是否映射到进程的虚拟空间? 我可以跳转到位于其中一个模块的指令(当然知道地址)吗?

是的,应该将DLL映射到进程虚拟地址空间。 如果该页面中的代码没有被执行,那么映射可能不会被真实的物理页面支持,当然,执行“随机”代码位而没有正确的初始化或设置以使代码正确执行(例如,调用处理功能使用一些需要在另一个函数中分配的数据)在某些不好的情况下会明显地结束。 还要记住,DLL可能会在不同的时间被加载到不同的地址,你运行相同的代码等等,所以你不能依靠DLL的地址是不变的 – 在另一台机器上它可能完全不同。

是的,只需使用从EnumProcessmodulees获得的模块调用GetProcAddress EnumProcessmoduleesGetProcAddress计算模块内的函数偏移量。

是的,可以直接从您自己的可执行文件调用的任何DLL代码都必须映射到您的进程空间。 您可以使用SysInternal的VMMap实用程序获取进程虚拟内存空间的精确图表: http : //technet.microsoft.com/en-us/sysinternals/dd535533

正如其他答案中所提到的那样,虚拟地址空间大部分(如果不是完全的话)是动态的。

有些情况下某些共享库不能直接从您的进程访问。 这些通常是沙盒(安全的)内核或驱动程序库,通过执行参数验证的特殊安全层/ API调用,然后执行环/上下文切换到不同的虚拟进程地址空间,或者通过安全线程间通信队列。 这些是昂贵的操作,所以它们通常仅在系统稳定有益时才被使用。