翻译《The Old New Thing》- What were ShellExecute hooks designed for?

What were ShellExecute hooks designed for? - The Old New Thing (microsoft.com)icon-default.png?t=N7T8https://devblogs.microsoft.com/oldnewthing/20080910-00/?p=20933

Raymond Chen 2008年09月10日


ShellExecute 钩子是为什么设计的?

简要

ShellExecute钩子设计用于扩展可执行字符串集合,如使IE能通过"运行"对话框打开网址。滥用此钩子进行安全检查或审计,不仅违背设计初衷,也可能因其他钩子或直接调用CreateProcess而失效。

正文

        Windows 95引入了(Windows Vista移除了)ShellExecute钩子的概念。这些是实现了IShellExecuteHook接口的对象。该接口只有一个方法:IShellExecuteHook::Execute,它接收一个SHELLEXECUTEINFO结构体,并返回S_OK表示项目已执行,返回S_FALSE允许继续处理,以及返回一个错误代码以停止处理。

        Shell执行钩子的预期用途是允许你扩展可以执行的字符串集合。例如,Internet Explorer 1使用了一个Shell执行钩子,这样你就可以在"运行"对话框中输入http://www.microsoft.com/并调用Web浏览器。这是必要的,因为最初的Windows 95版本对URL没有特殊了解。如果没有钩子,输入URL到"运行"对话框将会产生一个错误。

        让我们再次看看那些返回值。最简单的返回值是S_FALSE,这意味着你没有识别该项目并希望继续正常处理。返回S_OK意味着你识别了该项目并成功执行了它。返回一个错误代码意味着你识别了该项目,但在尝试执行时发生了错误。返回错误会停止进一步处理,这在这种情况下很重要,因为你确实想要停止处理:你识别了用户尝试做的事情,但你无法做到。如果你返回了S_FALSE,那么Shell(和其他Shell执行钩子)会尝试执行该项目。由于这是只有你识别的东西,它们会失败,并且用户会得到某种错误,如“文件未找到”,而不是准确描述为什么你无法执行该项目的错误。

        这就是理论,但我已经看到一些应用程序将Shell执行钩子用于完全不同的目的。它们注定要失败。一个应用程序安装了一个Shell执行钩子以实现某种奇怪的“安全”概念。当他们的钩子被调用时,它们会检查用户是否“被允许”运行程序;如果允许,它们返回S_FALSE,如果被阻止,它们返回E_ACCESSDENIED。另一个应用程序使用他们的钩子来记录用户运行的所有程序,大概是为了让日志可以用于审计目的。记录操作后,它们返回S_FALSE以允许正常执行继续。

        这两种方法都是对Shell执行钩子模型的滥用,因为它们并没有扩展Shell可以执行的项目集合。它们只是使用钩子模型将一些代码潜入执行路径。但这也是问题所在。

        首先,它们只拦截通过ShellExecuteEx函数进行的操作。如果有人直接调用CreateProcess,那么Shell执行钩子就不会运行,那么刚刚绕过了你的“安全”和“审计”系统。

        其次,这些钩子都假设它们是系统中唯一的Shell执行钩子。(记住,可以有多个。)假设系统中安装了三个钩子,由Internet Explorer安装的用于处理URL的钩子,"审计"钩子和"安全"钩子,假设Shell决定按这个顺序调用它们。(钩子执行的顺序未指定,因为如果你按预期使用它们,顺序并不重要。)如果用户在"运行"对话框中输入一个URL,URL钩子启动Web浏览器并返回S_OK表示,“我处理了这个。”你的“审计”钩子从未看到过URL,你的“安全”钩子从未有机会拒绝操作。位于“安全”钩子前面的钩子不仅可以绕过安全,而且还能逃避“审计”钩子。

        “审计”和“安全”就此泡汤。

