当前位置: 首页 > 编程日记 > 正文

最快69秒逆向DRAM地址映射,百度设计的这款逆向工具如何做到快速可靠?

来源 | 百度安全实验室

出品 | AI科技大本营(ID:rgznai100)

导读:近日,国际顶级设计自动化大会DAC大会公布DAC 2020会议议程和论文名单,由百度安全发表的《DRAMDig: AKnowledge-assisted Tool to Uncover DRAM Address Mapping》成功入选。

图1. 2020 DAC Accepted Papers

本篇论文介绍了由百度安全研究设计的DRAM address mapping逆向工具——DRAMDig,能够在平均7~8分钟时间(最快仅需要69秒),快速、可靠地逆向出DRAM地址映射 —— Rowhammer攻击实现的关键步骤。该工具可用来评估个人主机、云计算基础设施是否受到Rowhammer攻击的威胁。

DAC是以电子设计自动化(EDA)和嵌入式系统及软件(ESS)为主题的国际公认的最顶尖学术会议,也是中国计算机学会(CCF)认定的A类会议,被誉为EDA界的奥斯卡。大会每年吸引全球知名的学者参与成果发布和技术讨论,近两年论文接受率维持在20%左右。

谈到Rowhammer攻击,整个安全行业一定都不陌生,2014卡内基梅隆大学 宣布发现一种存在于动态随机储存器(下称DRAM)的漏洞,借助这项漏洞,攻击者可以通过反复加载内存的特定行来实现账户提权,研究一经发表,便掀起业内极大轰动,因为这表明了不管是PC、手机,不管操作系统是Linux、Windows··,几乎所有搭载DRAM内存的X86构架CPU的设备都会都会存在安全隐患,影响不言而喻。

那么,今天我们就带大家了解一下,究竟颠覆攻击逻辑的Rowhammer到底是什么?由百度安全研究员Minghua Wang和Yueqiang Cheng联合Henry Zhang(来自澳洲Data61)所研究设计的映射逆向工具DRAMDig,又是如何快速、可靠地逆向出触发Rowhammer攻击的DRAM地址映射?

“一招通杀”所有设备 —— Rowhammer攻击原理

从硬件角度来看,计算机就是一个庞大的集成电路,由大量的电子管、继电器和各种电气元件组合而成。其中用来存储信息用的物理内存,就是我们上面提到的DRAM。就像去图书馆找一本书,你需要通过书的类型和编码,定位到它在哪一个书架,哪一排,哪一格,DRAM里想要找到存储的某一数据,也有一套明确的访问路径:channel →DIMM → rank → chip →bank → cell。所以,计算机内存就是由无数个内存存储单元(下简称cell)构成的电路板。

图2. 内存存储单元cell结构

cell由一个晶体管和一个电容组成,就像一个小电池,每个cell存放1 bit数据,而计算机里所有的内容,本质上都是一堆数据编码,都可以用类似01010101001这样的二进制来表达 —— 体现在cell上,晶体管通电状态表示1,不通电状态表示0。所以说,不管你在电脑里存放的文档、照片,下载的游戏、音乐程序,亦或是计算机本身的操作系统,其实归根结底都是通过一定规则存储在cell里的“0”或“1”。

然而近年来,随着人们生产生活对计算机存储的需求要求更高,设备厂商在不改变内存电路板面积大小的前提下,让其能够存储更多的数据,只能将cell的设计越做越多,排列越来越近,密度大幅度增加,虽然制作工艺有所提升,但还是会存在一种假设,那就是相邻的cell在运行中可能会受到干扰,如果频繁“轰炸”某两行(行话称之为row),就可能会造成中间一排腹背受敌、上下夹击,从而出现比特位翻转,也就是0变成1,1变成0...

业内把这种上下敲击的疯狂操作,称为double-sided Rowhammer test,而导致比特位翻转的这个攻击方式就叫做Rowhammer攻击,Row是行,Hammer是反复敲击,如此简洁明了,一针见血。

当然如果只是单纯的疯狂改写数据,以此来搞破坏也过太小看Rowhammer攻击的威力了,其实攻击者的深层目标是利用Rowhammer攻击来提升账号权限,获得通往各路关卡的“通行证”。此前就有学者发现,通过rowhammer可以打破进程间隔离,user-kernel隔离,VM间隔离以及VM-VMM间隔离,从而获得更多系统权限。

