热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MD5碰撞的演化之路

        2016年1月20日        主编  白名单分析组        0x1概述自从王小云破解MD5算法后,国内外对MD5碰撞的相关研究与恶意利用从未停止。MD5算法的应用领域很多,

http://p5.qhimg.com/t016420f0012a22be6b.png

        2016年1月20日

        主编  白名单分析组

        0x1概述

自从王小云破解MD5算法后,国内外对MD5碰撞的相关研究与恶意利用从未停止。MD5算法的应用领域很多,就软件安全方面来说,陆续发现了一批利用MD5碰撞对抗安全软件的恶意样本。这些样本中,大部分采用早期的一种较为成熟的快速MD5碰撞利用方式,然而有一部分比较特殊,因其采用了新型的碰撞方式。

这种新型的碰撞样本在2014年初开始出现,当时还处于测试阶段,所以只有少数样本在传播。直到2015年初,新型碰撞样本大规模爆发,经过分析和追踪,可以确定采用新型碰撞手法的大批量样本是由同一团伙制做,后续称为碰撞作者。2015年9月,对抗升级,碰撞作者开始结合数字签名利用技术与安全软件对抗。2015年11月,碰撞作者进行新的尝试,利用双签名对抗查杀。下图是该碰撞作者近两年对抗手法的演化的过程:

http://p9.qhimg.com/t0161eca4b080dbeaab.jpg

图1-1 碰撞作者近两年的攻击演化过程

根据上面的演化过程,本文将围绕碰撞作者各阶段的利用手法展开详细的分析。首先,介绍新型MD5碰撞的特点,通过与早期版本的对比来认识新型碰撞手法的“先进性”。接着,进一步介绍新型MD5碰撞与数字签名结合的高级利用手法,以及碰撞作者放弃碰撞方法而采用双签名进行对抗的新尝试。然后,通过一例样本的行为分析介绍碰撞作者的典型攻击流程。最后,对碰撞作者的恶意软件传播和影响进行统计与信息挖掘。

        0x2新型碰撞特点

早期的碰撞样本,主要采用“前缀构造法”,以同一个给定的前缀程序A为基础,在尾部添加不同的附加数据,得到两个具有相同MD5的样本B和C,如下图所示:

http://p0.qhimg.com/t01022c1619dc8746dd.jpg

图2-1 早期MD5碰撞的利用手法

前缀构造法碰撞后的两个样本只有尾部少量字节不同,而程序代码是相同的。通过判断尾部数据的差异,两个样本可以执行不同的程序流程。由于这种碰撞手法是通过同一前缀程序碰撞生成的两个样本,如果其中有恶意代码流程则两个样本均包含恶意代码,所以比较容易被安全软件识别,隐蔽性较差。

而采用新型的MD5碰撞手法,得到两个MD5校验值相同的样本,一个是恶意程序,另一个则是正常程序,它们在功能和代码上完全不同。由两个不同的前缀程序A和B分别在尾部添加附加数据,构造出具有相同MD5的程序C和D,如下图所示:

http://p0.qhimg.com/t01c274ba7cb028ebb0.jpg

图2-2 新型MD5碰撞的利用手法

这一阶段,碰撞作者主要是通过正常程序与恶意程序两种不同程序碰撞相同的MD5来对抗安全软件。比如这样一组样本,正常程序是一个dll程序,恶意程序则是一个加了vmp强壳的流氓日历exe程序:

http://p0.qhimg.com/t017a4757f926dda155.jpg

图2-3 一组新型碰撞样本的静态特征

而这两款毫不相关的程序MD5值校验却神奇的一致:

http://p8.qhimg.com/t01e4972a5db624f63f.jpg

图2-4 一组新型碰撞样本的MD5计算结果

通过图2-3和图2-4,证实了两种不同格式的程序,其文件MD5是可以相同的。然而这种现象并非偶然,而是碰撞作者能够大批量制造的真实案例。为了深究其技术手法,仔细比较一下这两个文件的数据如下:

http://p4.qhimg.com/t0131deff55081795c2.jpg

图2-5 一组新型碰撞样本的文件数据比较

从图中可以看出,两个文件绝大部分数据不同,但尾部数据高度相似,而且文件大小一致,这种构造方式是基于“选择前缀碰撞法”(Chosen-prefix collsion[[1]])实现的,其原理图大致如下:

http://p3.qhimg.com/t018ac81e6578107a6c.jpg

图2-6 “选择前缀碰撞法”原理

通过选择不同的前缀,计算生日数和碰撞块添加到文件尾部,即可得到两个具有相同的MD5的文件。不过,要计算出这些尾部数据并不容易,直接使用hashclash[[2]]的工具需要相当大的时间成本,但是碰撞作者对该工具进行改进后已经能够高效完成大量正常程序与恶意程序的碰撞了,以下为此阶段样本的典型样例(每组正常程序与恶意程序对照),由于碰撞的原理与文件格式无关,所以样本形态呈现了多样化的特点。

https://img8.php1.cn/3cdc5/15d29/711/c6a657a6bb3f161c.png

图2-7 此阶段碰撞样本的典型样例

其中,碰撞的样本对中,恶意程序主要为桌面软件的组件[[3]],而正常程序则是任意的软件。由于每组样本都对应同一个MD5指纹,碰撞作者便借此来对抗安全软件对其恶意程序的查杀。

        0x3签名利用

数字签名具有校验程序是否被非法篡改的功能,针对签名的攻击形式多样,比如Flame病毒曾利用哈希碰撞伪造微软的数字证书[[4]]。一般情况下在带签名的程序后面任意添加数据,签名会显示无效。在前一阶段被使用的前缀程序都没有数字签名,但九月初,我们捕获到了MD5碰撞样本的新版本,碰撞作者巧妙的使碰撞后的样本延用了前缀程序的有效签名。

http://p5.qhimg.com/t015dda68f656dc2dac.jpg

图3-1 加入签名利用的MD5碰撞手法

这阶段碰撞样本的显著特点是,前缀程序中的正常程序大部分是带有签名的msi程序,在其尾部添加了碰撞数据后签名却还是有效的,这主要是利用了msi程序的特性——对任意带签名的msi程序,在其尾部可以任意添加修改附加数据而不影响签名的有效性,如下图所示。于是,MD5碰撞多了数字签名这个保护伞,大大提高了与安全软件的对抗强度。

http://p9.qhimg.com/t01660ad797d0491205.jpg

图3-2 MD5碰撞对中的带签名msi程序添加附加数据后签名仍有效

以下是被利用的msi程序的部分签名列表:



Adobe Systems, Incorporated

Amazon Services LLC

Apple Inc.

IObit Information Technology

March Hare Software Ltd

Microsoft Corporation

Mozilla Corporation

Realtek Semiconductor Corp

TAOBAO (CHINA) SOFTWARE CO.,LTD.

Tencent Technology(Shenzhen) Company Limited

图3-3 部分被利用的msi程序的签名列表

比较特别的是,在此阶段后期发现了一对特殊的碰撞样本,分别是具有有效微软签名的msi程序和腾讯签名的exe程序(如下图)。可见,除了带签名的msi程序外,该碰撞作者也实现了对带签名PE程序的碰撞。

http://p3.qhimg.com/t015888ebc336312fbc.jpg

图3-4 两个程序都带数字签名的碰撞样本

对比一下碰撞后的腾讯exe文件和原始程序:

http://p5.qhimg.com/t01617b4afc3766f144.jpg

图3-5 带签名PE程序碰撞后的文件与原始文件的对比

可以看出,碰撞作者对PE文件结构的Security数据目录进行了修改,说明其改变了签名信息的大小,扩充了尾部签名串的数据长度,并且修改了对应的签名数据以保证签名的有效性,从而达到和msi程序的签名“漏洞”一样的效果。

        0x4双签名验证

