ReadProcessMemory可不是一个进程间通信的好方法

news2024/12/23 5:57:01

有时候我看到有人会使用 ReadProcessMemory 这个 API 来实现进程间通信,老实说吧,我觉得这不是一个明智的选择,原因有如下几条。

首先,你不能使用 ReadProcessMemory 来跨越安全上下文 (Security Contexts),至少你需要做一些额外的工作才能做到。如果用户通过 “runas” 来使用另一个用户身份来运行程序,则这两个进程将不能通过 ReadProcessMemory 来进行进程间数据的传输。

我们可以通过调整进程的权限来实现这个功能,具体来说,就是对正在与之通信的进程的所有者授予 PROCESS_VM_READ 权限,但这样会将安全的大门开的太大。使用该用户标识运行的任何进程都会读取到共享的数据,而不仅仅是要与之通信的进程。如果你正在与较低特权的进程进行通信,则只是将数据暴露给你感兴趣的进程以外的较低特权的进程。

更重要的是,一旦授予了 PROCESS_VM_READ 权限,你就会将其授予您的整个进程。该进程不仅可以读取你尝试共享的数据,还可以读取映射到你的地址空间的任何其他内容。它可以读取所有全局变量,可以读取堆,可以从堆栈中读取变量。它甚至可以损坏堆栈的数据结构!

什么?仅仅是授予读取访问权限就损坏堆栈?

如果进程将其堆栈增长到堆栈保护页中,则未经处理的异常筛选器将捕获保护异常并扩展堆栈。但是,当它发生在私有的“捕获所有异常”处理程序(例如 IsBadReadPtr 函数使用的处理程序)中时,它将私下处理,并且不会到达未处理的异常筛选器。结果,堆栈不会增长,不会创建新的堆栈保护页面。当堆栈正常增长到并超过过早提交的保护页的点时,通常的堆栈保护异常现在是访问冲突,导致线程死亡,并可能扩散到随之而来的进程。

你可能认为,可以捕获堆栈访问冲突并尝试干净地关闭线程,但由于多种原因,这是不可能的。首先,结构化异常处理在遇到异常的线程堆栈上执行。如果该线程具有损坏的堆栈,则无法调度该异常,因为异常筛选器想要在其上运行的堆栈不再可行。

即使你可以以某种方式在某种“紧急堆栈”上运行这些异常过滤器,但仍然无法解决问题。在异常点,线程可能处于任何中间d的代码流。也许它是在堆管理器内部,堆锁持有,堆数据结构处于不断变化的状态。为了使进程保持活动状态,需要使堆数据结构保持一致并释放堆锁。但是你不知道该怎么做。

还有许多其他进程间通信机制可供使用。其中之一是匿名共享内存,我几年前讨论过。匿名共享内存仍然存在一个问题,即在与你与之通信的同一令牌下运行的任何进程都可以读取共享内存块,但至少公开的范围仅限于你希望明确想要共享的数据。

(从某种意义上说,没有比这更好的了。你正在与之通信的进程一旦从你那里获得数据,就可以对数据做任何它想做的事情。即使你以某种方式安排了只有目标进程可以访问内存,也没有什么能阻止该目标进程将其复制到共享内存块之外的某个地方,此时任何运行相同令牌的人都可以从目标进程中读取数据。)

总结

目前小僧仅仅使用到了共享内存,惭愧惭愧。
什么邮槽管道剪贴板,我是一个都没有听说过。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《ReadProcessMemory is not a preferred IPC mechanism》

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/618468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud入门实战(八)- Gateway服务网关集成

📝 学技术、更要掌握学习的方法,一起学习,让进步发生 👩🏻 作者:一只IT攻城狮 ,关注我,不迷路 。 💐学习建议:1、养成习惯,学习java的任何一个技术…

macOS Sonoma 14.0 (23A5257q) Beta1 带 OC 引导双分区黑苹果镜像

6月6日,在WWDC2023开发者大会上,苹果带来了全新Mac系统,命名为macOS Sonoma。该系统最大的亮点是带来了小组件,macOS Sonoma可以添加手机上的所有小组件,包括车辆小组件。 镜像下载: 微信公众号&#xff1…

聚观早报 | 苹果发XR头显Vision Pro;英特尔将出售部分Mobileye股票

今日要闻:苹果发XR头显Vision Pro;英特尔将出售部分Mobileye股票;华为已申请注册两枚NETGPT;瑞幸咖啡全国门店数量突破1万家;iPhone15系列本月将在郑州富士康量产 苹果发XR头显Vision Pro 6 月 6 日,苹果 …

从零手写操作系统之RVOS环境搭建-01

从零手写操作系统之RVOS环境搭建-01 背景介绍操作系统的定义操作系统的分类典型的 RTOS 介绍课程系统RVOS简介 Hello WorldQEMU介绍QEMU-virt 地址映射 系统引导引导程序要做哪些事情如何判断当前hart是不是第一个hart?如何初始化栈? 如何在屏幕输出Hello World通过串口输出U…

基于java SpringBoot框架和Vue的智能停车场管理系统

近年来,中国不仅综合国力大幅提升,国民经济也快速增长,推动了中国汽车工业的发展。技术的飞速发展逐渐降低了汽车的制造成本,越来越受欢迎。今天,大多数家庭都有能力购买汽车,因此,中国城市的汽…