再举个例子,有攻击者企图获取你的网银支付密码,但此类程序开发者为了安全起见,都会将诸如密码、身份证号等核心数据,设立重重关卡,存放在金字塔的顶端,除了用户自身,其他人无法触及。而有了Rowhammer攻击,虽然被设立关卡,攻击者却可以绕过这些,选择通过更底层去找到储存核心数据的cell,然后反复敲击其“隔壁邻居”,引起比特位翻转,来实现最终获取支付密码的目的。

“说起来容易做起来难” —— Rowhammer攻击难点

读到现在,你是不是会有一个这样的疑问,计算机内存里密密麻麻分布着cell,即使理解了Rowhammer攻击的操作手法,如果不知道哪些cell里隐藏着账号提权的核心线索,一顿轰炸操作无异于随机“抽盲盒”,能不能找到关键全靠运气。

所以很长时间以来,对于Rowhammer攻击的研究只停留在理论阶段,归根结底原因是:找到那最为关键的两个row实在是太难了!

专业上,定位到最关键的两个row需要解决的核心问题,是要找出DRAM核心数据所在的DRAM地址,其实也就是逆向DRAM地址映射(下简称DRAM address mapping)的过程。

上文我们讲到过,在计算机里,不管是什么类型的文件、信息、数据,最终都会以0101011的形式被存储在内存里,程序运行中需要访问到这些数据,只能通过虚拟地址来访问。这些虚拟地址在操作系统中首先转换成物理地址,然后物理地址再通过CPU中的Memory Controller转为为DRAM中的地址。物理地址与DRAM中地址的映射关系是一段未公开的“咒语”,需要逆向分析来解决。

对此,百度安全研究员调研了的目前行业公开的所有DRAM address mapping逆向工具并做了分析,结果显示这些工具的表现并不尽如人意,或是无法通用于各类型号的CPU,或是操作时间过长,需要数小时的时间,还有的甚至检测多次,得出的结果前后不一致。

而此次即将在DAC大会上公开的,由百度安全所研究设计的DRAM  address mapping逆向工具——DRAMDig, 能够在平均7~8分钟时间(最快仅需要69秒),快速、可靠地逆向出DRAM地址映射,并且通用于包括Non-ECC DDR3\DDR4内存条,以及当前市面上流行的Intel CPU(Sandy Bridge ~ Coffee Lake)。

“更经得起推敲”—— DRAMDig 工具核心原理

 

目前已有逆向工具(如DRAMA)无法稳定、快速、准确逆向出DRAM address mapping,主要有如下几个方面原因。首先,已有工具对DRAM自身信息挖掘不到位,比如缺乏对bank数目、row/column位数的理解;其次,已有工具中存在物理地址盲目的随机选取,导致逆向结果不稳定、不准确,同时存在大量的穷举操作,导致较大时间开销;最后,已有工具对interleaved mode形式的DRAM address mapping逆向能力有限。

由百度安全研发的新型DRAM address mapping映射逆向工具——DRAMDig,提出了Domain-knowledge assisted的方案,能够充分挖掘、利用已有的knowledge来辅助逆向,使得最终得到的逆向结果准确、稳定、快速。Domain knowledge包括三个方面:

1)DDR3/DDR4Specification。我们从Specification中能够获取有关DRAM row/column bits的确切数量;

2)系统信息。通过程序来获取DRAM中bank数量,系统的物理内存大小(物理地址中有效地址位数)等信息;

3)经验观察。我们认为Intel CPU上的bank寻址采用的是线性XOR计算方式,参与XOR计算的是物理地址中的特定bits(称之为bank bits)。例如,在某款Intel CPU,以及一个包含8个bank的DRAM的设定下,bank寻址函数表示为:(BA0, BA1,BA2)。其中,BA0 = bit6⊗bit13, BA1= bit14⊗bit16,BA2=bit15⊗bit18

DRAM address mapping逆向目标是确定物理地址到DRAM中地址的映射关系。包括两个方面,第一,还原物理地址中bits的角色,即哪些是row bits,column bits和bank bits;第二,确定bank寻址函数。图3描述了DRAMDig的工作流程。在介绍具体流程之前,我们首先简要介绍一个DRAMDig逆向所依赖的一个基本操作原语,它是DRAMDig工作的基石。

