翻译《The Old New Thing》- The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag

The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag - The Old New Thing (microsoft.com)icon-default.png?t=N7T8https://devblogs.microsoft.com/oldnewthing/20071128-00/?p=24353

Raymond Chen 2007年11月28日


FORMAT_MESSAGE_IGNORE_INSERTS 标志的重要性

简要

文章讨论了使用FormatMessage函数获取Win32错误代码对应的错误消息时,必须使用FORMAT_MESSAGE_IGNORE_INSERTS标志,以避免因消息中的插入序列导致的潜在错误和安全风险。

 

正文

        你可以使用 FormatMessage 函数,并带上 FORMAT_MESSAGE_FROM_SYSTEM 标志,以指明你传递的消息编号是一个错误代码,并且消息应该在系统消息表中查找。这是一个更具体情况的特例,即你不能控制消息内容,而当你不能控制消息内容时,你最好传递 FORMAT_MESSAGE_IGNORE_INSERTS 标志。

        让我们看看如果你不这么做会发生什么。

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
int __cdecl main(int argc, char **argv)
{TCHAR buffer[1024];DWORD dwError = ERROR_BAD_EXE_FORMAT;DWORD dwFlags = FORMAT_MESSAGE_FROM_SYSTEM;DWORD dwResult = FormatMessage(dwFlags, NULL, dwError,0, buffer, 1024, NULL);if (dwResult) {_tprintf(_T("Message is \"%s\"\n"), buffer);} else {_tprintf(_T("Failed! Error code %d\n"), GetLastError());}return 0;
}

        如果你运行这个程序,你会得到:

Failed! Error code 87

 

        错误 87 是 ERROR_INVALID_PARAMETER(无效参数错误)。出了什么问题呢?

让我们传递 FORMAT_MESSAGE_IGNORE_INSERTS 标志来看看消息是什么。

        将 dwFlags 的值更改为:

DWORD dwFlags = FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS;

        再次运行程序。这次你会得到:

Message is "%1 is not a valid Win32 application."

 

        啊哈,现在我们看到了问题所在。

        对应 ERROR_BAD_EXE_FORMAT 的消息包含一个插入符 %1

        如果你不传递 FORMAT_MESSAGE_IGNORE_INSERTS 标志,FormatMessage 函数将会在参数列表(或参数数组)中插入第一个参数。但我们没有传递参数列表,所以函数失败了。

        实际上,我们很幸运。

        如果我们传递了参数列表或参数数组,函数会插入相应的字符串,即使我们传递的参数列表中第一个位置没有字符串。

        如果你不能控制格式字符串,那么你必须传递 FORMAT_MESSAGE_IGNORE_INSERTS 来防止 %1 造成麻烦。

        如果有人特别恶劣,他们可能会决定给你一个包含 %9 的格式字符串,这几乎可以肯定是你提供的插入符数量的多倍。

        结果是缓冲区溢出,很可能是崩溃。

        这对一些人来说可能是显而易见的,就像你不应该传递你不能控制的字符串作为 printf 函数的格式字符串一样,但我觉得有必要提一下。

        凌晨 2 点

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

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

相关文章

评估企业的业务是否存在高风险的六个步骤

风险的幽灵使得组织别无选择&#xff0c;只能改善各种网络风险的总体管理。以下是一个基于信息安全论坛的IRAM2方法论的分步过程&#xff0c;网络安全和风险从业者可以利用它来评估和管理信息风险。 第1步&#xff1a;范围界定练习 范围界定练习的目标是提供一个以业务为中心…

基于springboot+vue的招聘信息管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

K8s的常用命令以及yaml文件的创建

目录 一、声明式管理方法&#xff1a;YAML文件 1、yaml文件简介 2、yaml和json的主要区别&#xff1a; 3、YAML的语法格式 4、yaml文件组成部分 ①控制器定义 5、查看api资源版本标签 6、编写nginx-deployment.yaml资源配置清单 6.1创建资源对象 6.2查看创建的pod资源…

使用python将一段文本写入一个txt文件中且先格式化文件名

有一段文本内容&#xff0c;有“标题”和“内容”组成。 任务&#xff1a;要将这段文本&#xff0c;存放到一个txt文件中&#xff0c;文件名为当天的日期加上“标题”内容。因为“标题”内可能有/<>之类的&#xff0c;还需要格式化一下。 已经将上述功能都写成了函数&a…

安卓手机APP开发__近距离无线通信(NFC)概述

安卓手机&#xff21;&#xff30;&#xff30;开发&#xff3f;&#xff3f;近距离无线通信(NFC)概述 概述 近距离无线通信 (NFC) 是一组近距离无线技术&#xff0c;距离通常不超过 4 厘米才能 发起连接。通过 NFC&#xff0c;您可以在 NFC 标签和 Android 设备之间&#xf…

【Redis】 String类型的内部编码与使用环境

文章目录 &#x1f343;前言&#x1f334;内部编码&#x1f384;典型使用场景&#x1f6a9;缓存功能&#x1f6a9;计数&#xff08;Counter&#xff09;功能&#x1f6a9;共享会话&#xff08;Session&#xff09;&#x1f6a9;验证码功能 ⭕总结 &#x1f343;前言 本篇文章重…

Unity-Sprite Atlas+UGUI系统的运行原理

