跨进程的本质是"进程挂靠”正常情况下, A进程的线程只能访问A进程的地址空间,如果A进程的线程想访问B进程的地址空间,就要修改当前的Cr3的值为B进程的页目录表基值(KPROCESS.DirectoryTableBase)。

即: mov cr3,B.DirectoryTableBase

跨进程操作

A进制中的线程代码:

mov cr3,B.DirectoryTableBase         //切换Cr3的值为B进程
mov eax,dword ptr ds:[0x12345678]   //将进程B Ox12345678的值存的eax中
mov dword ptr ds[0x00401234],eax    //将数据存储到0x00401234中
mov cr3,A.DirectoryTableBase        //切换回Cr3的值

//此时0x00401234中的数据还有吗?

//如何将数据传递给A进程的变量呢?

NtReadVirtualMemory流程解析:

  1. 切换Cr3
  2. 将数据读复制到高2G
  3. 切换Cr3
  4. 从高2G复制到目标位置

NtWriteVirtualMemory流程解析:

  1. 将数据从目标位置复制到2高2G地址
  2. 切换Cr3
  3. 从高2G复制到目标位置
  4. 切换Cr3

代码

3环

#include<stdio.h>
int main() {char *ch = "Hello world";printf("%c,%x", ch, ch);getchar();printf("%c,%x", ch, ch);getchar();
}

0环

0环#include <ntifs.h>
VOID DriverUnload(PDRIVER_OBJECT pDriver);// 根据PID返回进程EPROCESS,失败返回NULL
PEPROCESS LookupProcess(HANDLE hPid)
{PEPROCESS pEProcess = NULL;if (NT_SUCCESS(PsLookupProcessByProcessId(hPid, &pEProcess)))return pEProcess;return NULL;
}VOID ChangeData(ULONG uId)
{KAPC_STATE ks;//1 根据ID获得进程内核对象PEPROCESS pEprocess = LookupProcess((HANDLE)uId);//2 挂靠到此进程上去//需要注意:不能挂靠之后,将内存中的数据往用户层地址存储,是不对的。//因为当挂靠到目标进程之后,用户层地址就是目标进程的了,也就存储到//目标进程中,而且目标进程的那个地址不一定有效,可能造成崩溃。KeStackAttachProcess(pEprocess,&ks);//3 修改内存char * p = (char *)0x1dfaf0;p[5] = 'h';p[6] = 'a';p[7] = 'h';p[8] = 'a';p[9] = '\0';//4 解除挂靠KeUnstackDetachProcess(&ks);
}NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pPath)
{UNREFERENCED_PARAMETER(pPath);//DbgBreakPoint();ChangeData(1716);pDriver->DriverUnload = DriverUnload;return STATUS_SUCCESS;
}
VOID DriverUnload(PDRIVER_OBJECT pDriver)
{UNREFERENCED_PARAMETER(pDriver);
}

13.跨进程读写内存相关推荐

  1. 进程线程007 进程挂靠与跨进程读写内存

    文章目录 进程挂靠 进程与线程的关系 线程与进程如何关联 为什么需要ApcState.Process CR3的值可以随便改吗 分析NtReadVirtualMemory函数 总结 跨进程读写内存 跨进 ...

  2. android跨进程读写内存,Android 跨进程内存泄露

    内存泄露的检测和修复一直是每个APP的重点和难点,也有很多文章讲述了如何检测和修复.本篇文章 结合最近开发的项目遇到的实例,讲述下Android Binder导致的内存泄露的一个案例. 发现问题 参与 ...

  3. Windows进程与线程学习笔记(九)—— 线程优先级/进程挂靠/跨进程读写

    Windows进程与线程学习笔记(九)-- 线程优先级/进程挂靠/跨进程读写 要点回顾 线程优先级 调度链表 分析 KiFindReadyThread 分析 KiSwapThread 总结 进程挂靠 ...

  4. linux 跨进程读取内存,Android之Linux跨进程通信的方式

    As we all know,Android是基于Linux内核开发的,而市面上几乎所有的App都离开跨进程通信.可能你会说Android是通过Binder完成进程之间的通信的.但是Binder是怎么 ...

  5. VirtualAllocEx 跨进程读写数据 代码注入

    VirtualAllocEx 函数的作用是在指定进程的虚拟空间保留或提交内存区域,除非指定MEM_RESET参数,否则将该内存区域置0. LPVOID VirtualAllocEx(  HANDLE  ...

  6. java 共享内存获取写权限_跨进程访问共享内存的权限问题

    问:我在服务器上用 CreateFileMapping 创建了一段共享内存.让这个exe始终在服务器上跑. 同时,别的用户在客户端用IE访问服务器,将要查询的数据通过C#制作的网页提交上来,服务器得到 ...

  7. python跨进程共享内存

    生成内存地址name # In the first Python interactive shell import numpy as np import time a = np.array([1, 1 ...

  8. php 跨进程读写,php使用多个进程同时控制文件读写示例

    代码如下: /** * 写入数据 * @param  [string] $path [文件路径] * @param  [string] $mode [文件打开模式] * @param  [string ...

  9. 【转载】Windwos CE 跨进程内存注入

    一.程序实现的先决条件 由于windows系统的窗体消息总是投递至一个特定进程的指定窗体消息函数中.于是在本地进程(自己的应用程序)中取得属于其它进程的窗体的消息必须实现以下两个部分: 1.将需要挂接 ...

最新文章

  1. GCC中通过--wrap选项使用包装函数
  2. javascript里的post和get有什么区别
  3. Sklearn参数详解--决策树
  4. 洛谷 P 4180 次小生成树
  5. 捷达vs7测试_捷达VS7——品质硬核!
  6. 【MyBatis框架】MyBatis入门程序第二部分
  7. 如何写出优雅的跨平台的C/C++代码
  8. java python c++比喻图_Java/Python/PHP/C++图文详解它们之间的尿性
  9. Android下图片处理的的一些方法
  10. double im2double mat2gray之一二说
  11. 梯度消失、梯度爆炸产生的原因
  12. WLAN驱动分析文档
  13. Linux的cd ~/.什么意思?
  14. unity怎么显示骨骼_Unity3D 骨骼动画原理学习笔记
  15. MUI初体验 模仿微信页面
  16. python网络爬虫技术课后答案_尔雅《Python网络爬虫技术(2020年秋季学期)》网课答案...
  17. TOEFL wordlist 4
  18. matlab 2016a
  19. 爱情十三课,爱人的五功能
  20. 电视机与计算机共享,终于实现电视与电脑共享了!与大家分享!

热门文章

  1. 成功解决ModuleNotFoundError: No module named 'keras_retinanet.utils.compute_overlap'
  2. DL之RNN:人工智能为你写代码——基于TF利用RNN算法实现生成编程语言代码(C++语言)、训练测试过程全记录
  3. TF之DD:实现输出Inception模型内的某个卷积层或者所有卷积层的形状
  4. nginx+uWSGI+django+virtualenv+supervisor发布web服务器
  5. java计算两地距离(公里)
  6. 【BZOJ】3456: 城市规划(多项式求ln)
  7. __declspec(dllexport)的作用
  8. 使用 matlab 产生GK101任意波数据文件的方法
  9. 如何捕获和分析 JavaScript Error
  10. 自动配置IE代理脚本