图3. DRAMDig 逆向流程

这个操作原语是一个timing channel。具体而言,这个timing channel是由同一DRAM bank中的row buffer冲突引起的。DRAM中每个bank都有一个row buffer来缓存最后访问到的row。如果一对地址在同一bank的两个不同row中,交替访问它们时row buffer将反复重新加载、清除这两个row,导致row buffer 冲突。而如果两个地址位于同一row或不同bank中,访问这两个地址时不会发生row buffer 冲突。显然发生row buffer冲突情况下,也就是两个地址在同一bank不同row时,得到的latency更大。因此,根据两个地址的latency测量结果的高低,可以判断它们是否在同一bank不同row。

在这个操作原语基础之上,我们来简要介绍DRAMDig的逆向流程。主要分为三个阶段。

第一阶段,精心选取多对物理地址,利用timing channel进行latency测量,根据测量结果对row、column和bank bits范围进行初步的划分。首先从高到低考察物理地址中每个bit,选取仅有这个bit不同的两个物理地址测量latency。如果是high latency,则说明它们在同一个bank不同row,当前只有1个bit不同,所以这个bit是rowbit。然后选定1个row bit和一个非row bit,再选取仅有这2 bit不同的物理地址测量latency。如果是high则说明它们在同一bank不同row,这个非row bit不会是bank bit,而是column bit。这样两轮测量之后能够得到row bits和column bits的位置范围,剩余的bits是bank bits。

第二阶段,选取覆盖bank bits所有取值情况的物理地址,再次利用timing channel来测量latency。将latency为high的地址划分到一堆,最终这些物理地址将被划分为#bank堆,同一堆物理地址都在一个bank中,而且每一堆的物理地址个数大致相同。然后依次在每堆中考察bank bits之间的XOR组合情况,找出堆中所有物理地址都满足的bits XOR方式,作为候选bank寻址函数。在所有地址堆都考察完毕后,将候选bank寻址函数进行消元处理,得到最终的bank寻址函数。

第三阶段,确定具有多重角色的bits,这是由于存在interleave mode的寻址情况,例如,有些bit既是row bit也是bank bit,有些bit既是column bit也是bank bit。还原多重角色row bits的方式是,考察2-bit的bank寻址函数,选取仅有这2个bit不同的两个物理地址,测量它们的latency。如果测量结果是high latency,则认为高位bit是row bit。对于多重角色的columnbits,根据Domain knowledge和第一阶段的还原结果,能够获知未还原的column bits数量(N)。在已还原出column bits的位置基础上,按照从低到高的顺序,将未还原数量(N)的bits认为是column bits。

由于DRAMDig选取了覆盖所有bankbits取值情况的物理地址,不但能够真实且完整揭示bank寻址方式,而且能够根据latency测量结果将这些地址均匀地划分到#bank堆,保证了bank 寻址函数还原结果的准确性和稳定性。另外,DRAMDig仅需要在bank bits空间内的寻找bank寻址函数,不需要在所有bits空间内穷举,大大降低了时间开销。

据介绍,百度安全利用DRAMDig在9台具有不同CPU和内存设定的机器上进行了DRAM address mapping逆向实验。实验结果如表1所示。可以看到,实验的CPU涵盖SandyBridge、Ivy Bridge到Coffee Lake等多个新老微架构(Microarch.),内存条涵盖DDR3和DDR4 (DRAM Type,Size),和包含多种DRAM设定方式(DRAM Config)。

表1.DRAMDig在9个不同机器设置上的逆向结果

其中Config表示如下参数:#channel,#DIMM/channel,#rank/DIMM,#bank/rank.

在这些逆向实验中,最多需要17分钟,最少需要69秒可以获得逆向结果,如图4所示。相比较逆向工具DRAMA而言,DRAMDig具备更短的时间开销。其中,在第3和第7台机器中,DRAMA花费了将近2小时都没有输出逆向结果。此外,百度安全研究员在实验中发现,运行DRAMA多次,很大几率会出现每次逆向结果都不相同的情况,因此DRAMA在逆向结果的准确性和稳定性方面均无法保证。

图4.DRAMDig和DRAMA逆向时间开销(单位:秒)

