首页
社区
课程
招聘
[求助]对于一个exe/dll image来说, PAGE_EXECUTE_READWRITE 和 PAGE_EXECUTE_WRITECOPY到底有何差别?
2015-6-27 16:17 10036

[求助]对于一个exe/dll image来说, PAGE_EXECUTE_READWRITE 和 PAGE_EXECUTE_WRITECOPY到底有何差别?

2015-6-27 16:17
10036
收藏
免费 0
打赏
分享
最新回复 (8)
雪    币: 70
活跃值: (37)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wgejydy 1 2015-6-27 17:57
2
0
PAGE_EXECUTE_WRITECOPY 在你修改进程在内存中的代码段的时候不会影响到硬盘中的PE文件,否则的话修改之后硬盘上的也被改掉
雪    币: 194
活跃值: (103)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
谁知道 2015-6-27 20:52
3
0
PAGE_EXECUTE_READWRITE 一样不会modify原文件。

我今天专门编了个程序实验了一下, 两种参数没有啥差别。

同时打开同一exe的两个process , 修改其中一个(比如把一个函数jmp到另外一个)
不会影响该exe的另一个process 。

所以我觉得, 对于exe/dll image来说, 这两个protect没有区别。
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dppdpp 2015-6-28 00:07
4
0
PAGE_EXECUTE_WRITECOPY 的意思是copyonwrite->本节写入时复制->本节内所有page都可以writeoncopy,READWRITE只是单纯的写入无copy
雪    币: 70
活跃值: (37)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wgejydy 1 2015-6-28 12:42
5
0
因为你加上了可写属性
雪    币: 74
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
PeSafe 2015-6-28 13:04
6
0
当系统 中存在 两份EXE/DLL 以上时,才会有作用,PAGE_EXECUTE_WRITECOPY 映射到同一块物理内存,PAGE_EXECUTE_READWRITE是不同的物理内存
雪    币: 194
活跃值: (103)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
谁知道 2015-6-28 14:45
7
0
我觉得对于exe/dll image来说, PAGE_EXECUTE_READWRITE 也是copy on write 。

不可能在原image上写入, 也是在page file里新copy一块。
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
公监第一人 2015-6-29 16:23
8
0
建议看 wrk 的源码!
雪    币: 194
活跃值: (103)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
谁知道 2015-6-30 23:39
9
0
WRITECOPY肯定不会map到同一个physical address , 而READWRITE也不是同一个 。
对于两个instance来说, 它们都是不同的address

今天又研究了一下, 做个总结。

首先, 我犯了个错误, 那就是WRITECOPY对于编程来说, 是弄不出来的。
无论是VirtualAlloc还是VirtualProtect都不支持。
我用VirtualProtect把一处函数地址修改为PAGE_EXECUTE_WRITECOPY 返回为TRUE , 就以为成功了。
而事实上, 后来再去查询结果是PAGE_EXECUTE_READWRITE
所以, 我们可以忘掉WRITECOPY , 这个只能是linker能做出来, 我们程序员做不出来。

那么什么时候生成文件中会有WRITECOPY的section呢?
我编程扫描了一下, 发现了.textbss 这个section是PAGE_EXECUTE_WRITECOPY , 查了一下, 这个是在linker里面, 开启incremental linking之后, 由linker生成的。
这个section是最容易找到的WRITECOPY , 至少我目前不知道其他任何方式能够生成WRITECOPY的page
游客
登录 | 注册 方可回帖
返回