作者 | 杨秀璋,责编 | 夕颜

来源 | CSDN博客

头图 | CSDN 下载自东方 IC

出品 | CSDN(ID:CSDNnews)

这篇文章将详细讲解WannaCry蠕虫的传播机制,带领大家详细阅读源代码,分享WannaCry勒索病毒是如何传播感染的。作者分析该病毒一个月,一方面觉得自己技术菜,另一方面深知系统安全需要坚持,继续加油。希望文章对您有所帮助~

本文参考了github、安全网站和参考文献中的文章(详见参考文献),并结合自己的经验和实践进行撰写,也推荐大家阅读参考文献。

作者的github资源:

软件安全:https://github.com/eastmountyxz/Software-Security-Course

其他工具:https://github.com/eastmountyxz/NetworkSecuritySelf-study

Wannacry分析:https://github.com/eastmountyxz/WannaCry-Experiment

WannaCry背景

2017年5月12日,WannaCry蠕虫通过永恒之蓝MS17-010漏洞在全球范围大爆发,感染大量的计算机。WannaCry勒索病毒全球大爆发,至少150个国家、30万名用户中招,造成损失达80亿美元,已影响金融、能源、医疗、教育等众多行业,造成严重的危害。

WannaCry是一种“蠕虫式”勒索病毒软件,由不法分子利用NSA泄露方程式工具包的危险漏洞“EternalBlue”(永恒之蓝)进行传播。该蠕虫感染计算机后会向计算机中植入敲诈者病毒,导致电脑大量文件被加密。

WannaCry利用Windows系统的SMB漏洞获取系统的最高权限,该工具通过恶意代码扫描开放445端口的Windows系统。被扫描到的Windows系统,只要开机上线,不需要用户进行任何操作,即可通过SMB漏洞上传WannaCry勒索病毒等恶意程序。

WannaCry利用永恒之蓝漏洞进行网络端口扫描攻击,目标机器被成功攻陷后会从攻击机下载WannaCry蠕虫进行感染,并作为攻击机再次扫描互联网和局域网的其他机器,行成蠕虫感染大范围超快速扩散。

木马母体为mssecsvc.exe,运行后会扫描随机IP的互联网机器,尝试感染,也会扫描局域网相同网段的机器进行感染传播,此外会释放敲诈者程序tasksche.exe,对磁盘文件进行加密勒索。木马加密使用AES加密文件,并使用非对称加密算法RSA 2048加密随机密钥,每个文件使用一个随机密钥,理论上不可攻破。同时@WanaDecryptor@.exe显示勒索界面。其核心流程如下图所示:

WannaCry勒索病毒主要行为是传播和勒索。

  • 传播:利用基于445端口的SMB漏洞MS17-010(永恒之蓝)进行传播

  • 勒索:释放文件,包括加密器、解密器、说明文件、语言文件等;加密文件;设置桌面背景、窗体信息及付款账号等。

WannaCry传播机制源码详解

WannaCry蠕虫主要分为两个部分:蠕虫部分用于病毒传播,并释放出勒索程序;勒索部分用于加密用户文件索要赎金。大家可能看到的很多样本都是没有传播部分代码或域名开关的。接下来是作者一点点的摸索,希望对您有所帮助,也欢迎批评和指正。

1.WannaCry蠕虫传播流程

WannaCry运行的整体流程推荐安天公司的框架图,如下图所示:

  • 主程序文件利用漏洞传播蠕虫,运行WannaCry勒索程序

  • WannaCry勒索程序释放tasksche.exe,对磁盘文件进行加密勒索

  • @WanaDecryptor@.exe显示勒索信息,运行TOR客户端

其中,图中上半部分为WannaCry蠕虫的传播部分,该蠕虫通过网络进行传播,有自我复制和传播迅速等特点。传播步骤如下:

(1) 连接远程域名开关

(2) 判断参数个数,选择蠕虫安装流程或服务传播流程

  • <2时,进入安装流程,点击直接运行

① 创建服务:服务名称mssecsvc2.0,参数为–m security

② 释放并启动tasksche.exe程序

  • ≥2时,进入服务传播流程

① 服务函数中执行传播感染功能

② 打开mssecsvc2.0服务并设置其状态

