论文阅读——Shadow Attacks:Hiding and Replacing Content in Signed PDFS

2023-05-16

论文阅读报告

—— Shadow Attacks:Hiding and Replacing Content in Signed PDFS

阅读背景

本次阅读的论文是由Christian Mainka、Vladislav Mladenov和Simon Rohlmann于2021年发表在NDSS的《Shadow Attacks:Hiding and Replacing Content in Signed PDFS》,论文的作者一直致力于PDF文件中安全问题的研究,这篇文章介绍了一种新型的针对PDF文件的攻击方法,称其为影子攻击(Shadow Attacks)。

论文概述

数字签名PDF被广泛利用在合同和发票之中,用于确保内容的真实性和完整性。本文介绍的攻击方法——影子攻击,可以规避所有现有的针对PDF签名保护的对策,破坏数字签名的完整性保护。它是基于PDF规范提供的巨大灵活性进行攻击,因此由这种方法制作的影子文档(Shadow
Document)符合PDF的标准,难以被检测。根据实验,测试的29个PDF查看器中有16个易受到影子攻击(包括最常用的Adobe Acrobat和Foxit Reader)。本文还介绍了可以自动生成影子攻击的工具PDF-Attacker,以及检测工具PDF-Detector。

PDF规范基础

PDF文件结构

如下页图一所示,PDF文件主要有三部分组成。Part1定义Body,其中包含了不同的对象,他们由对象编号标识,个人理解相当于对于这些内容的定义。其中Catalog的对象标识符为1 0,作为根对象,由其链接到其他对象来定义整个PDF结构。Part2定义Xref table,可以理解为对于所有对象的位置的应用,注意可以在这里将未使用的对象显示表示为free,例如Image 9 0对象是free的,它就不会显示在PDF当中。Part3是Trailer,它包含指向前两个对象的引用。

请添加图片描述

增量更新(Incremental Update)

PDF的内容可以修改,在修改后,增量更新将新对象添加到新的PDF主体中,该主体直接附加在前一个Trailer之后。为充分处理新对象,每个增量更新还附加了一个新的Xref表和Trailer。

PDF签名

当对一个PDF文件进行签名后,会使用增量更新创建签名对象并将其附加到文件之中。同样,也可以多次对PDF签名(例如签署多方合同的情形),从而会进行多次的增量更新。用户打开包含PDF签名的PDF后,查看器应用程序会自动验证签名,如果内容已被修改,则会发出警告。

攻击模型

影子攻击的思想模拟于现实中的文件篡改。想象这样一种情形,学校要求学生们往家里寄成绩单,挂了好几门课程的张三导出初始的成绩单后,拿到了教务处盖章,教务处在核对成绩单无误后,在最后一页盖章,之后需要由张三将成绩单寄回家,可是,当张三拿到成绩单后,发现挂科记录在前面几页,于张三修改了这部分内容,然后将其和最后盖章的一页重新装订起来,给家里寄回了一份满绩的成绩单。

拓展到PDF文件,作者发现这种攻击方法也是可以凑效的。

如图2,攻击者在签名前将不可见的部分注入PDF。签名后,攻击者再次操纵已经签名的PDF,使得在不使签名无效的情况下,对PDF的内容进行可见的更改。之后,攻击者把影子文档发送给接收方,接收方则看到的是攻击者修改的内容,而且签名显示是正确的。

请添加图片描述

这种情形的实现,主要是因为PDF应用程序会分析签名后所做的更改,并尝试估计这些更改是否合法。例如,不允许覆盖文档页面上的内容,从而导致无效的签名验证。在本文中,首先分析了PDF应用程序认为哪些更改无害,并滥用这些更改来替换PDF文档中的内容。

本文中主要利用的允许的更改有以下几个部分:

  • 追加新的Xref表和Trailer

  • 覆盖无害对象(比如字体)

  • 更改重叠对象的显示顺序

  • 更改交互式表单

攻击方法

隐藏

此类影子攻击旨在将与受害者相关的内容隐藏在可见层后面。如图3所示,攻击者可以在全页图片“签名以获得奖励!”后面隐藏文本“您已被解雇!”。攻击者一旦收到签名的文档,便会操纵该文档,以使PDF阅读器不再呈现图片。这种攻击方法有两种变体。