每日一句&#xff1a;别听世俗耳语&#xff0c;看自己的风景就好 目录 SA的原理&#xff1a; SA的优点&#xff1a; SA的缺点&#xff1a; DrawCall是什么&#xff1f; 批处理是什么&#xff1f; 我们先了解一下UGUI系统的运行原理吧&#xff01; 提到图集优化&#xff0…

cocosCreator动态生成二维码

cocosCreator 版本&#xff1a;3.7.2 开发语言&#xff1a;typeScript 我们在游戏开发中&#xff0c;经常会生成一个专属于玩家个人的二维码&#xff0c;比如说推广、充值等功能。 接到这个任务&#xff0c;在网上找了下&#xff0c;还是有很多教程的。但是这些教程大部分都是用…

Ollydbg动态分析MessageBoxA输出hellow world

一、目的 找到main函数找到调用的MessageBoxA函数 测试源码 #include <iostream> #include <windows.h>int main() {MessageBoxA(NULL, "Hellow World", "Title", MB_OK);return 1; }二、快捷键 指令快捷键说明RestartCtrlF2重新开始调试S…

buu[HCTF 2018]WarmUp(代码审计)

buu[HCTF 2018]WarmUp&#xff08;代码审计&#xff09; 题目 访问source.php <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php…

MySQL基础学习: SET FOREIGN_KEY_CHECKS = 0

文章目录 一、介绍二、使用方法三、注意事项 一、介绍 在MySQL中&#xff0c;SET FOREIGN_KEY_CHECKS 0; 是一个特殊的命令&#xff0c;用于临时禁用外键约束检查。这在你执行一些涉及多个表并且可能违反外键约束的批量操作时非常有用。 为什么需要禁用外键约束检查&#xf…

电脑键盘如何练习盲打?

电脑键盘如何练习盲打&#xff1f;盲打很简单&#xff0c;跟着我做&#xff0c;今天教会你。 请看【图1】&#xff1a; 【图1】中&#xff0c;红色方框就是8个基准键位&#xff0c;打字时我们左右手的8个手指就是放在这8个基准键位上&#xff0c;F键和J键上各有一个小突起&…

Spring6基础笔记

Spring6 Log4j2 1、概述 1.1、Spring是什么&#xff1f; Spring 是一款主流的 Java EE 轻量级开源框架 &#xff0c;Spring 由“Spring 之父”Rod Johnson 提出并创立&#xff0c;其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发…

mysql图形化界面及将mysql注册成后台程序

安装图形化界面版本 右键新建数据库 字符集使用utf8防止以后数据库中存在中文字符导致乱码 将mysql注册成后台程序 cmd进入命令行界面 切换路径到cd /mysql/bin 将mysql注册成后台程序 mysqld.exe --install mysql1 (失败&#xff0c;说明没有权限) 以管理员身份打开成功…

ASP.NET防止流量攻击的措施

请求速率限制&#xff1a; // 在 Global.asax.cs 文件中 Application_BeginRequest 方法中添加以下代码 protected void Application_BeginRequest() {// 检查请求频率&#xff0c;限制每个 IP 地址的请求次数if (RequestThrottler.IsRequestLimitExceeded(Context.Request.Use…

如何跨过robots协议的限制爬取内容?

在讨论如何“跨过robots协议的限制爬取内容”之前&#xff0c;重要的是强调遵循网络礼仪和法律法规的必要性。robots协议&#xff08;Robots Exclusion Standard&#xff09;是网站所有者向网络爬虫&#xff08;包括搜索引擎和其他自动化工具&#xff09;传达其爬取意愿的一种方…

SYSTEM文件夹介绍(sys文件夹、deley文件夹、USART 文件夹、SysTick、printf函数、fputc函数、半主机模式)

参考 http://t.csdnimg.cn/P9H6x 一、sys文件夹介绍 在上述介绍的 sys 文件夹中&#xff0c;涉及了一些与系统控制、中断管理、低功耗模式、栈顶地址设置、系统时钟初始化以及缓存配置等相关的函数。以下是对每个功能的简要分析&#xff1a; 1.中断类函数&#xff1a; sys_n…

CCF20230901——坐标变换(其一)

CCF20230901——坐标变换&#xff08;其一&#xff09; #include<bits/stdc.h> using namespace std; int main() {int n,m,x[101],y[101],x1[101],y1[101];cin>>n>>m;for(int i0;i<n;i)cin>>x1[i]>>y1[i];for(int j0;j<m;j)cin>>x[…

uniapp 高德地图与百度地图精准定位,高德地图定位报错

目前我这边测试发现的问题 UNIAPP 获取定位的代码 在这里插入代码片 data的参数 data() {return {id: 0, // 使用 marker点击事件 需要填写idtitle: map,latitude: 39.909,longitude: 116.39742,covers: [{latitude: 39.909,longitude: 116.39742,width: 50,height: 50,iconPa…

负反馈系统中运放的相位裕度仿真、环路增益的stb仿真

这里没目录标题 一、引言二、巴克豪森判据、最坏情况下的相位裕度、相位裕度三、相位裕度与开环&#xff0c;环路&#xff0c;闭环增益的关系四、环路增益、闭环增益和相位的仿真4.1 运放为双入单出时4.1.1 系统的闭环增益4.1.2 stb仿真系统的环路增益和相位裕度&#xff08;环…