③ 蠕虫初始化操作后,会进行局域网和公网传播(建立局域网或公网IP表,创建IP线程)

④ 尝试连接445端口,测试是否存在SMB漏洞

⑤ 如果存在漏洞,则建立通信连接并发送Payload(X86或X64)进行攻击

⑥ 执行shellcode并使用APC注入将生成的dll注入到进程lsass.exe

⑦ dll调用导出函数PlayGame,释放资源文件并保存为mssecsvc.exe执行

作者的分析工具主要是IDA Pro静态分析和OllyDbg动态调试,大家分析恶意样本一定在虚拟机中,并做好相关安全保护(如断网、物理隔离、共享协议端口关闭等)。

2.程序入口Start

通过OD打开样本wcry.exe,发现程序入口地址为0x00409A16,对应start()函数。

通过一些初始化设置,紧接着会调用WinMain()函数进入主程序。

主程序调用关系如下图所示,调用地址为0x00409B45。

3.域名开关WinMain

主程序运行后会先连接域名(KillSwitch)hxxp://www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com

  • 如果该域名连接成功,则直接退出且不触发任何恶意行为

  • 如果该域名无法访问,则触发传播勒索行为,执行sub_408090函数

该代码会调用InternetOpenUrl打开对应的网址,并根据其访问情况执行不同的操作。如果网址无法访问,会调用sub_408090()函数创建蠕虫服务。这也意味着如果蠕虫作者注册并访问了该URL,WannaCry蠕虫也就停止了传播。目前该域名已被英国的安全公司接管,网上怀疑该操作能有效防止在线沙箱检测。

4.参数判断sub_408090

接着进入sub_408090函数,通过判断参数个数来执行相应的流程。

  • sub_407F20函数:当参数<2,进入蠕虫安装流程

  • sub_408000函数:当参数≥2,进入蠕虫服务传播流程并创建mssecsvc2.0服务

该函数调用了相关的API函数,比如创建服务(OpenSCManagerA)、打开服务(OpenServiceA)等。当我们直接运行wcry.exe时,传递的参数是1(程序本身),则进入蠕虫安装程序;当我们传递参数3(程序本身、二进制程序、服务参数)时,则进入蠕虫服务传播流程。

推荐绿盟API词典:恶意样本分析手册——API函数篇 - 李东宏

mssecsvc2.0服务对应的数据部分如下图所示,该服务会伪装成微软安全中心的服务,服务的二进制文件路径为当前进程文件路径,参数为“-m security”。

OD动态调试如下图所示,包括调用CALL访问函数,将服务PUSH入栈等。

5.蠕虫安装流程sub_407F20

蠕虫安装流程主要调用sub_407F20函数,包括sub_407C40和sub_407CE0。

(1) sub_407C40:创建mssecsvc2.0服务,并启动该服务,参数为”-m security”,蠕虫伪装为微软安全中心。

(2) sub_407CE0:读取并释放资源tasksche.exe至C:\Windows路径,创建线程运行。

主要调用的函数包括GetProcAddress、MoveFileEx、CreateFile等。

动态调用过程如下图所示:

释放的C:\Windows\tasksche.exe效果如下图所示:

6.蠕虫服务传播流程sub_4080000

当参数≥2时,蠕虫执行服务传播流程,调用sub_4080000实现,其代码如下:

sub_4080000会打开mssecsvc2.0服务并设置其状态,服务设置函数包括RegisterServerCtrlHandlerA、SetServiceStatus。

动态分析过程如下图所示:

核心函数是sub_407BD0,它的功能包括:

  • 初始化操作

  • 局域网传播

  • 公网传播

7.蠕虫初始化操作sub_407B90

蠕虫初始化操作主要调用sub_407B90函数实现,具体功能包括:

  • WSAStartup:初始化网络

  • sub_407620:初始化密码

  • sub_407A20:获取Payload

函数WSAStartup主要是进行相应的Socket库绑定。函数原型如下:

  • int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData)

使用Socket程序之前必须调用WSAStartup函数,以后应用程序就可以调用所请求的Socket库中的其它Socket函数

  • int WSACleanup (void)

应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源

  • gethostbyaddr \ gethostbyname \ gethostname \ getprotolbynumber \ getserverbyname \ getservbyport