2015年11月初,发现了碰撞作者的新动向,他给一个程序构造两种不同的数字签名。如图,这个恶意样本在未打补丁的win7系统只看到一个无效的签名,而在更新过补丁[[5]]的win7系统中却显示了两个不同的数字签名,第一个签名仍是无效签名,而第二个则是正常的签名。

http://p7.qhimg.com/t01b3b3b6599b2cca25.jpg

图4-1 双签名样本在不同的系统环境中的签名显示

碰撞作者这是有意识的利用双签名对抗安全软件的签名验证,因为那些在旧系统中运行正常的签名验证程序,在升级到支持双签名后的系统中可能会爆发出严重的验证逻辑漏洞。

为了说明这个手法,用两个小工具[[6]],分别在旧系统和支持双签名的系统中进行签名校验。

http://p7.qhimg.com/t01026aa8359c4ee2eb.jpg

图4-2 在未打补丁的win7系统中对双签名样本进行校验

上图是在未打补丁的win7系统中对样本进行签名校验的结果,第一步验证签名有效性时就出错,即使第二步获取的签名串真实存在,签名验证的结果也是失败。而如果是在更新了补丁的Win7系统下使用同一套工具对同一个样本进行签名校验:

http://p1.qhimg.com/t0142da70e015d87558.jpg

图4-3 在更新过补丁的win7系统中对双签名样本进行校验

如图,第一步验证签名完整性时显示签名正常,第二步获取签名信息的时候只获取了第一个签名串的信息,从而这个原本无效的伪造签名可能会被认为是有效的。之所以这样是因为,旧系统中不支持双签名,编写签名验证程序时一般就默认一个程序只有一个数字签名。

同样,如果安全软件在系统升级后没有考虑到双签名验证的情况,很有可能按照类似“正常”的逻辑判定这个恶意样本伪造的签名有效。可见,碰撞作者是想钻双签名验证这个空子来绕过签名验证。

        0x5典型攻击流程分析

下面以2015年12月的样本为例分析恶意程序的攻击流程。

首先查看样本的数字签名,发现具有一个伪造的无效签名,但是当程序运行触发恶意行为之后,签名的状态却神奇般地变成有效的:

http://p8.qhimg.com/t0105e553ba05e0450f.jpg

图5-1 安装样本运行前后数字签名的状态对比

为了找出这种现象的原因,具体分析该样本的代码。此样本是经过NSIS打包的安装程序,解包得到脚本和其他资源文件。分析安装脚本,该恶意程序首先对运行环境进行检测:

http://p0.qhimg.com/t01da8f5aebfab0e874.jpg

图5-2 安装脚本对运行环境进行检测

通过系统调用遍历进程,检测的部分进程列表如下图所示,其中大部分是网吧或分析调试的系统环境,猜测是为了控制样本传播的范围:

http://p3.qhimg.com/t01f5c4debdc71dff64.jpg

图5-3 安装程序检测的部分进程列表

然后程序会判断自身的文件名是否为“s*.exe”,并且检测启动该程序的父进程是否为桌面进程,目的是避免下载该程序的用户直接点击运行触发恶意行为引起注意,而只让该程序作为被其他程序推广启动时才触发:

http://p8.qhimg.com/t01de979e87399044d6.jpg

http://p3.qhimg.com/t01e90d584e81ae52f5.jpg

图5-4 安装程序判断程序文件名与父进程

当文件名判断不通过时,程序作为桌面日历安装包运行,不触发恶意行为。

http://p6.qhimg.com/t01f624b1c6bf58e24d.jpg

图5-5 安装程序不触发恶意行为的运行界面

当符合所有触发条件时,就可以触发恶意行为:安装程序会静默下载碰撞作者服务器上的加密压缩文件update003.zip,使用特殊密码解压后执行其中的gpmc.msi程序,最后又清理了作案现场。恶意行为的主要程序代码如下图所示:

http://p3.qhimg.com/t01b95baa04d6a50352.jpg

图5-6 安装程序的主要恶意代码

