十字星

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

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

2022-04-19 1632点热度 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

技术宅,最喜瞎折腾.

点赞
< 上一篇
下一篇 >

文章评论

取消回复

最新 热点 随机
最新 热点 随机
git迁移项目中的某个目录到新项目 winform判断设计模式还是运行时模式 C# 中的where T : class, new() 到底是什么意思? 解决安装.NET失败并提示“无法建立到信任根颁发机构的证书链” 关闭.net4.0的http访问默认代理 删除名称最后带空格的文件夹
自定义日历控件环境VS2019+NET4.6.1 [转载]7Z命令行解压缩 C#里判断文件和文件夹是否存在 WinForm中在窗体的Load事件中使用Focus()设置焦点却始终不生效解决方法 C#程序退出托盘图标NotifyIcon不会自动消失的解决方法 [转]安装中文VS2008 SP1和。NET3.5SP1后智能提示是英文的解决办法
标签聚合
Linux MySQL WinForm IT Excel C# WordPress W10 CentOS PHP
最近评论
alex 发布于 4 年前(01月22日) 博主,请问把代码贴到博客里可以复制是怎么实现的

COPYRIGHT © 2021 十字星. ALL RIGHTS RESERVED

THEME KRATOS MADE BY VTROIS

京ICP备2020032489号-2