Socket接口的检索有关域名、通信服务和协议等Internet信息的数据库函数

继续调用sub_407A20函数从内存中读取MS17-010漏洞利用代码,Payload分为x86和x64两个版本,32位大小为0x4060,64位大小为0xc8a4。

8.局域网传播sub_407720

蠕虫初始化操作后,会生成两个线程,分别进行局域网和公网传播。

  • result = sub_407B90

  • v1 = (void *)beginthreadex(0, 0, sub_407720, 0, 0, 0)

  • v3 = (void *)beginthreadex(0,0, sub_407840, v2, 0, 0)

局域网传播:蠕虫根据用户内网IP,生成覆盖整个局域网网段表,然后循环尝试攻击。

这里存在一个疑问:你怎么能确定v1是局域网传播,而v3是外网传播呢?

在函数sub_407720中,会继续调用线程执行sub_4076B0函数。同时,函数如果同时调用10个以上IP地址,会执行Sleep暂停100毫秒(1秒=1000毫秒)。

  • 核心函数:sub_4076B0

函数sub_407720会调用函数sub_409160,接着调用GetAdaptersInfo获取网卡配置和IP地址详细信息,最终进行局域网IP地址拼接和传播。而外网传播的IP地址是通过四个随机数产生的,通过这些差异就能判断是局域网传播还是外网传播。

函数sub_4076B0会连接445端口,如果445端口连接成功,接着发起漏洞攻击。如果连接超过10分钟则终止该线程。

接下来调用sub_407540函数发起漏洞攻击。

  • 核心函数:sub_407540

9.公网传播sub_407840

公网传播:公网IP地址通过4个随机数拼接而成,然后循环尝试攻击。

sub_407840函数会生成四个随机数,然后调用aDDDD进行IP拼接,表示成%d.%d.%d.%d。0xFF表示255,对应最大地址,v8余数不等于127内网。接着调用sub_407540函数进行外网传播。

  • in_addr_t inet_addr(const char cp)

作用:将一个点分十进制的IP转换成一个长整数型数

参数:字符串,一个点分十进制的IP地址

返回值:如果正确执行将返回一个无符号长整数型数,如果传入的字符串不是一个合法的IP地址,将返回INADDR_NONE

  • char * inet_ntoa(struct in_addr in)

作用:将一个十进制网络字节序转换为点分十进制IP格式的字符串

参数:一个网络上的IP地址

返回值:如果正确,返回一个字符指针,指向一块存储着点分格式IP地址的静态缓冲区;如果错误返回NULL

在sub_407840函数中,继续调用线程执行sub_407540函数,该函数为漏洞利用核心函数。

10.漏洞检测及创建通信连接sub_407540

IP地址拼接好后,会创建漏洞利用线程,调用sub_407540函数。

  • 第一步:检测目标是否可以安装双星脉冲DOUBLEPULSAR(端口445)

如果需要,后续可以分享一篇永恒之蓝和双星脉冲相关知识。

  • 第二步:利用MS17-010漏洞,尝试建立通信连接并发送漏洞利用程序数据包

通过connet建立Socket通信连接,再调用send和recv进行数据包握手确认。最后会调用核心函数sub_406F50。

11.发送SMB数据包sub_4072A0

建立通信连接(connect、send、recv),发送利用Eternalblue的蠕虫SMB数据包。具体流程包括:(还需进一步分析)

  • 建立连接:IP地址、445端口

  • 先发送一个SMB请求

  • 接受正常回复后往SMB做缓冲区溢出

  • 先往SMBv2的缓冲区发数据,然后是往SMBv1发大量数据,最后往SMBv2发数据

  • SMBv1连接关闭后SMBv2附近会产生空洞

  • 形成永恒之蓝攻击后门

  • 最后用双星脉冲来将dll注入有后门主机并运行

12.获取Payload(dll+shellcode)

样本在利用漏洞MS17-010获取目标主机权限后,并不会直接发送蠕虫自身到目标,而是发送一段经过简单异或加密后的Payload到目标机器中执行。在sub_4077A0函数中,v7是系统标记,当v7等于1时表示32位操作系统,当v7等于0时表示64位操作系统。

  • 核心函数:sub_406F50(发送Payload)

