这几天我一直在研究PE格式,还有几个问题
数据部分是否被映射到进程的内存中,或者程序是否从磁盘中读取它?
如果它确实被映射到内存中,那么进程如何获取该部分的偏移量? (以及其他部分)
有没有什么方法可以获取已映射到内存中的进程的入口点,而不触及磁盘上的文件?
数据部分是否映射到进程的内存中
是的。这不太可能存活很长时间,程序很容易写入该部分。这会触发写时复制页面复制,该复制获取由分页文件而不是 PE 文件支持的页面。
进程如何获取该部分的偏移量?
链接器已经计算了该部分中变量的偏移量。它可能会被重新定位,这对于具有尴尬基地址的 DLL 来说很常见,而该基地址在加载 DLL 时已经在使用中。在这种情况下,加载程序使用 PE 文件中的重定位表来修补代码中的地址。包含此类修补代码的页面得到与数据部分相同的处理,它们不再由 PE 文件支持,并且不能在进程之间共享。
有什么方法可以获取进程的入口点
The entirePE 文件被映射到内存,包括它的标头。所以你当然可以从内存中读取 IMAGE_OPTIONAL_HEADER.AddressOfEntryPoint 而无需读取文件。请记住,如果您这样做是为了another进程,因为您无法直接访问其虚拟地址空间。您必须使用 ReadProcessMemory(),这没什么乐趣,而且不可能比读取文件更快。该文件很可能存在于文件系统缓存中。地址空间布局随机化功能很容易让您头疼,其设计初衷是让此类事情变得困难。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)