跨进程内存空间的读写.DOC

上传人:国*** 文档编号:968845 上传时间:2018-11-10 格式:DOC 页数:9 大小:461.50KB
下载 相关 举报
跨进程内存空间的读写.DOC_第1页
第1页 / 共9页
跨进程内存空间的读写.DOC_第2页
第2页 / 共9页
跨进程内存空间的读写.DOC_第3页
第3页 / 共9页
跨进程内存空间的读写.DOC_第4页
第4页 / 共9页
跨进程内存空间的读写.DOC_第5页
第5页 / 共9页
点击查看更多>>
资源描述

1、 跨进程内存空间的读写通常,跨进程读写内存,用到 ReadProcessMemory, WriteProcessMemory, 但需要进程句柄,如果目标进程受到保护,可能获得进程句柄会失败.不同的进程的虚拟地址被映射到了物理内存中不同的页面.每个进程的虚拟地址的范围是相同的,但是实际的映射却是物理内存内中的不同部分.假如我们直接读取目标进程的虚拟地址映射的物理地址,是否可以达到预期的要求.当然这是肯定的,!Windwos 是基于分页的,那要读取物理内存 ,首先虚拟地址通过页目录,页表等将虚拟地址转换为物理地址.,以下没有对缺页进程处理,对于缺页处理还不是很熟悉!首先要获得目标进程的 cr3 寄

2、存器,即页目录基地址( 开启 PAE, 页目录指针表), 每个进程在内核里都有一个 EPROCESS 结构.nt!_EPROCESS+0x000 Pcb : _KPROCESS+0x06c ProcessLock : _EX_PUSH_LOCK+0x070 CreateTime : _LARGE_INTEGER+0x078 ExitTime : _LARGE_INTEGER+0x080 RundownProtect : _EX_RUNDOWN_REF.Pcb 中就有我们想要得到的 CR3nt!_KPROCESS+0x000 Header : _DISPATCHER_HEADER+0x010 P

3、rofileListHead : _LIST_ENTRY+0x018 DirectoryTableBase : 2 Uint4B+0x020 LdtDescriptor : _KGDTENTRY+0x028 Int21Descriptor : _KIDTENTRY那只需要获得目标进程 EPROCESS 就可以得到 CR3 了假定目标进程就是当前进程, 可以遍历 EPROCESS 里的 ActiveProcessLinks 的链表获取指定进程的 EPROCESS/ 获得 EPROCESS信息ULONG uEprocess = 0;_asmmov eax, fs:0x124 / _ethreadm

4、ov eax, eax+0x44 / _kprocessmov uEprocess, eaxnt!_ETHREAD+0x000 Tcb : _KTHREAD.nt!_KTHREAD+0x000 Header : _DISPATCHER_HEADER+0x034 ApcState : _KAPC_STATEnt!_KAPC_STATE+0x000 ApcListHead : 2 _LIST_ENTRY+0x010 Process : Ptr32 _KPROCESS 这就是我们需要的 ERPOCESS 了获得了 CR3,接下来,就是根据分页机制,把虚拟地址转换为物理地址勒 .在转换之前要判断是否开