从update003.zip解密得到的两个文件gpmc1.msi和gpmc1.cab,gpmc1.msi程序负责解压gpmc1.cab文件并调用其中的正常编译工具NMAKE.exe,gpmc1.cab文件解压如下:

http://p2.qhimg.com/t018e877e67f6db718a.jpg

图5-7 gpmc1.cab压缩包内文件列表

NMAKE.exe被运行后,makefile文件中的命令就会执行,通过这种特殊的方式实现由正常的程序连续调用外部的恶意程序:

http://p4.qhimg.com/t0137bbd24440c0bf41.jpg

图5-8 makefile文件的调用命令

这里关注u.exe这个程序,它其实是微软官方的根证书列表更新工具updroots:

http://p5.qhimg.com/t01fda8b7c3fdecf48e.jpg

图5-9 数字签名根证书数据导入工具

利用该工具导入事先伪造好的一份CA根证书数据文件u,结果会在系统注册表的根证书路径添加一个信任项,并导入伪造的CA证书公钥等相关数据:

http://p4.qhimg.com/t014212d252a784b501.jpg

图5-10 用户系统被导入的根证书数据路径

恶意程序通过这样的方式在系统种下了一颗种子,这颗种子将导致共用这一个CA认证的伪造签名被验证为信任状态,如果不清除该数据项,被感染的系统将从此对碰撞作者所有具有伪造签名的程序信任。

就本例样本来说,在后面会被调用的日历主程序DesktopGoodCalendar.exe的签名也变为有效的:

http://p5.qhimg.com/t01c7c0fc57167a7731.jpg

图5-11 主程序的另一个数字签名前后状态对比

DesktopGoodCalendar.exe是个加了强壳的delphi程序,运行之后仍先检测运行环境,通过临时目录下的两个文件日志判断安装程序的文件名和父进程:

http://p3.qhimg.com/t017ee84ab570c591b8.png

图5-12 主程序的通过两个文件内容判断运行环境

当恶意条件满足,先把用户机器的信息回传服务器:

http://p9.qhimg.com/t018ddf21dfe35d79a9.png

图5-13 回传用户机器的信息

接着依次从不同的url下载几张画面相同的图片:

http://p6.qhimg.com/t0154c9b416a0f1fbae.png

图5-14 碰撞作者使用的加密图片

每次下载一张如上的图片,都会使用同一个算法解密其中的附加数据,并使用解密数据进行下一步操作,大致的操作过程如下:

1、解密“http://www.ci***k.com/images/if.jpg”得到一个进程列表进行分析环境检测:

http://p7.qhimg.com/t011809189034b16f28.png

图5-15 第一张图片解密后的内容

2、解密“http://www.ci***k.com/images/before*.jpg”得到下一张图片下载地址:

http://p6.qhimg.com/t0173e9a0b86ae7998a.png

图5-16 第二张图片解密后的内容

3、根据上一步得到的下载地址解密其图片得到一个恶意的PE程序,如下为解密得到PE程序的示意图,以及分别从两例地址的图片解密得到的程序图标:

http://p2.qhimg.com/t0191fb05812e47f752.jpg

http://p7.qhimg.com/t01a718330e9479ccc7.png

图5-17 第三张图片解密后的得到恶意程序2例

经过上述的下载、解密,最后将得到的PE程序注入一个svchost的傀儡进程中并启动:

http://p6.qhimg.com/t016d22649ee6ef8417.jpg

http://p1.qhimg.com/t015169ebaac66e9b99.png

图5-18 主程序将恶意程序注入傀儡进程的过程跟踪

由此,新的一个恶意程序悄然在系统进程中运行起来,后续的动作也全凭碰撞作者布局控制,可以方便、隐蔽地进行各种流氓活动。历史上曾从受害用户现场发现过其会劫持浏览器主页,使之跳转到带有商业推广渠道标识的某导航网站,从而为碰撞作者达到盈利的目的。

以下为整体攻击行为的流程图:

http://p6.qhimg.com/t01146ac590ff83c170.jpg

图5-19 整体攻击流程图

        0x6传播及影响