在获得逆向结果基础之上,为进一步验证,百度安全研究员还在多台机器上进行了double-sidedRowhammer测试,并且和DRAMA进行了对比。使用两个工具在不同的机器上分别进行了5次测试,每次测试5分钟,最后统计bit翻转的数量。可以从表2中看到,DRAMDig能够产生更多的bitflips。有一些测试中DRAMA甚至没有出现翻转,而DRAMDig敲出了翻转,这也能够说明DRAMDig逆向结果的正确性。由此可见,准确的逆向DRAM addressmapping对bit翻转具有很重要的影响,对Rowhammer威胁评估具有非常关键的作用。

表2.DRAMDig和DRAM执行5次double-sided rowhammer测试,每次测试持续5分钟。DRAMDig比DRAMA产生了更多的bitflip。

结语

毫无疑问,DRAMDig的诞生,大大提升了对DRAM address mapping逆向的效率和准确性,对于高效评估个人主机、云计算平台等基础设施是否受到Rowhammer攻击的威胁有着重要意义。对于硬件厂商修复Rowhammer漏洞,提升芯片制作工艺,也提供了新的思路。同时,百度安全也开放自身顶尖技术能力,以开放共享的姿态,打破技术壁垒,推进安全生态建设,保护数据隐私安全。


推荐阅读

  • 大促下的智能运维挑战:阿里如何抗住“双11猫晚”?

  • 黑客用上机器学习你慌不慌?这 7 种窃取数据的新手段快来认识一下!

  • 当莎士比亚遇见Google Flax:教你用字符级语言模型和归递神经网络写“莎士比亚”式句子

  • Hyperledger Fabric 和企业级以太坊,谁才是企业首选?

  • 面试时遇到「看门狗」脖子上挂着「时间轮」,我就问你怕不怕?

  • 同期两篇 Nature:运行温度高于 1K 的量子计算平台问世!

  • GitHub 标星 10,000+,Apache 顶级项目 ShardingSphere 的开源之路

  • 你点的每个“在看”,我都认真当成了AI

相关文章:

国外厂商在行业客户上输单的原因

这两天听一个朋友聊天发泄,他在一家总代J公司工作,代理业内排行第一的国外厂商C公司的产品,他负责D行业在南方某几个省的销售业务,工作中需要与C公司的销售紧密配合。经过接近一年的工作,他拿到一些项目,但…

[android] 从gallery获取图片

效果就是点击按钮,打开系统图库应用,可以选择一张里面的图片展示出来 设置隐式意图 获取Intent对象,通过new出来 调用Intent对象的setAction()方法,设置动作,参数:Intent.ACTION_PICK 调用Intent对象的setT…

调试JDK源码-HashSet实现原理