请添加图片描述

  • 变体1 通过引用的对象隐藏内容

在此攻击变体中,攻击者创建覆盖对象(例如图像或表单域),并在文档签名后隐藏它们,以显示这些对象下面的内容。有三种不同的漏洞利用方法,它们分别通过恶意图像隐藏内容,通过恶意表单字段隐藏表单字段以及通过恶意表单字段隐藏内容。

首先,攻击者注入一个或多个图像并将其放置在原始内容上。图像可以覆盖整个页面或仅覆盖部分内容,例如数字或文本段落。然后在增量更新中使用相同的对象ID,但将其定义为不同的对象类型。例如,将叠加层类型Image更改为XML/Metadata。此外,添加了一个Xref表,该表指向元数据对象,但保留了叠加层的对象ID。当打开此操作过的文档时,由于无法显示元数据,因此叠加层被隐藏。由于使用增量更新将元数据添加到签名的PDF被认为是无害的,因此签名保持有效。

  • 变体2 按对象顺序隐藏内容

对于两个大小相同且在文档中x-y位置相同的不同表单域,仅显示最后一个域。此外,只要内容没有更改,就可以在增量更新中重新声明相同的表单字段。

在这种攻击方式中,攻击者将shadow
form字段注入到原始未签名文档中,该影子表单字段与要隐藏的内容位于相同的页面位置,但是他们在原始对象之前声明了它们的表单对象。攻击者收到文档后,将附加一个增量更新,该更新将复制并粘贴原始字段和影子表单字段。但是,在这种情况下,他们首先显示原始图像,然后显示影子表单字段。结果,显示了影子表单字段及其值,而不是原始字段。由于对象本身并没有修改,只是它们的声明顺序而已,因此增量更新被认为是无害的。

替换

这种影子攻击主要思想是直接更改先前声明的对象的增量更新。由于不允许对所有类型的对象进行修改,因此攻击者只能更改认为无害的对象,但仍然可以更改文档的可见内容。例如,字体的(重新)定义不会直接更改内容。但是,它会影响所显示内容的视图并使数字或字符交换成为可能。它有两种变体。

请添加图片描述

  • 变体1 默认替换

PDF表单支持不同的输入,例如文本字段,文本区域和单选/选择按钮。表单可以具有默认值,例如预定义的文本。用户可以动态更改这些值并将其存储在PDF文档中。

例如,在PDF的文本字段,有一个文本的默认值和实际值,只要输入了实际值,则默认值就会消失(可以类比输入框中的默认输入,不过PDF中的默认输入显示样式和实际输入相同)。如图4所示,表单字段的实际值包含在名为/V的对象键中默认叠加元素的内容在/BBox对象中定义。首先,攻击者创建一个包含交互式表单的转账传票(PDF1),签名者在签署文档之前完成该表单。攻击者使用默认值初始化某些表单元素。在上图提供的示例中,攻击者将前三个表单字段的值/V设置为Attacker和攻击者的IBAN和BIC。其次,攻击者将默认值(/BBox)设置为unicef并设置相应的IBAN和BIC。只要签名者不关注默认的值,他们就认为正确的值已经预先填充。签名者可以在不更改预填写表单的情况下对PDF进行签名。一旦攻击者收到PDF2,他们就会通过使用不同的值替换存储在/BBox中的默认值来更新文本字段。/V中存储的值保持不变。由于原始文本字段值未更改,而仅默认值发生了更改,因此查看器认为此替换无害。

  • 变体2 覆盖替换

在许多应用程序中,字体被认为是无害的,因此可以在增量更新中定义它们。攻击者可以利用这一漏洞,在文件签名后,攻击者将添加新的字体描述并覆盖以前的字体描述。新的字体描述完全改变了原始文本的显示方式。例如,创建了一个漏洞利用程序,将原始文本US905628 3174 5628 3174的显示方式更改为US01 2345678923456789。由于新字体的定义被认为是无害的,因此验证签名的应用程序不会警告所做的更改。而关于恶意字体,可以通过软件FontForge创建。

隐藏加替换