Payload由shellcode和包含样本自身的dll组成,Payload分为64位与32位,函数sub_406F50如下图所示。

  • 32位shellcode起始地址0x42E758

  • 64位shellcode起始地址0x42FA60

dll同样分为64位与32位版本,根据目标主机系统的不同,读取不同版本的dll

  • 32位dll起始地址0x40B020,大小为0x4060字节

  • 64位dll起始地址0x40F080,大小为0xc8a4字节

Shellcode相关信息

  • 32位shellcode起始地址0x42E758,大小为0x1305字节

  • 64位shellcode起始地址0x42FA60,大小为0x1800字节

13.提取shellcode

对应的反汇编代码如下,包括x64_payload_addr、x86_payload_addr。

32位Shellcode获取:0x42E758~0x42FA5D。

64位Shellcode提取:0x42FA60~0x43125F。

14.shellcode分析之安装后门

Shellcode反汇编及功能分析如下:

  • 第一部分:安装后门

  • 第二部分:利用安装的后门,APC向应用程序注入dll

① 查找基地址

② 获取Hash计算方法

③ 根据基地址、函数hash字符查找导出函数地址

④ 查找需要用到导出函数地址并保存导出函数hash对照表

⑤ 查找目标进程,通过hash编码782BF0E7h进程名查找(lsass.exe)

⑥ 使用查到导出函数的地址,并进行APC注入

⑦ 最后将shellcode自身以及其所分配的内存清0

shellcode部分作者还需要进一步研究,加油~

安装后门主要执行sub_401370函数,在远程电脑上安装双星脉冲DOUBLEPULSAR后门。

15.shellcode分析之APC注入

shellcode第二部分是利用安装的后门,APC向应用程序注入dll。

(1) 查找ntoskrnl.exe基地址

首先找到gs[38]处的_KIDTENTRY64指针,在KIDTENTRY64的偏移4,得到中断处理的函数指针,这个地址在ntoskrnl.exe中,我们就找到了ntoskrnl.exe的地址空间,然后去地址空间的页头地址对比PE头MZ,找到则函数返回。

(2) 获取Hash计算方法

需要使用的函数并没有硬编码写到程序里,而是硬编码了这些函数的hash值。所以我们需要首先知道函数编码和hash值得对应关系。Hash计算方法如下,用c++代码注释了一下。

(3) 根据ntoskrnl.exe基地址、函数hash字符查找导出函数地址

find_func函数如下,有了ntoskrnl.exe所有导出函数hash对照表,整个程序流程就明朗了。

(4) 查找需要用到ntoskrnl.exe导出函数地址并保存备用

(5) 查找目标进程,通过hash编码782BF0E7h进程名查找(lsass.exe)

查找目标进程,通过hash编码782BF0E7h进程名查找,直接没找到“lsass.exe”,查找方法是使用pid暴力查找。具体通过pid调用PsLookupProcessByProcessId得到pEProcess结构指针,再通过pEProcess调用PsGetProcessImageFileName得到进程名。

(6) 使用查到导出函数的地址,并进行APC注入

APC注入,使用查到导出函数的地址,注释见截图。第六个参数包含了第三层shellcode和dll代码,可自行dump出研究,第七个参数指定为usermode。

(7) 最后将shellcode自身以及其所分配的内存清0

内核部分的注入代码主要流程就分析完了,到用户层的shellcode自己实现的一个pe loader而没有使用LoadLibary,这样使得注入更加隐蔽,查询PEB_LDR_DATA的也查不到被注入了dll。

16.dll导出及分析

shellcode使用APC注入将生成的dll注入到系统进程lsass.exe,导出的dll文件如下图所示:

火绒剑检测结果如下,通过APC注入将生成的dll注入到系统进程lsass.exe,接着释放资源mssecsvc.exe,最后释放勒索程序tasksche.exe。

17.释放资源tasksche.exe

dll具有一个导出函数PlayGame,它会将母体程序释放到被攻击的计算机,保存为C:\WINDOWS\mssecsvc.exe并执行。下面是作者分析导出的dll静态代码,主函数PlayGame。

PlayGame包括两个核心函数:sub_180001014和sub_1800010F8。

  • sub_180001014:释放资源

  • sub_1800010F8:运行文件

