百鬼夜行天 发表于 2021-4-21 19:43:34

直接内核对象操作,一种新的驱动写内存的方法。


前言:

以前的一些驱动写内存的方法无法就是切换线程环境,直接写CR3寄存器来切换虚拟内存与物理内存的对应关系等,

内存空间不能跨进程访问的原因主要在于不同进程都有自己的页目录和页表。进程切换的很大一块也就是切换掉页目录。

过程:
我就在这丢个我自己想出来的方法,很烂很烂的.......

不用切换CR3寄存器....

首先我们来看下进程的页目录和页表是存放在哪里的

每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.

nt!_EPROCESS
+0x000 Pcb            : _KPROCESS
+0x06c ProcessLock      : _EX_PUSH_LOCK
+0x070 CreateTime      : _LARGE_INTEGER
+0x078 ExitTime      : _LARGE_INTEGER
+0x080 RundownProtect: _EX_RUNDOWN_REF
..........

_KPROCESS也就是_EPROCESS的头,我们看看这里面放的是什么
nt!_KPROCESS
+0x000 Header          : _DISPATCHER_HEADER
+0x010 ProfileListHead: _LIST_ENTRY
+0x018 DirectoryTableBase : Uint4B

其中DirectoryTableBase放的就是页目录,DirectoryTableBase就是页表了

系统就是根据这里的页表和页目录来进行虚拟内存转换...只要我们在这里做个手脚,嘿嘿。。。。

举例说明:
比如我想写D_F的内存,只需要把一个进程的DirectoryTableBase改成跟D_F的一样,然后直接写那个进程的内存就搞定了.....

详细步骤:
1.创建一个挂起进程 ,成为傀儡进程
2.修改傀儡进程的EPROCESS.Pcb.DirectoryTableBase跟EPROCESS.Pcb.DirectoryTableBase为目标进程的内容
3.直接修改傀儡进程的内存

注意事项:
傀儡进程要关闭时,一定要把原来的EPROCESS.Pcb.DirectoryTableBase给写回来,否则系统会崩溃

此方法比较简单,肯定其他高手早已知道,可能嫌其过于简单,没将其公开.
无奈本人过于愚昧,今日才想到,

如文章有错误,请各位大大指出!

页: [1]
查看完整版本: 直接内核对象操作,一种新的驱动写内存的方法。