新型MD5碰撞样本在2015年初开始大规模传播,经过统计发现,仅2015年受该类恶意软件影响的用户数量就达到5584939个,下图为在全国各地区受影响的用户分布,主要集中在人口密集地区,其中广东省是重灾区,传播量达到60多万。

http://p1.qhimg.com/t0188f60b3d036f3558.png

图6-1 2015年全国各地区受影响的用户数量分布图

从传播时间来看,该类恶意软件以5月份传播量最高,达到130万左右的量级,如下图所示。

http://p4.qhimg.com/t014c64d5aa688b121c.png

图6-2 2015年各月份受影响用户量

通过对该类恶意软件的种类和来源进一步梳理,发现碰撞作者的主营软件是以天气、日历类软件的形式,通过各种渠道在网络中传播,其业务链及主要传播途径如下所示:

http://p4.qhimg.com/t01af7eb3d651cdf30b.jpg

图6-3 碰撞作者的主要业务软件及传播途径

1、借助流氓软件推广渠道进行传播。经统计,视频聊天、下载器、外挂辅助和影音播放器等类型的软件都推广过碰撞作者的恶意软件。它们在推广时,会主动连接碰撞作者的服务器下载最新的恶意程序到用户电脑进行安装,整理2015年碰撞作者使用的主要传播服务器如下:

https://img8.php1.cn/3cdc5/15d29/711/b13dfe9adf55b371.png

图6-4 碰撞作者2015年使用的主要传播服务器

2、上传到正规软件下载站提供给用户搜索和下载。以下为在某下载站发现的碰撞样本:

http://p3.qhimg.com/t0126930f7ec61b19e3.jpg

图6-5 下载站传播

3、伪装成热门资料分享到网盘中诱导用户主动下载安装。恶意软件用炒股技巧、考研英语等诱惑性的文件名打包,如下图所示:

http://p9.qhimg.com/t0102e90a46a82eed1b.jpg

图6-6 网盘分享传播

4、官网和其他渠道传播。2015年9月份碰撞作者软件官网截图如下:

http://p1.qhimg.com/t019cfa8686c0bdc4d3.jpg

图6-7 恶意软件官网传播

通过以上各种传播渠道,碰撞作者的恶意软件最终到达用户电脑潜伏下来,每次用户电脑启动也跟着运行,并伺机进行主页劫持等推广行为进行盈利,即使一些用户想要将之完全卸载也很难,给广大普通用户造成了无尽的烦恼。网上搜索相关的恶意软件名称,会发现很多普通用户的反馈,如下图:

http://p5.qhimg.com/t01aa2ec268bcff8a75.jpg

图6-8 用户在网上反馈的声音

从上述的恶意软件演化、传播过程可以看出,碰撞作者费尽心思提高对抗技术、扩展传播渠道,其目的只有一个:金钱至上。虽然碰撞作者为了自己的私利,不顾广大群众的用户体验而利用互联网来污染用户的电脑,但是好在用户的身后还有一批与之不懈对抗的安全软件来保驾护航,以下为360安全卫士对此类碰撞恶意软件进行拦截查杀的截图。在这场没有硝烟的战争中,对抗还将继续,感谢广大用户一直以来对360的支持。

http://p1.qhimg.com/t01c994b8df7571bef4.jpg

图6-9 360安全卫士对新型碰撞类恶意软件的拦截查杀


[[1]] 早在2007年就由Marc Stevens提出并实现了该方法的MD5碰撞。

[[2]] 开源的hash碰撞工具,具体可参见project hash clash的开源代码:https://marc-stevens.nl/p/hashclash/

[[3]]下文将介绍到碰撞作者主营软件为桌面天气、日历类软件,其组件包括安装包、主程序和动态连接库等

[[4]] Freebuf曾对此做过报导,参见http://www.freebuf.com/news/3482.html

[[5]] 详见微软对多签名支持的安全公告:https://technet.microsoft.com/zh-cn/library/security/3033929.aspx

