Re: 关于修改页面写回的一个问题,麻烦张老师和各位大牛解惑一番,多谢!
Windows内核调试
关于修改页面写回的一个问题,麻烦张老师和各位大牛解惑一番,多谢!
zyq8709
2015-02-26, 15:02 下午
在内存紧张的时候会回收一些物理页面,对于脏的页面,在进程的工作集中存在于修改并写回和修改不写回两种链表。
那么有一个问题是,PE加载器在加载exe或dll时,采用的是哪种页面?或者有什么特殊的处理方法?
暂时不考虑对数据区等的写时复制的页面属性,或者假设采用了SHARE区段。
因为exe或dll等的后备存储器默认的是相对应的磁盘文件,而不是页面文件。那么:
如果采用了写回页面,那么对于PE文件中的修改,包括数据区或导入表等等的变化可能就会在内存紧张或进程结束时被写回磁盘的PE文件中,导致原始PE破坏,显然不太可能。
如果采用了不写回页面,那么对于PE文件的修改在进程销毁时不会被写回磁盘,但是在内存紧张的时候(考虑极限情况),PE映射的部分页面被回收导致相关被修改的页面没有保存到磁盘中(既没有写到页面文件中,也不在相对应的磁盘文件),这样的话再次访问时由于页面错误,又从磁盘读出的是原始数据,与当前运行时的数据不一致,导致程序执行出错。
麻烦各位大牛点拨一二,多谢!
Re: 关于修改页面写回的一个问题,麻烦张老师和各位大牛解惑一番,多谢!
格蠹老雷
2015-03-02, 18:56 下午
好问题,考虑的很深入
有时间会跟踪一下,估计是这样的,对于IMAGE的写会触发Copy on write,使用新的页来存放修改的内容了,此后就另外对待了
Re: 关于修改页面写回的一个问题,麻烦张老师和各位大牛解惑一番,多谢!
zyq8709
2015-03-07, 20:05 下午
谢谢张老师的解答!
主要是之前我想到可以用VirtualProtect修改页面属性为PAGE_EXECUTE_READWRITE后,再进行写入会引发这种问题。后来看了一些源码,发现对于VAD里标记为CoW的区域,就算设为可写也只是标记为写时复制的属性,而非直接标记为可写,所以就不存在这些问题了。至于原始的映射页面应该是不回写页面吧。