首页
社区
课程
招聘
[原创]跨进程内存读取, 附源码
发表于: 2009-6-26 21:24 52862

[原创]跨进程内存读取, 附源码

2009-6-26 21:24
52862
收藏
免费 7
支持
分享
最新回复 (74)
雪    币: 150
活跃值: (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
支持一下,强烈支持!
2009-7-1 10:23
0
雪    币: 195
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
我是初学者,有几个问题想请教:
                RtlCopyMemory((PVOID)pInfo->nMemoryAddr,
                    pWrite, pInfo->nWriteSize);
这一句之前已经用cli指令禁止中断了,那么执行内存拷贝过程中产生的page fault怎么处理?
另外,改变cr3前后的pInfo->nMemoryAddr同一个值代表的含义已经是不一样的吧?
我看Reacos里NtReadVirtualMemory的实现,它会在改变cr3前先生成一个MDL,改变后从该MDL里重新映射一个虚拟地址,所以改变cr3前后虽然虚拟地址的含义已经不同,但指向的物理地址还是同一个,
2009-7-1 12:54
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
28
.......
自己切CR3是相当危险的,当page fault发生过后,关闭被读写的进程会memory management!!!!!!!
2009-7-4 19:08
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
精品绝对的好文章 +1

Mark
2009-7-13 09:58
0
雪    币: 158
活跃值: (43)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
30
多谢共享...
2009-7-13 19:09
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
31
又一个悲剧
太针对了.
2009-7-14 01:08
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
比较深,不适合我,看不懂
2009-7-14 08:37
0
雪    币: 207
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
33
写得不错,深入浅出,再怎么保护也不能对裸内存进行保护.
2009-7-14 21:45
0
雪    币: 86
活跃值: (34)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
34
很不错。。。我先膜拜,再学习
2009-7-16 12:59
0
雪    币: 177
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
35
虚地址转换物理地址也在你的代码中没体现啊,
ReadPageDirEntryXPAE没给出来代码来啊,
实际上在没开启PAE的情况下PDE存放的线性地址是在0xC0300000
开启后PDE存放的地址是0xC0600000,可以通过高11位当索引直接查找
2009-7-17 10:54
0
雪    币: 46
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
支持!!!

辛苦
2009-7-17 11:02
0
雪    币: 95
活跃值: (11)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
37
源码里有阿!
2009-7-17 16:48
0
雪    币: 95
活跃值: (11)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
38
在R3代码中的OnBnClickedReadRing3 函数里实现了虚拟地址转换物理地址,
ReadPageDirEntryXPAE这组函数只是读取计算出的相关物理地址的内容,发帖时并没有将其贴出来,你可以去R3代码的源码里看看,
你说的没体现,应该另一种方法,直接切换CR3,读内存.而与这组ReadPageDirEntryXPAE相关的,是通过CR3的,转换虚拟地址到物理地址,读物理内存获得内容的.你再仔细看看源码.
2009-7-17 17:14
0
雪    币: 558
活跃值: (43)
能力值: ( LV12,RANK:220 )
在线值:
发帖
回帖
粉丝
39
2009-8-14 10:30
0
雪    币: 112
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
40
果然大年。。顶。。。
2009-8-14 13:35
0
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
41
谁能给个调用的源码~
2009-8-14 15:50
0
雪    币: 251
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
42
#pragma alloc_text(PAGE, DispatchDeviceControl))
代码是 paged code
但是却进行 关中断  切换CR3等操作,最有可能的蓝屏代码是 Irql XXXX 或者 Paged Code in Nonpaged Area之类的

WriteMemoryInfo *pInfo =
                    (WriteMemoryInfo *)ExAllocatePool(PagedPool, sizeof(WriteMemoryInfo));
同样在关中断时访问paged pool

另外用户态的地址空间是随时会失效的,不能随便读写
写的时候,关了中断,exception handler 没意义,该蓝屏的时候照样蓝屏
读的时候发生缺页可能不会蓝屏,但是如果这个虚拟地址已经释放掉了,会发生异常,CR3不会被恢复回来,最好的结果是用户态的非法操作。

还有比较有意思的是,假如你刚切换完CR3系统就调度其他线程了,回来后你读的是自己的地址空间。

另外从2003SP1开始貌似\\Device\\PhysicalMemory不再能从用户态用名称打开了
只能由内核态弄个handle给用户态,打开PhysicalMemory还要注意不要造成cache种类不一致
不过对映射到用户态的内存一般没什么问题

还有些问题比如没检查用户态提供的Buffer长度就访问

总之感觉问题不少,主要是同步和Paged/Nonpaged 方面的问题
可以试试弄个checked build 的windows 或者driver verifier
看看 :)
2009-8-15 17:27
0
雪    币: 636
活跃值: (174)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
43
看到过类似的,来个传送门:http://bbs.pediy.com/showthread.php?t=64938
2009-8-18 08:30
0
雪    币: 244
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
44
虽然现在看不懂 但是我认为我一定会搞懂的
2009-9-1 01:03
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
45
慢慢研究 先收藏了~~
我正开始做..就有成品咯·~感谢LZ
2009-9-1 09:02
0
雪    币: 250
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
46
顶楼主,看来科锐真不是盖的啊
2009-9-6 22:12
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
47
很长,很长,对不起啊我看不懂。
2009-9-10 21:24
0
雪    币: 106
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
48
很强,支持源码附带
2009-9-12 20:47
0
雪    币: 112
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
49
狂暴膜拜中
2009-9-12 21:29
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
50
会蓝的,ethread中的eprocess没切过来
2009-9-13 17:54
0
游客
登录 | 注册 方可回帖
返回
//