调试JDK源码-一步一步看HashMap怎么Hash和扩容 调试JDK源码-ConcurrentHashMap实现原理 调试JDK源码-HashSet实现原理 调试JDK源码-调试JDK源码-Hashtable实现原理以及线程安全的原因 代码 Set<String> snew HashSet<String>();s.add("http://blog.csdn.ne…

Python 炫技操作:海象运算符的三种用法

作者 | 明哥来源 | Python编程时光&#xff08;ID:Cool-Python&#xff09;Python 版本发展非常快&#xff0c;如今最新的版本已经是 Pyhton 3.9&#xff0c;即便如此&#xff0c;有很多人甚至还停留在 3.6 或者 3.7&#xff0c;连 3.8 还没用上。很多 Python 3.8 的特性还没来…

2010.10.30 OA 项目组一周工作报告

本周基本上实现了上周的目标&#xff0c;但和计划相比有落后。 进度&#xff1a;55 本周提交了3.0任务评估的第一个版本&#xff0c;一共为1003小时&#xff0c;客户收到该评估后&#xff0c;对3.0任务进行了调整&#xff0c;将部分任务移到2011.2版本中&#xff0c;同时添加了…

继承log4.net的类

using System; using System.Diagnostics;[assembly: log4net.Config.XmlConfigurator(Watch true)] namespace Hbl.Core {public static class Log{/// <summary>/// 一般错误/// </summary>/// <param name"message">消息</param>public …

调试JDK源码-Hashtable实现原理以及线程安全的原因

调试JDK源码-一步一步看HashMap怎么Hash和扩容 调试JDK源码-ConcurrentHashMap实现原理 调试JDK源码-HashSet实现原理 调试JDK源码-调试JDK源码-Hashtable实现原理以及线程安全的原因 Hashtable是线程安全的&#xff0c;我们从源码来分析 代码很简单 Hashtable<String, …

源代码查看工具 Source Navigator 使用心得

在ubuntu 10.04下试用了Source Navigator&#xff0c;有条件还是装Source insight吧&#xff0c;不是一个级别的&#xff0c;非常不方便。 Source Navigator 是Red Hat出品的一款查看源代码的工具&#xff0c;非常好用&#xff0c;与Windows下的Source Insight有一敌。但是它的…

那个分分钟处理10亿节点图计算的Plato,现在怎么样了?

受访者 | 于东海记者 | 夕颜出品 | CSDN&#xff08;ID:CSDNnews&#xff09;「AI 技术生态论」 人物访谈栏目是 CSDN 发起的百万人学 AI 倡议下的重要组成部分。通过对 AI 生态顶级大咖、创业者、行业 KOL 的访谈&#xff0c;反映其对于行业的思考、未来趋势的判断、技术的实践…

android TextView里边实现图文混配效果

做的游戏攻略中的图文载入已经用TextView实现。但看到网易新闻里的内容。点击图片能够调到一个新的Activity &#xff0c;感觉也像Textview 实现的&#xff0c;但不知道怎么弄&#xff0c;想想能够通过动态载入Textview和ImageView 布局实现&#xff0c;但当量大的时候回事很复…

《异步处理在分布式系统中的优化作用》学习笔记

原文地址&#xff1a;http://www.infoq.com/cn/presentations/optimization-of-asynchronous-processing-in-distributed-systems 视频地址&#xff1a;http://v.qq.com/boke/page/l/0/6/l0196plsvp6.html 主讲人&#xff1a;赵海平 Facebook hiphop HHVM 阿里巴巴技术保障部…

CISCO设备上DHCP实例

Cisco设备上设置DHCP实例 -------------------------------------------------------------------------------- 一位客户想把DHCP SERVER迁移到6509交换机的MSFC上,要求还挺复杂: 1.同时为多个VLAN的客户机分配地址 2.VLAN内有部分地址采用手工分配的…

360金融翟政:科技成就金融场景零容错

翟政&#xff0c;拥有超过20年的互联网经验&#xff0c;我国第三方支付第一批从业者&#xff0c;是多个知名第三方支付公司产品研发团队的组建者&#xff0c;核心系统的主设计师&#xff0c;管理层核心成员。设计搭建的支付系统过去这十年来一直在服务着各行各业的在线支付需求…

OSSIM平台安全事件关联分析实践

OSSIM平台安全事件关联分析实践在《开源安全运维平台OSSIM最佳实践》一书中叙述到&#xff0c;事件关联是整个OSSIM关联分析的核心&#xff0c;对于OSSIM的事件关联需要海量处理能力&#xff0c;主要便于现在需要及时存储从设备采集到的日志&#xff0c;并能关联匹配和输出&…

《Apache Kafka》学习笔记

1.什么是Kafka Kafka是一个高通过率的分布式消息系统 2.消息队列&#xff08;Message Queue)MQ的模型 消息队列的简单架构图 3个核心概念&#xff1a; Sender Application&#xff1a;消息队列的发送者&#xff0c;也叫生产者producer Message Queue Receiver Application…

4 月 24 日开播!基于神经网络建模的信息传播预测

信息传播在我们的日常生活中无处不在&#xff0c;例如谣言的扩散、产品的推广以及新思想和新技术的普及等等&#xff0c;其建模和预测已经在多个重要领域内得到了广泛的研究。近年来&#xff0c;很多研究者利用以循环神经网络为主的深度学习模型对信息传播过程进行建模&#xf…

并行计算圆周率

看到这个题目&#xff0c;俗了&#xff0c;大家都在计算圆周率。不过咱们的目的是看一下并行计算的基本流程。 书上计算PI用的是精确的数值计算方法&#xff0c;我这里再给出一种概率计算方法。 OpenMP和MPI将同时亮相。 计算PI的方法 1.tan(PI/4)1 > PI4arctan1。知…

kafka-manager 的编译和使用(附安装包)

2019独角兽企业重金招聘Python工程师标准>>> kafka-manager是一个非常好用的kafka web管理工具&#xff0c;yahoo开源。 地址&#xff1a;github.com/yahoo/kafka-manager 1、编译过程比较简单&#xff0c;重点是能翻墙&#xff0c;如果网络环境不允许&#xff0c;可…

匿名函数应用-多线程测试代码

多线程测试代码&#xff0c;不用单独再写一个类&#xff0c;比较方面而已。 public class MainThread { static int a0; for (int x 0;x<100;x){ Thread t new Thread(new Runnable() { Override public void run() { while(true){ try { a;System.out.println(a);…

YOLOv4来了,大型调优现场,速度和准确率俱佳

作者 | VincentLee来源 | 晓飞的算法工程笔记简介论文提出YOLOv4&#xff0c;从图1的结果来看&#xff0c;相对于YOLOv3在准确率上提升了近10个点&#xff0c;然而速度并几乎没有下降&#xff0c;论文主要贡献如下&#xff1a;提出速度更快、精度更好的检测模型&#xff0c;仅需…

关于对J2EE几点误解和错误认识的澄清

转自&#xff1a;http://www.jdon.com .Net和J2EE的争论一直没有停止&#xff0c;我也参加过“程序员”杂志主持的“.Net和Java之争”之类的讨论&#xff0c;本来这两种技术都是为用户提供了竞争性的选择&#xff0c;对于用户来说是一件好事&#xff0c;多种选择远胜于单一选择…

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in r...

2019独角兽企业重金招聘Python工程师标准>>> Struts Problem Report Struts has detected an unhandled exception: Messages: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or re…

Java的Redis连接池代码性能不错

其实这个是引用自网友http://blog.csdn.net/tuposky/article/details/45340183&#xff0c;有2个版本&#xff0c;差别就是ReentrantLock和synchronized。另外原作者使用了断言&#xff0c;我觉得这个还是不用为好。 ReentrantLock版 import java.util.concurrent.locks.Reent…

降低预测过程计算成本,这些NLP模型压缩方法要知道

编译 | 凯隐出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;近年来&#xff0c;基于谷歌Transformer的语言模型在神经机器翻译&#xff0c;自然语言推理和其他自然语言理解任务上取得了长足进展。通过多种语言模型的平均损失进行自我监督预训练&#xff0c;使得在大范…

政府要尽快对应用商店出台管理办法

前两天联想的开发者大会&#xff0c;我和联想的CTO贺志强先生联合接受了一个视频访谈&#xff0c;贺先生谈到联想的乐园软件商店&#xff0c;组织大量的人力对于软件进行检测&#xff0c;以保证软件是合格产品&#xff0c;不会给用户一路带来侵害&#xff0c;对于联想这种负责态…

antlr-2.7.6.jar的作用

项目中没有添加antlr-2.7.6.jar,hibernate不会执行hql语句 并且会报NoClassDefFoundError: antlr/ANTLRException错误

junit集成Hamcrest测试集合中某个属性是否包含特定值

junit已经集成Hamcrest但是还是需要引用hamcrest-library&#xff0c;不然只有基本方法&#xff0c;高级的没有 <dependency> <groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test<…

腾讯第100个开源项目:微信开源推理加速工具TurboTransformers

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;4月24日&#xff0c;腾讯正式宣布开源Transformer推理加速工具TurboTransformers。该工具面向自然语言处理领域中Transformers相关模型丰富的线上预测场景&#xff0c;在微信、腾讯云、QQ看点等产品的线上服务中已经广…

程序员:提高编程效率的技巧

本文写给那些认为在项目上所花时间和效率成正比的程序员。我要说的是&#xff0c;事实并非如此。虽然你需要在电脑前敲键盘输入东西&#xff0c;但这只和编程沾上一点边。那么&#xff0c;程序员该如何利用时间呢&#xff1f; 俗话说&#xff0c;磨刀不误砍柴工&#xff0c;拿出…

Qunee for HTML5 V2.5新版本发布

为什么80%的码农都做不了架构师&#xff1f;>>> Qunee for HTMl5 V2.5 beta2版本正式发布,此次版本内核改动较大,采用了新的2D渲染引擎,增加了延迟绘制功能,大幅改善画布的浏览体验,此外重构了鼠标键盘以及触控交互监听处理,增加右键框选功能,改善了多点触控交互,增…