侧边栏

        由于Shell执行钩子实际上成为ShellExecute函数的一部分,它们无意中受到ShellExecute必须遵循的所有应用程序兼容性约束的限制。欢迎来到操作系统。你的世界刚刚变得更加复杂。

        没有“应用程序兼容性约束列表”(哦,如果有,生活会变得多么简单);基本上,ShellExecute过去做的任何事情都是事实上的兼容性约束。一些程序如果在ShellExecute内部创建工作线程就会崩溃;其他程序如果在ShellExecute内部调用PeekMessage就会崩溃。一些程序调用ShellExecute然后立即退出,这意味着你的Shell执行钩子最好在工作完成之前(或至少在工作已经交给另一个进程完成之前)不要返回。一些程序在异常小的堆栈上调用ShellExecute,所以你需要注意你的堆栈使用。即使文档中指出程序不应该在DllMain内部调用Shell函数,但这并不能阻止人们尝试。你的Shell执行钩子在被调用到这种“不可能”的条件下,最好以一种理智的方式表现。

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

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

相关文章

Python中的“点阵字体”

“点阵字体”是个啥?,在python中怎么使?在现在全面高清的 5 G 5G 5G时代,它还有用“武”之地? (笔记模板由python脚本于2024年06月01日 18:44:31创建,本篇笔记适合会基本编程的coder翻阅) 【学习的细节是欢…

一文搞懂DevOps、DataOps、MLOps、AIOps:所有“Ops”的比较

引言 近年来,“Ops”一词在 IT 运维领域的使用迅速增加。IT 运维正在向自动化过程转变,以改善客户交付。传统的应用程序开发采用 DevOps 实施持续集成(CI)和持续部署(CD)。但对于数据密集型的机器学习和人…

网络隔离后的跨网投递需求,要这样做才能让需求落地

为了保护企业的核心数字资产、隔离有害的网络安全威胁、保障数据信息在可信网络内进行安全交互,越来越多的企业在网络建设时,选择进行网络隔离。应用较为普遍的网络隔离手段包括物理隔离、协议隔离、应用隔离等,而常见的状态是企业进行内部网…

Lab_ Finding and exploiting an unused API endpoint

https://portswigger.net/web-security/learning-paths/api-testing/api-testing-identifying-and-interacting-with-api-endpoints/api-testing/lab-exploiting-unused-api-endpoint# 查看功能点: 在Burp的HTTP history中发现 /api路径 我们先尝试一下将API请求…

全网最全!场外个股期权的询价下单流程的详细解析

场外个股期权的询价下单流程 场外个股期权交易,作为在交易所外进行的个性化期权交易方式,为投资者提供了更加灵活和定制化的交易选择。以下是场外个股期权询价下单流程的详细步骤: 文章来源/:财智财经 第一步:明确交…

STM32——ADC篇(ADC的使用)

一、ADC的介绍 1.1什么是ADC ADC(Analogto-Digital Converter)模拟数字转换器,是将模拟信号转换成数字信号的一种外设。比如某一个电阻两端的是一个模拟信号,单片机无法直接采集,此时需要ADC先将短租两端的电…

AI日报|文生语音大模型国内外均有突破,Pika完成6亿新融资,视频大模型也不远了!

文章推荐 AI搜索哪家强?16款产品实战测评,效率飙升秘籍! AI日报|智谱AI再降价,同时开源9B系列模型;国内外气象大模型竞逐升级 字节推出文本到语音模型家族Seed-TTS:擅长情感表达,…

短视频矩阵系统----可视化剪辑独立开发(采用php)

短视频矩阵系统源头技术开发: 打磨短视频矩阵系统的开发规则核心框架可以按照以下几个步骤进行: 明确系统需求:首先明确系统的功能需求,包括短视频的上传、编辑、发布、播放等环节。确定系统的目标用户和主要的使用场景&#xff…

C++三大特性之继承,详细介绍

阿尼亚全程陪伴大家学习~ 前言 每个程序员在开发新系统时,都希望能够利用已有的软件资源,以缩短开发周期,提高开发效率。 为了提高软件的可重用性(reusability),C提供了类的继承机制。 1.继承的概念 继承: 指在现有…

