十字星

  • 首页
  • 技术
  • 随笔
  • 瞎折腾
  • 平面设计
  • 文集
  • 留言
  • 其他
    • API测试
  1. 首页
  2. 技术
  3. 正文

管理员收不到普通权限的SendMessage消息

2022-04-19 1619点热度 0人点赞 0条评论

windows用户界面特权隔离
  一个运行在较低特权等级的应用程序的行为就受到了诸多限制,它不可以:
  验证由较高特权等级进程创建的窗口句柄
  通过调用SendMessage和PostMessage向由较高特权等级进程创建的窗口发送Windows消息
  使用线程钩子处理较高特权等级进程
  使用普通钩子(SetWindowsHookEx)监视较高特权等级进程
  向一个较高特权等级进程执行DLL注入
  但是,一些特殊Windows消息是容许的。因为这些消息对进程的安全性没有太大影响。这些Windows消息包括:

  0x000 - WM_NULL
  0x003 - WM_MOVE
  0x005 - WM_SIZE
  0x00D - WM_GETTEXT
  0x00E - WM_GETTEXTLENGTH
  0x033 - WM_GETHOTKEY
  0x07F - WM_GETICON
  0x305 - WM_RENDERFORMAT
  0x308 - WM_DRAWCLIPBOARD
  0x30D - WM_CHANGECBCHAIN
  0x31A - WM_THEMECHANGED

修复UIPI问题
  基于Windows Vista之前的操作系统行为所设计的应用程序,可能希望Windows消息能够在进程之间自由的传递,以完成一些特殊的工作。当这些应用程序在Windows 7上运行时,因为UIPI机制,这种消息传递被阻断了,应用程序就会遇到兼容性问题。为了解决这个问题,Windows Vista引入了一个新的API函数ChangeWindowMessageFilter。利用这个函数,我们可以添加或者删除能够通过特权等级隔离的Windows消息。这就像拥有较高特权等级的进程,设置了一个过滤器,允许通过的Windows消息都被添加到这个过滤器的白名单,只有在这个白名单上的消息才允许传递进来。
  如果我们想容许一个消息可以发送给较高特权等级的进程,我们可以在较高特权等级的进程中调用ChangeWindowMessageFilter函数,以MSGFLT_ADD作为参数将消息添加进消息过滤器的白名单。同样的,我们也可以以MSGFLT_REMOVE作为参数将这个消息从白名单中删除。例如:
在接收消息的主窗口中添加如下调用即可。

const int WM_COPYDATA = 74; 
/// <summary> 
/// 添加消息到过滤器,这相当于允许接收该消息。 
/// </summary> 
int MSGFLT_ADD = 1; 
/// <summary> 
/// 从过滤器中移除消息。这相当于阻止该消息。 
/// </summary> 
int MSGFLT_REMOVE = 2; 
[DllImport("user32")] 
static extern bool ChangeWindowMessageFilter(uint msg, int flags);

private void MainForm_Load(object sender, EventArgs e)
{//启动时添加到过滤器
    ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);
}

private void Form8_FormClosed(object sender, FormClosedEventArgs e)
{//关闭时从过滤器移除
    ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_REMOVE);
}

 

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: C# WinAPI WinForm
最后更新:2022-04-19

cxw

技术宅,最喜瞎折腾.

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

最新 热点 随机
最新 热点 随机
git迁移项目中的某个目录到新项目 winform判断设计模式还是运行时模式 C# 中的where T : class, new() 到底是什么意思? 解决安装.NET失败并提示“无法建立到信任根颁发机构的证书链” 关闭.net4.0的http访问默认代理 删除名称最后带空格的文件夹
_STORAGE_WRITE_ERROR 类型错误 C# 控件首次显示时,[Anchor]属性影响动态计算控件位置 Esxi总是会话超时需要重新登录,修改配置,增加超时时间 针对上一篇《单例模式基类如何初始化子类》中有关线程启动停止的优化 Oracle 数据库clob字段空值判断 git迁移项目中的某个目录到新项目
标签聚合
工具 Linux PHP C# CentOS WordPress Excel WinForm W10 IT
最近评论
admin 发布于 4 年前(01月22日) 使用Andi Dittrich作者的插件Enlighter实现
alex 发布于 4 年前(01月22日) 博主,请问把代码贴到博客里可以复制是怎么实现的

COPYRIGHT © 2021 十字星. ALL RIGHTS RESERVED

Theme Kratos Made By Seaton Jiang