这一攻击方法是攻击者创建一个影子PDF文档,该文档将发送给签名者。PDF文档中包含了内容不同的另一个文档的隐藏说明。由于签名者无法检测到隐藏的(恶意)内容,因此他们对文档进行签名。签名后,攻击者将收到文档,并仅附加一个启用了隐藏对象的Xref表和Trailer,这样,受害者收到的将是一封显示了隐藏内容的文档。这一攻击方法有两种变体。

请添加图片描述

  • 变体1 更改对象引用

此攻击变体的想法是使用外部参照表将对文档目录(或任何其他隐藏对象)的引用更改为指向影子文档。

如图5所示,攻击者创建一个PDF文件,其中包含两个具有相同objectID(例如4 0 obj)但内容不同的对象:“Sign the document to get a reward!”和“You are fired! Get out immediately”。如上图左侧所示,在Xref表中,引用了看似无害的内容。签名者只能看到此内容并签名PDF文件。攻击者收到签名的PDF后,将添加一个新的Xref表,并将该引用与具有恶意内容“You are fired! Get out immediately”的对象(例如4 0 obj)交换。还添加了新Trailer。由于在指向区域内包含指向已定义对象的Xref表被认为是无害的,因此不会对所做的更改发出警告。签名验证成功。

  • 变体2 更改对象用法

在PDF对象的属性中的Xref表种,可以指定了哪些对象在使用和哪些对象未被使用。通过这种方式,攻击者可以隐藏“使用中”的对象并显示free对象。这可以在不更改对象本身的情况下实现。攻击者只接触Xreft表,但是可以完全更改已签名文档的表示。

PDF-Attacker

本篇论文还介绍了作者团队设计的自动创建影子攻击漏洞的工具集PDF-Attacker,下面简单对此工具加以介绍:

PDF-Attacker是Jupyter Notebook编写的Python脚本程序。这种设计实现了类似于影子攻击所必需的高灵活性。针对每种影子攻击类别的每种攻击变体,创建了一个单独的Jupyter Notebook,以便可以独立研究和扩展所有攻击。

请添加图片描述

如图6所示,PDF-Attacker的工作方式和前文叙述的攻击方式是一致的,作者主要利用了一些PDF的python库,reportlab库提供了许多有用对于表单的攻击功能,pypdf4库可以对PDF对象进行低级别访问,用隐藏和替换攻击。

之后论文总结了PDF-Attacker的配置和漏洞利用的相关库,这部分内容实际上和之前的攻击方式差不多,就不再详述。

效果评估

本文总共找到了29个适用于Windows,macOS和Linux的PDF应用程序进行实验,结果如下表:

请添加图片描述

如上表所示,在29个PDF阅读器中,有16个易受至少一个存在的攻击(●)。对于12个PDF查看器,这三个攻击类别均获得了成功,其中包括了最普遍使用的Foxit Reader和Adobe Acrobat Reader。表中的◐表示有限的漏洞,这表示用户在收到影子文件修改前和修改后的文件都会收到相同的提示,因此用户无法区分是合法修改还是恶意修改。

从结果上看,这项攻击效果十分明显,大多数的PDF阅读器都遭到沦陷,可见这个攻击方式的普适性极高。

论文总结

PDF签名旨在保护PDF的完整性和真实性。与传统的数字签名本质上的用例仅在目标上应用一次签名不同,PDF允许在没有使签名无效的情况下更新已签名的文档,但仅在特定情况下才可以。此外,PDF可以连续签名几次。

本文展示了如何在不使签名无效的情况下滥用这种灵活性来替换PDF的整个内容,发现29个应用程序中有16个是易受攻击的。

对于这一问题,本文在当前的PDF规范中找到原因:(1)当前规范没有精确描述如何执行签名验证。(2)它没有记录案例,也没有提出解决方案或指南,因此开发人员必须自行解决这些问题。(3)PDF规范需要考虑功能的丰富性,这会削弱安全性,所以它需要在密码保护方面应用更严格的限制和更有限的处理。

个人拓展

在阅读了本篇论文后,我对于文章使用的具体方法感到十分好奇,查阅相关资料发现,本文作者Christian Mainka等人将他们的研究成果分享在了网站https://pdf-insecurity.org/上面,其中包含了PDF-Attacker的源码等资料,于是我简单阅读了其中的代码部分并加以注释,浅尝辄止地探索了文中使用的攻击模型。下面是通过引用的对象隐藏内容的攻击实现分析(对照图3):