[[6]] 签名校验相关的开源代码编译的小工具,一个为校验签名的有效性,另一个则是提取签名字符串


推荐阅读
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析
    基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 在Python中,利用MD5哈希算法生成密码值是一种常见的安全措施。本文详细介绍了MD5算法的基本原理及其在密码学中的应用,探讨了如何使用Python标准库中的`hashlib`模块来实现MD5哈希值的生成,并讨论了其在实际项目中的应用场景和潜在的安全风险。此外,文章还提供了代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • Flowable 流程图路径与节点展示:已执行节点高亮红色标记,增强可视化效果
    在Flowable流程图中,通常仅显示当前节点,而路径则需自行获取。特别是在多次驳回的情况下,节点可能会出现混乱。本文重点探讨了如何准确地展示流程图效果,包括已结束的流程和正在执行的流程。具体实现方法包括生成带有高亮红色标记的图片,以增强可视化效果,确保用户能够清晰地了解每个节点的状态。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • 每年,意甲、德甲、英超和西甲等各大足球联赛的赛程表都是球迷们关注的焦点。本文通过 Python 编程实现了一种生成赛程表的方法,该方法基于蛇形环算法。具体而言,将所有球队排列成两列的环形结构,左侧球队对阵右侧球队,首支队伍固定不动,其余队伍按顺时针方向循环移动,从而确保每场比赛不重复。此算法不仅高效,而且易于实现,为赛程安排提供了可靠的解决方案。 ... [详细]
  • 基于Dubbo与Zipkin的微服务调用链路监控解决方案
    本文提出了一种基于Dubbo与Zipkin的微服务调用链路监控解决方案。通过抽象配置层,支持HTTP和Kafka两种数据上报方式,实现了灵活且高效的调用链路追踪。该方案不仅提升了系统的可维护性和扩展性,还为故障排查提供了强大的支持。 ... [详细]
  • 本文通过具体实例详细分析了哈希冲突的原因及其潜在影响,并探讨了多种有效的解决策略。研究不仅涵盖了MD5等常用哈希算法的局限性,还提出了基于哈希表扩展、双哈希技术和布隆过滤器等方法的综合解决方案,以提高数据处理的可靠性和效率。 ... [详细]
  • 本文详细解析了微信服务端示例类的功能与应用。其中,`ClientResponseHandler` 类主要用于处理微信支付所需的响应数据,而 `TenpayHttpClient` 则是对 HTTP 请求(包括 GET 和 POST 方法)进行了封装,以便在内部调用时更加便捷和高效。这些工具类在实际开发中起到了关键作用,开发者无需深入了解其底层实现细节,即可轻松集成微信支付功能。 ... [详细]
  • 探索聚类分析中的K-Means与DBSCAN算法及其应用
    聚类分析是一种用于解决样本或特征分类问题的统计分析方法,也是数据挖掘领域的重要算法之一。本文主要探讨了K-Means和DBSCAN两种聚类算法的原理及其应用场景。K-Means算法通过迭代优化簇中心来实现数据点的划分,适用于球形分布的数据集;而DBSCAN算法则基于密度进行聚类,能够有效识别任意形状的簇,并且对噪声数据具有较好的鲁棒性。通过对这两种算法的对比分析,本文旨在为实际应用中选择合适的聚类方法提供参考。 ... [详细]
  • 求助高手:下载的压缩包中包含CMake文件,如何在Windows环境下使用已安装的CMake GUI进行运行?
    从GitHub仓库 `https://github.com/vonmax007/RobotSimulation` 下载的代码包含多种算法,其中算法1的文件目录中包含了CMake文件。为了在Windows环境下使用已安装的CMake GUI运行这些文件,需要先确保CMake已正确安装,并按照以下步骤操作:打开CMake GUI,设置源代码路径和构建路径,点击“Configure”配置项目,然后点击“Generate”生成构建文件。最后,在生成的构建目录中使用命令行或IDE进行编译和运行。 ... [详细]
author-avatar
小--瑜Gg
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有