5、启 PAE,非 PAE 和开启 PAE 的转换有所不同控制寄存器 CR4 的第 5 位标记是否开启 PAE/ 获得CR4的值_asm_emit 0x0F _emit 0x20_emit 0xE0mov uCR4, eax未开启 PAE 情况通过 CR3 寄存器定位到页目录的基地址线性地址的高 10 位作为获取页目录表项的索引, 获得一个页目录的一个表项注: windows 的保护实现基本不使用分段机制,主要是通过分页机制来实现保护,这里的就线性地址等于虚拟地址,这是我的一点理解,可能有误,!/ 获得页目录表项(PDE)dwPageDirIndex = (dwVirtualAddr DWORD

6、dwPageDirEntry = ReadPageDirEntryNoPAE(dwPageDirIndex);if (dwPageDirEntry = 0)return;根据PDE获得页表基地址或者页基地址当没有开启PAE时,有两种PDE格式, 分别指向4KB的页表,和4MB的内存页页目录项的第7位判断页大小/ 获得页大小DWORD CReadMemoryDlg:GetPageSizeNoPAE(DWORD dwAddr)if (dwAddr elsereturn KBSIZE;4KB时, 页目录项的高20位为页表基地址.线性地址的12位到21位作为选取页表的一个表项.(PTE)dwPageT

7、ableIndex = (dwVirtualAddr DWORD dwPageTableBaseAddr = dwPageDirEntry / 获得页表DWORD dwPageTable = ReadPageTableNoPAE(dwPageTableBaseAddr, dwPageTableIndex);if (dwPageTable = 0)return;if (IsPresentNoPAE(dwPageTable) = FALSE)return;取PTE的高20位,作为内存页的基地址,线性地址的低12作为页中偏移得到物理地址/ 页的基地址DWORD dwPageBaseAddr = dw

8、PageTable dwPageOffset = dwVirtualAddr 这时获得的物理地址就是想要的目标进程虚拟地址的映射的物理地址PVOID pReadBuf = new BYTEdwReadSize;BOOL bRet = ReadPageMemoryNoPAE(pReadBuf, dwPageOffset, dwReadSize, dwPageBaseAddr);if (bRet = FALSE)return;4MB时,页目录项的高10位作为页的基地址, 线性地址的低22位在物理地址在页中的偏移/ 线性地址的低22位是页内偏移DWORD dwPageOffsetMB = dwVir

9、tualAddr / 高10位,是页基地址DWORD dwPageBaseAddr = dwPageDirEntry 这时获得的物理地址就是想要的目标进程虚拟地址的映射的物理地址PVOID pReadBuf = new BYTEdwReadSize;BOOL bRet = ReadPageMemoryPAE(pReadBuf, dwPageOffsetMB, dwReadSize, dwPageBaseAddr);if (bRet = FALSE)return;开启 PAE 情况CR4中的物理地址扩展(PAE)标志可以开启PAE机制,将物理地址从32位扩展到36位.当开始PAE机制后,处理器支

10、持两种尺寸的页:4KB和2Mb的页.增加了页目录指针表项.表项的大小从32位增加到了64位表项中的物理基地址扩展到了24位寄存器CR3中的高位页目录基地址被换为27位的页目录指针表基地址通过CR3寄存器定位到页目录指针表起始地址,取线性地址的高2位作为选取页目录指针表项的索引DWORD dwDirPointerTableIndex = (dwVirtualAddr DWORD dwDirPointerTableBaseAddr = m_nDirBase / 获得页目录指针表_int64 nPageDirPointerTable = ReadPageDirPAE(dwDirPointerTabl

11、eIndex, dwDirPointerTableBaseAddr);if (nPageDir = 0)return;取线性地址的第21位到29位作为页目录索引,页目录指针表项的第12位到第35位为页目录基地址/ 页目录基地址DWORD dwDirBaseAddr = (DWORD)(nPageDirPointerTable / 页目录项索引DWORD dwPageDirIndex = (dwVirtualAddr _int64 nPageDirEntry = ReadPageDirEntryPAE(dwPageDirIndex, dwDirBaseAddr);if (nPageDirEntr

12、y = 0)return;根据页目录项的第7位判断页大小,2MB,还是4KB/ 获得页大小DWORD CReadMemoryDlg:GetPageSizePAE(_int64 nAddr)if (nAddr elsereturn KBSIZE;4KB时,页目录项的第12位到35位作为页表基地址的高24位.取线性地址第12位到20位作为在页表中的偏移/ 获得页表DWORD dwPageTableBaseAddr = (DWORD)(nPageDirEntry DWORD dwPageTableIndex = (dwVirtualAddr _int64 nPageTable = ReadPageT

13、ablePAE(dwPageTableIndex, dwPageTableBaseAddr);if (nPageTable = 0)return;通过页表项的第12位到第35位作为页基地址的高24位,线性地址的低12为作为在页中的偏移/ 读取页内容DWORD dwPageBaseAddr = (DWORD)(nPageTable DWORD dwPageOffsetKb = dwVirtualAddr PVOID pReadBuf = new BYTEdwReadSize;BOOL bRet = ReadPageMemoryPAE(pReadBuf, dwPageOffsetKb, dwRea

14、dSize, dwPageBaseAddr);if (bRet = FALSE)return;所得到的内容就是目标进程虚拟地址内存的数据2MB时, 页目录项的第21位到35位作为页的基地址的高位,取线性地址的第0位到第20位做为物理地址在页中的偏移DWORD dwPageOffsetMB = dwVirtualAddr / 高-35位DWORD dwDirBaseAddr = (DWORD)(nPageDirEntry PVOID pReadBuf = new BYTEdwReadSize;BOOL bRet = ReadPageMemoryPAE(pReadBuf, dwPageOffsetMB, dwReadSize, dwDirBaseAddr);if (bRet = FALSE)return;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 重点行业资料库 > 1

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。