最后释放资源tasksche.exe(勒索加密程序)到C:\WINDOWS目录下,并将其启动。

被攻击的计算机包含蠕虫的完整功能,除了会被勒索,还会继续使用MS17-010漏洞进行传播,这种传播呈几何级向外扩张,也是该蠕虫短时间内大规模爆发的主要原因。

18.勒索行为

勒索行为下一篇文章将详细介绍

运行病毒程序后的界面如下图所示,已经成功被勒索。再次强调,所有代码必须在虚拟机中执行,并且关闭文件共享。

样本的解压密码是WNcry@2ol7,通过资源工具也可以查看到。解压后的文件结构如下:

msg文件夹下就是所有的语言包。

其他文件内容如下,下一篇文章会详细介绍勒索原理。

  • b.wnry: 中招敲诈者后桌面壁纸

  • c.wnry: 配置文件,包含洋葱域名、比特币地址、tor下载地址等

  • f.wnry: 可免支付解密的文件列表

  • r.wnry: 提示文件,包含中招提示信息

  • s.wnry: zip文件,包含Tor客户端

  • t.wnry: 测试文件

  • u.wnry: 解密程序

总结

写到这里,这篇文章就介绍完毕。主要讲解了WannaCry蠕虫的传播机制,也是作者一个月的研究成果,感觉是全网WannaCry蠕虫传播部分最详细的一篇文章了。最后,感觉自己真的好菜,但也需要加油,希望您喜欢这篇文章~

参考文献

为了更好帮助读者,作者将参考文献提前。下面给出下各大安全厂商及安全大佬对WannaCry蠕虫分析的文章,强烈推荐大家阅读,作者也吸取了它们的精华,在此感谢。

  • 安全厂商样本分析:

[1] 安天针对勒索蠕虫“魔窟”(WannaCry)的深度分析报告

[2] [分享] 勒索病毒WannaCry深度技术分析——详解传播、感染和危害细节 - 火绒安全

[3] WannaCry勒索病毒详细解读 - 腾讯电脑管家

[4] NSA Eternalblue SMB 漏洞分析 - 360核心安全

[5] 针对WannaRen勒索软件的梳理与分析 - 安天

[6] 【权威报告】WanaCrypt0r勒索蠕虫完全分析报告 - 360追日

[7] WannaCry勒索病毒分析报告 - 瑞星

  • 安全大佬样本分析:

[1] 对WannaCry的深度分析 - 鬼手56(勒索部分详解)

[2] [原创]WannaCry勒索软件中“永恒之蓝”漏洞利用分析 - 展博

[3] [原创]通过Wannacry分析内核shellcode注入dll技术 - dragonwang

[4] [病毒分析]WannaCry病毒分析(永恒之蓝) - 小彩虹

[5] WannaCry勒索病毒逆向和内网传播数据分析 - sec360zz

[6] 首发 | Wannacry勒索软件母体主程序逆向分析(含临时解决方案自动化工具)- expsky

[7] [原创]WannaCry深度详细分析报告(很细很深)- anhkgg

[8] https://github.com/rapid7/metasploit-framework

[9] https://www.zhihu.com/question/59792644

原文链接:

https://blog.csdn.net/Eastmount/article/details/105903050

更多精彩推荐
☞阿里云自研数据仓库 AnalyticDB 再捧 TPC 全球冠军
☞自动化神经网络理论进展缓慢,AutoML 算法的边界到底在哪?
☞任正非谈“狼文化”:华为没有 996,更没有 007
☞作词家下岗系列:教你用 AI 做一个写歌词的软件!
☞手把手教你配置VS Code 远程开发工具,工作效率提升N倍☞区块链必读“上链”哲学:“胖链下”与“瘦链上”
你点的每个“在看”,我都认真当成了喜欢