鸢尾花分类和手写数字识别(K近邻)

鸢尾花分类 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split import pandas as pd import mglearn# 加载鸢尾花数据集 iris load_iris() X_train, X_test, y_train, y_test train_test_split(iris.data,iris.target,test_siz…

免费分享一套SpringBoot+Vue校园论坛(微博)系统【论文+源码+SQL脚本】,帅呆了~~

大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue校园论坛(微博)系统,分享下哈。 项目视频演示 【免费】SpringBootVue校园论坛(微博)系统 Java毕业设计_哔哩哔哩_bilibili【免费】SpringBootVue校园论坛(微博)系统 Java毕业设计…

数据中心网络架构设计与优化

数据中心是现代企业和组织的核心基础设施,它们用于存储、处理和传输大量的数据和信息。为了满足不断增长的数据需求和提供可靠的服务,设计和优化数据中心网络架构至关重要。 首先,数据中心网络架构设计需要考虑可扩展性。随着业务的增长&…

[Bug]使用Transformers 微调 Whisper出现版本不兼容的bug

错误的现象 ImportError Traceback (most recent call last) <ipython-input-20-6958d7eed552> in () from transformers import Seq2SegTrainingArguments training_args Seq2SeqTrainingArguments( output_dir"./whisper-small-…

【全开源】防伪溯源一体化管理系统源码(FastAdmin+ThinkPHP+Uniapp)

&#x1f50d;防伪溯源一体化管理系统&#xff1a;守护品质&#xff0c;追溯无忧 一款基于FastAdminThinkPHP和Uniapp进行开发的多平台&#xff08;微信小程序、H5网页&#xff09;溯源、防伪、管理一体化独立系统&#xff0c;拥有强大的防伪码和溯源码双码生成功能&#xff0…

从零开始学JAVA

一、编写Hello world程序 public class JavaMain1 {//主程序执行入口&#xff0c;main方法public static void main(String[] args){System.out.println("Hello world!");} } 运行结果 Hello world! java编写主程序常见错误&#xff1a; 1、System ---首字母没有…

使用Aspose技术将Excel转换为PDF

简介&#xff1a;本文将介绍如何使用Aspose技术将Excel文件转换为PDF格式。我们将使用Aspose-Cells-8.5.2.jar包&#xff0c;并演示Java代码以及进行测试。 一、Aspose技术概述 Aspose是一款强大的文档处理库&#xff0c;支持多种编程语言&#xff0c;如Java、C#、Python等。…

工程力学 - 课程导论

工程力学是工程学科中的核心基础课程&#xff0c;专注于研究物体在外力作用下的运动规律和受力情况。它涵盖了静力学、运动学、动力学和材料力学等关键领域&#xff0c;为工程结构的安全性、稳定性和功能性提供理论支撑。通过理论分析、实验测定和计算机模拟等方法&#xff0c;…

MyEclipse新手使用介绍

目录 1.MyEclipse诞生背景 2.作用 3.版本历史 4.优缺点 5.应用场景 6.如何使用 6.1.下载与安装 6.2.MyEclipse 菜单及其菜单项 7.创建和发布一个 Java 程序 7.1.创建 Java 程序 7.2.发布 Java 程序 8.示例 8.1. Hello World 示例 8.2. 简单Spring Boot 应用 8.3…

SpringBoot实现发送邮件功能

目录 一、开启邮件服务 二、导入pom依赖 三、配置yml文件 四、发送邮件 4.1、发送文字邮件 4.2、发送html邮件 4.3、发送附件邮件 4.4、发送图片邮件 一、开启邮件服务 这里拿QQ邮箱举例。 翻到下面进行开启,之后获取授权码。 二、导入pom依赖 <dependency><…

问题:明朝统辖西域的主要措施有( )(2.0分) (多选题) #学习方法#微信#经验分享

问题&#xff1a;明朝统辖西域的主要措施有( )(2.0分) (多选题) A.设立哈密卫 B.册封各地的首领 C.都护统领 D.布局要地 参考答案如图所示