定义文件引用如下:

malicious_text = "You are fired!" \# 签名前内容

overlay_content = "Sign me to get a reward." \# 覆盖内容

overlay_file = "1_original-document.pdf" \# 初始文件

filename_unsigned = "2_original-document-shadowed.pdf" \# 影子文件

filename_signed = "3_original-document-shadowed-signed.pdf" \# 签名后的影子文件

filename_manipulated1 = "4_original-document-shadowed-signed-manipulated_v2pdf" # 修改后的文件
  • 第一步:准备影子文件(filename_unsigned)

首先是设计原始PDF文件,利用了python的FPDF库,之后是对其进行修改生成影子文件,核心函数_enddoc()的部分内容如下:

pdf = PDF() \#生成了原始pdf

pdf.add_page()

\# Setup hidden Content

pdf.set_font('Arial', 'B', 24)

pdf.cell(20, 30, malicious_text) \# 例如输入 You are fired!

\# 将malicious_filename转换为PNG格式

overlay_image = overlay_file.replace(".pdf", ".png")

with Image(filename=overlay_file, resolution=300) as img:

with Image(width=img.width, height=img.height, background=Color("white")) as bg:

bg.composite(img,0,0)

bg.save(filename=overlay_image)

\# 对影子文件添加覆盖图像

pdf.image(overlay_image,0,0,pdf.w) \# 这里覆盖了整个页面

pdf.set_author("Creator")

pdf.set_title("Sign me")

\# 保存未签名的文件

pdf.output(filename_unsigned, 'F')

print(f"Successfully created {filename_unsigned}")
  • 第二步:签名影子文件

在这一步中,模拟了用户签名文档的步骤,不涉及具体攻击,这一步完成后,得到了签名过的影子文件。

  • 第三步:进行影子攻击

攻击者现在操纵签名的PDF进行攻击时,会创建一个新的PDF,其中包含所有最初签名的数据,然后使用增量更新来隐藏图片。

with open(filename_manipulated2, "wb") as fp:

fp.write(data_signed_pdf)

info_obj = "{:d}".format(objectid_image).encode() +
info_obj[len("{:d}".format(objectid_info)):] \# 这里替换了obj ID

fp.write(info_obj)

fp.write(xref) \# 增加了修改后的xref

fp.write(trailer) \#增加了新的trailer