R语言手动绘制连续线条的校准曲线(Calibration curve)(4)

校准曲线图表示的是预测值和实际值的差距,作为预测模型的重要部分,目前很多函数能绘制校准曲线。 一般分为两种,一种是通过Hosmer-Lemeshow检验,把P值分为10等分,求出每等分的预测值和实际值的差距。 我们既往已经通…

基于组件化开发思想的微信小程序开发框架

跨端框架的出现为小程序应用的开发带来了巨大的便利性和灵活性。它们提供了统一的开发方式、代码复用的能力,并且与小程序容器技术紧密结合,实现了一次编码、多端运行的目标。开发者可以根据项目需求和团队技术栈选择合适的跨端框架,从而在不…

【大数据工具】Spark 伪分布式、分布式集群搭建

Spark 集群搭建 Spark 安装包下载地址:https://archive.apache.org/dist/spark/ 1. Spark 伪分布式安装 安装前提:安装 Spark 前需要先安装好 JDK 1. 上传并解压 Spark 安装包 使用 fileZilla 或其他文件传输工具上传 Spark 安装包:spar…

简单易懂的 nvm 和 Node.js 版本控制指南

NVM是Node.js的版本管理工具,可以方便地在不同版本的Node.js之间切换。它可以通过命令行或者脚本来管理Node.js的版本,支持在同一台机器上安装多个版本的Node.js,并能够方便地切换它们。 NVM的主要功能包括: 安装和卸载Node.js的不…

2022年国赛高教杯数学建模A题波浪能最大输出功率设计解题全过程文档及程序

2022年国赛高教杯数学建模 A题 波浪能最大输出功率设计 原题再现 随着经济和社会的发展,人类面临能源需求和环境污染的双重挑战,发展可再生能源产业已成为世界各国的共识。波浪能作为一种重要的海洋可再生能源,分布广泛,储量丰富…

DevExpress WinForms v23.1新功能抢先看——支持系统强调色更改

DevExpress WinForm 下一个主要版本(v23.1)将在6月份左右发布,本文将为大家介绍在早期访问预览版(EAP)中包含的新功能。 PS:DevExpress WinForm拥有180组件和UI库,能为Windows Forms平台创建具…

5月琐碎但值得的事情

转眼间时间就来到了6月份,又该写5月的思考总结了,依然记录一些5月份发生的小事或者收获, 这些内容本意给我记录生活的,如果对你有一些帮助就更好了。 往期: 1月的碎碎念,但是很有必要 二月的一些琐事&#…

chatgpt赋能python:Python如何阻止弹窗

Python如何阻止弹窗 Python是一种高级编程语言,它具有广泛的应用和丰富的库。它还可以被用于开发自动化程序,包括阻止弹窗。在本文中,我们将介绍如何使用Python阻止弹出窗口,并探讨防止弹窗的原因。 为什么要防止弹窗&#xff1…

Librosa库——语音识别,语音音色识别训练及应用

很多同学以为语音识别是非常难的,其实并不然,起初我也是这么认为,但后来发现语音识别是最简单的,因为同学们可能不知道Python有一个音频处理库Librosa,这个库非常的强大,可以进行音频处理、频谱表示、幅度转…

精彩回顾 | 来看 QTF 量化科技嘉年华上的 DolphinDB

6月2日至6月3日,2023“量变质变”量化科技嘉年华在上海世博中心圆满举办。 DolphinDB 作为联合主办方,在6月3日上午的“因子挖掘与机器学习”分论坛中,为广大量化粉丝们奉上了一场干货满满的主题分享与圆桌讨论,现场座无虚席&…

直击CACLP:新冠红利退潮,谁在裸泳,谁在冲刺?

5月可谓是很多医疗人马不停蹄的一个月,上海的第87届CMEF刚结束,28至30日,体外诊断(IVD)旗帜性行业盛会——第20届CACLP也在南昌绿地国际博览中心顺利落幕了。 纷享销客已经连续五年参与这两大行业盛会了,…

助力工业物联网,工业大数据之其他维度:组织机构【十五】

文章目录 01:其他维度:组织机构02:其他维度:仓库、物流附录一:常见问题1.错误:没有开启Cross Join2.错误:Unable to move source 01:其他维度:组织机构 目标:…

ChatGPT使用进阶,你一定要知道的应用技巧

鉴于ChatGPT的巨大能力,深入学习ChatGPT使用技巧势在必行。作为伴随着ChatGPT等大语言模型(LLM)出现的还有一个新的工程领域:提示工程(Prompt Engineering)。 提示工程(Prompt Engineering&…

前端053_单点登录SSO_刷新令牌获取新令牌

刷新令牌获取新令牌 1、创建刷新令牌组件2、添加刷新组件路由配置3、EasyMock 添加刷新令牌接口4、定义 Api 调用刷新令牌接口5、Vuex 发送请求与重置状态6、重构刷新令牌组件7、测试当应用系统请求后台资源接口时,要在请求头带上 accessToken 去请求接口,如果 accessToken 有…

【Python】Python系列教程-- Python3 OS 文件/目录方法(二十七)

文章目录 前言语法错误异常异常处理try/excepttry/except...elsetry-finally 语句 抛出异常用户自定义异常定义清理行为预定义的清理行为 前言 往期回顾: Python系列教程–Python3介绍(一)Python系列教程–Python3 环境搭建(二&…