WannaCry 勒索病毒复现及分析,蠕虫传播机制全网源码详细解读 | 原力计划相关推荐

  1. WannaCry勒索病毒复现及分析,蠕虫传播机制全网源码详细解读 | 原力计划

    作者 | 杨秀璋 编辑 | 夕颜 题图 | 东方 IC 出品 | CSDN(ID:CSDNnews) 这篇文章将详细讲解WannaCry蠕虫的传播机制,带领大家详细阅读源代码,分享WannaCry勒索 ...

  2. [网络安全自学篇] 七十三.WannaCry勒索病毒复现及分析(四)蠕虫传播机制全网源码详细解读

    这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步.前文分享了逆向分析OllyDbg动态调试工具的基本用法,包括界面介绍.常用快捷键和T ...

  3. [网络安全自学篇] 七十.WannaCry勒索病毒复现及分析(三)蠕虫传播机制分析及IDA和OD逆向

    这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步.前文分享了宏病毒相关知识,包括宏病毒基础原理.防御措施.自发邮件及APT28样本分 ...

  4. [网络安全自学篇] 六十七.WannaCry勒索病毒复现及分析(一)Python利用永恒之蓝及Win7勒索加密

    这是作者的网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步.前文分享了Vulnhub靶机渗透的DC-1题目,通过信息收集.CMS漏洞搜索.D ...

  5. [网络安全自学篇] 六十八.WannaCry勒索病毒复现及分析(二)MS17-010利用及病毒解析

    这是作者的网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您们喜欢,一起进步.前文分享了通过Python利用永恒之蓝漏洞加载WannaCry勒索病毒,并实现对 ...

  6. Google、微软、阿里、腾讯、百度这些大公司在GitHub上开源投入排名分析 | CSDN原力计划...

    扫码参与CSDN"原力计划" 作者 | 村中少年 来源 | CSDN原力计划获奖作品 现在有越来越多的公司都参与了开源,其背后有各自的目的所在,姑且不予讨论.本文是从多个方面分析各 ...

  7. 全面分析阿里数据中台,小白也能看懂 | CSDN原力计划

    扫码参与CSDN"原力计划" 作者 | yuanziok 来源 | CSDN原力计划获奖作品 数据中台被誉为大数据的下一站,由阿里兴起,核心思想是数据共享,2015年阿里提出&qu ...

  8. [系统安全] 二十七.WannaCry勒索病毒分析 (3)蠕虫传播机制解析及IDA和OD逆向

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  9. [系统安全] 二十八.WannaCry勒索病毒分析 (4)全网“最“详细的蠕虫传播机制解读

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

最新文章

  1. 年报系统课堂讨论记录
  2. mysql多重主键错误,老师,jd_spider中数据插入Mysql时一直显示主键错误,求助~
  3. 【虚拟机】关于VMware 提示“无法获得VMCI驱动程序的版本:句柄无效”的解决方案...
  4. 漫画科普:天线的原理?
  5. circlegan_【源码解读】cycleGAN(二) :训练
  6. Python手写神经网络实现3层感知机
  7. tomcat集群的failover机制
  8. Error creating bean with name 'rocketMQTemplate' defined in class path resource
  9. 计算机中的字体文件夹在哪,字体文件夹,教您怎么找字体文件夹
  10. 电脑tf卡检测不到_为什么电脑不识别TF卡?
  11. 获取 rabbitmq 实时数据
  12. 山大计算机学院夏令营2021,关于举办山东大学2021年暑期未来数学家夏令营的通知...
  13. 微信自媒体账号涉违规大规模被封
  14. 英语快照1---英语正能量
  15. unity种四种光源
  16. 5分钟带你看完 WWDC 2018
  17. GDR(Gradual Decoder Refresh)帧
  18. 微软最走运和最倒霉的十个瞬间
  19. gps定位器更换平台指令-GPS定位器接入平台指令
  20. 【大数据面试题】(二)Hive 相关面试题总结

热门文章

  1. 某厂大牛花一周整的Java八股文面试题,小白学了也能快速进大厂
  2. 计算机一级excel单元格,2009计算机一级:自定义单元格格式-自定义Excel(5)1
  3. UML 关系-画图(箭头,符号)对照表
  4. 最懂程序员面试的人,不一定是最优秀的开发者
  5. Virtualbox 动态虚拟磁盘文件.vdi文件压缩瘦身方法
  6. 外汇天眼:HAITONG FUTURES海通期货被山寨!受害者:到底哪个是真的?
  7. mysql根据两个字段查重
  8. Linux系统上刻录光盘
  9. Rapidshare-video-tutorial
  10. random的七种用法