print(f"Successfully created {filename_manipulated2}"

完成上述操作后,可以得到四个pdf文档,分别是①原始pdf,②影子文档,③签名的影子文档和④执行攻击的影子文档。对比③和④,如7图所示,隐藏了“Signme to get a reward”之后,“You are fired!”浮出水面。

请添加图片描述

补充说明,在这篇论文发表前,作者已经向Foxit Reader等PDF阅读器厂商通报了这一漏洞,现在这一漏洞已经一定程度上得到了解决,如图8所示,在影子文件进行攻击后,Foxit Reader打开时会进行提示发现该文档包含交互式表单域,而且还可以通过检查内容检查,还原到修改前的版本。

请添加图片描述

读后感悟

很久没有这么深入的去研究一篇论文,读完之后觉得非常过瘾,让我感觉到读论文其实没有那么难,论文是学者在向大家讲述他们的研究成果,很多优秀的论文,其内容都是清晰且生动的,除了英文阅读有点费劲外,其实读论文才是研究某个知识前沿最直接最有效的方式。比如这篇论文就一点都不枯燥,作者叙述很清晰具体,使用的例子也有趣形象。

具体到这篇论文,让我深切的感受到,对于一个能供用户使用的程序,它一定是可用性和安全性的折衷,在让其具备丰富的功能的同时,势必会对其安全信造成影响,开发人员要把握好其中的平衡,而安全人员更应该从功能中寻找漏洞,防止不法分子的破坏!
论文其实没有那么难,论文是学者在向大家讲述他们的研究成果,很多优秀的论文,其内容都是清晰且生动的,除了英文阅读有点费劲外,其实读论文才是研究某个知识前沿最直接最有效的方式。比如这篇论文就一点都不枯燥,作者叙述很清晰具体,使用的例子也有趣形象。

具体到这篇论文,让我深切的感受到,对于一个能供用户使用的程序,它一定是可用性和安全性的折衷,在让其具备丰富的功能的同时,势必会对其安全信造成影响,开发人员要把握好其中的平衡,而安全人员更应该从功能中寻找漏洞,防止不法分子的破坏!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

论文阅读——Shadow Attacks:Hiding and Replacing Content in Signed PDFS 的相关文章

  • PR and MR

    GitHub 的 Pull Request 是指什么意思 xff1f 作者 xff1a 知乎用户 链接 xff1a https www zhihu com question 21682976 answer 79489643 来源 xff1a
  • mybatis-plus 之 and()和or()连用

    1 and 方法 span class token class name List span span class token generics span class token punctuation lt span span class
  • 【RTOS论文笔记】A Comparative Analysis of RTOS and Linux Scalability on an Embedded Many-core Processor

    背景 以往对多核实时操作系统的研究主要集中在多核处理器上任务集的可调度性和响应时间分析 同时 xff0c 许多研究人员声称 xff0c 在不久的将来 xff0c 高端嵌入式系统还将包括高性能并行应用程序 xff0c 以支持复杂的任务 xff
  • 【VINS论文翻译】VINS-Mono: A Robust and Versatile Monocular Visual-Inertial State Estimator

    回到目录 写在前面 港科大的VINS Mono作为目前state of the art的开源VIO项目 xff0c 是研究视觉与IMU紧耦合的必读算法 xff0c 网上的论文解读与代码实现也非常丰富 xff08 感谢 xff01 xff09
  • On make and cmake

    你或许听过好几种 Make 工具 xff0c 例如 GNU Make xff0c QT 的 qmake xff0c 微软的MS nmake xff0c BSD Make xff08 pmake xff09 xff0c Makepp xff0
  • 机器学习中的降维与度量学习(reduce dimension and metric learning)

    降维与度量学习 k近邻学习 k近邻 k Nearest Neighbor 简称kNN 学习是一种监督学习方法 其工作机制为 xff1a 在样本中 xff0c 根据距离度量找出训练集中临近的k个样本 xff0c 基于这k个样本进行预测 一般
  • 在除一侧之外的所有侧面上创建 CSS3 框阴影

    我有一个选项卡式导航栏 我希望打开的选项卡有一个阴影 以将其与其他选项卡区分开来 我还希望整个选项卡部分有一个向上的阴影 参见底部水平线 遮蔽除打开的选项卡之外的所有选项卡的底部 我将使用 CSS3box shadow财产来做到这一点 但我
  • Android改变Material高程阴影颜色

    是否可以更改 xml 高程属性产生的阴影颜色 我希望通过代码动态改变阴影 我知道这个问题很老了 可能作者不再需要答案了 我会把它留在这里 以便其他人可以找到它 Lollipop 的高程系统不支持彩色阴影 但是 如果您需要彩色阴影 可以使用
  • Swift - 圆角半径和投影问题

    我正在尝试创建一个按钮圆角 and a 阴影 无论我如何切换 该按钮都无法正确显示 我试过了masksToBounds false and masksToBounds true 但是要么圆角半径起作用而阴影不起作用 要么阴影起作用而圆角半径
  • 使用 CSS 实现内部文本阴影

    我目前正在使用 CSS3 并尝试实现这样的文本效果 黑色模糊的内部阴影 但我找不到创建文本阴影的方法inside文本 我想知道这是否仍然可能 因为 box shadow 元素能够像这样在内部渲染阴影 box shadow inset 0px
  • 未修饰的 JFrame 阴影

    如何向未修饰的 jframe 添加阴影 根据我在网上找到的信息 您也许可以将 jframe 添加到另一个黑色半透明窗口以提供阴影效果 或者以某种方式将类似的内容应用于 JFrame Border loweredBorder new Etch
  • 相当于IE中的text-shadow

    我的CSS中有这个 body transparent background color transparent color ffffff text shadow 0 1px 000 1px 0 000 0 1px 000 1px 0 000
  • 向 Cocoa 标签添加阴影(凹陷文本效果),而不降低文本渲染质量

    我想创建带有文本效果的状态栏 如 Safari 或 iTunes 中的文本效果 即凹进文本 然而 如果我只是使用 Core Animation 面板在 Interface Builder 中添加阴影 OS X 最糟糕的文本渲染就会出现 在标
  • 如何去除iOS 7中的UINavigationBar内部阴影?

    内阴影示例 http imageshack us photo my images 20 9hnx png 我试图将导航栏放在另一个导航栏下方 使其看起来像一个高导航栏 但在 iOS 7 中 UINavigationBar 现在在其顶部和底部
  • Android 操作系统是否有 /etc/passwd、/etc/shadow 和 /etc/group 等文件?

    如果不是 android如何判断用户是否属于某个组 该线程讨论了如何完成此操作 http groups google com group android ndk browse thread thread adddb27c1a5438e9 h
  • Android CardView 显示卡片周围的边框

    Android Cardview 在卡片周围显示不必要的边框 我尝试过不同的方法 但无法将其删除 当我为卡片提供自定义背景颜色时会发生这种情况 当我删除 cardBackgroundColor 并使用默认值时 那么不必要的边框就不可见了 我
  • 如何在 flutter 中为小部件添加阴影?

    如何向小部件添加阴影 如下图所示 This https stackoverflow com questions 52173205 how can put image inside the image in flutter 52178364
  • 各个方向的实体阴影

    I ve been looking for a way to set the shadow property of a layer like this 其中浅蓝色是图层 UIImageView在本例中 深蓝色是阴影 我想让影子做一些事情 出
  • 在 Three.js 中的 MeshPhongMaterial 或 MeshLambertMaterial 上投射阴影

    我觉得我在这里缺少一些简单的东西 I used JSFiddle 作者 WestLangley http jsfiddle net 4Txgp 234 它演示了如何将物体的阴影投射到平面上 当飞机只填充颜色时 一切都会按预期进行 var g
  • ThreeJS 中阴影的奇怪行为

    所以我有一个 ThreeJS 场景 并且添加了一些球体 多材质 我还添加了定向光 this light new THREE DirectionalLight 0xFFFFFF 1 this light position set 2 10 2

随机推荐

  • Ubuntu 16.04 远程桌面

    1 安装xrdp sudo apt get install xrdp 2 安装vnc4server 我这里是安装xrdp的时候自动安装的 我看网上很多说是需要单独安装的 3 安装xfce4 sudo apt get install xubu
  • GitLab端口冲突 解决办法

    访问gitlab xff0c 出现 xff1a 502 GitLab在使用的过程中 xff0c 会开启80端口 xff0c 如果80端口被其他的应用程序占用 xff0c 则GitLab的该项服务不能使用 xff0c 所以访问GitLab会失
  • Android开发 之 确认凭证

    确认凭证 主要目的 xff1a 设置不用验证时间 设置为30秒 xff0c 当超过30秒后则需要重新验证身份才能操作 您的应用可以根据用户在多久之前最后一次解锁设备来验证其身份 此功能让用户不必费心记忆应用特定密码 xff0c 您也无需实现
  • inner join、outer join、right join、left join 之间的区别

    inner join outer join right join left join 之间的区别 一 sql的left join right join inner join之间的区别 left join 左联接 返回包括左表中的所有记录和右
  • "大泥球"仍然是最常见的软件设计

    大泥球 xff0c 是指杂乱无章 错综复杂 邋遢不堪 随意拼贴的大堆代码 这些年来 xff0c 为了对付这个泥球 xff0c 我们看到了多种指导方法 xff0c 比如SOLID GRASP 和KISS xff0c 与其他诸多年代久远的 提倡
  • 3322.org带来的麻烦

    大概是3322 org被短时间攻破 xff0c 下载他的动态域名客户端的时候下到一个病毒Trojandropper js adagent gd xff0c 把江民关了 xff0c 并且再也开不开 系统还原不行 xff0c 安全模式也进不去
  • Qt学习笔记:多线程的使用

    文章目录 前言1 何时使用线程2 QThread类实现多线程2 1 多线程的实现方法2 2 线程休眠2 3 正确结束线程 3 线程同步3 1 互斥量3 2 信号量3 3 条件变量 4 线程池参考资料 前言 程序中调用耗时的操作 xff08
  • 上位机开发笔记:环形缓冲区

    文章目录 前言1 环形缓冲区工作机制1 1 实现原理1 2 区分缓冲区满或者空1 总是保持一个存储单元为空2 使用计数数据3 镜像指示位 2 Qt实现环形缓冲区2 1 QByteArray环形缓冲区2 2 QSemaphore实现环形缓冲区
  • IDEA搭建Spring框架环境

    IDEA搭建Spring框架环境 一 spring 框架概念 spring 是众多开源 java 项目中的一员 xff0c 基于分层的 javaEE 应用一站式轻量 级开源框架 xff0c 主要核心是 Ioc 控制反转 依赖注入 与 Aop
  • SQL SERVER中索引类型包括的三种类型分别是

    xfeff xfeff 唯一索引 UNIQUE 聚集索引 CLUSTERED xff09 非聚集索引 NONCLUSTERED xff09 主键与唯一索引的区别 主键是一种约束 xff0c 唯一索引是一种索引 xff0c 两者在本质上是不同
  • _Linux多线程--生产者消费者模型篇

    文章目录 1 为何要使用生产者消费者模型2 基于BlockingQueue的生产者消费者模型3 C 43 43 queue模拟阻塞队列的生产消费模型条件变量使用规范简单测试1 BlockQueue 缓存 超市 2 ConProd cc3 结
  • HTTP、TCP的关系及状态码

    一 基本概念 1 TCP连接 手机能够使用联网功能是因为手机底层实现了TCP IP协议 xff0c 可以使手机终端通过无线网络建立TCP连接 TCP协议可以对上层网络提供接口 xff0c 使上层网络数据的传输建立在 无差别 的网络之上 建立
  • x299平台装linux系统的一些天坑

    年前实验室为了配置大内存的服务器 xff0c 受限于经费 xff0c 我们只能使用比较便宜的游戏板 xff0c 选择了微星的x299平台 xff0c 买回来自带win10 xff0c 回来的第一件事就是装linux xff0c 习惯上我会装
  • android的应用包名与代码包名

    说来惭愧 xff0c 好歹还是做了android应用这么久了 xff0c 居然不知道这个事情 参考 xff1a http www xmumu com post 2013 08 05 40052300660 http blog javia o
  • [自动驾驶]Build a Traffic Sign Recognition Program

    看 准确率98 的深度学习交通标志识别是如何做到的 xff1f 这篇文章的时候 xff0c 发现了udacity的自动驾驶课程 可惜要收费 xff0c 不过课程project在github上有 xff0c 那直接做project就好了 xf
  • Spring MVC框架的高级配置

    本文将为您提供关于Spring MVC框架的配置技巧 xff0c 以帮助管理基于Spring的web应用程序的多个实例 本配置管理主题常被学术界所忽略 xff0c 但是 xff0c 这对于现实的web开发尤为重要 本主题并不直接关联任何具体
  • ffmpeg解码花屏

    问题 xff1a 解码为YUV420转为Bitmap后显示在屏幕上时 xff0c 有三分之二为花屏 xff1a 如图 xff1a 首先用h264Visa分析帧 xff1a 已经读出了sps等信息 xff0c 这些信在解码第一帧时被写入环境变
  • 使用Hexo+Github一步步搭建属于自己的博客(基础)

    前言 xff1a 电脑系统为window 10专业版 xff0c 64位 相关步骤 xff1a 1 安装Node js和配置好Node js环境 xff0c 打开cmd命令行 xff0c 成功界面如下 2 安装Git和配置好Git环境 xf
  • OpenSSL命令学习

    OpenSSL命令学习 一 基础概念 OpenSSL是一个开放源代码的软件库包 xff0c 应用程序可以使用这个包来进行安全通信 xff0c 避免窃听 xff0c 同时确认另一端连接者的身份 这个包广泛被应用在互联网的网页服务器上 下面以问
  • 论文阅读——Shadow Attacks:Hiding and Replacing Content in Signed PDFS

    论文阅读报告 Shadow Attacks xff1a Hiding and Replacing Content in Signed PDFS 阅读背景 本次阅读的论文是由Christian Mainka Vladislav Mladeno