分析 Nanocore
Nanocore是一个非常强大的木马控制系统,当Nanocore木马运行时,我们发现Windows Defender可以很好地识别威胁。本文的目的是分析Nanocore的传播方式,它是怎样感染Windows系统的。
样本是一个名为“eml_-_PO20180921.doc”的word文档,打开后,你会看到黄色的安全警告信息。这是因为文档中包含有宏代码。当Victim点击"Enable Content"之后,宏代码(即VBA代码)就会默默自动执行。

通过分析该VBA代码,可以看出这段宏代码的作用是从远端服务器下载一个可执行程序( “hxxp://www.wwpdubai.com/wp-content/plugins/jav/inv.exe” ),并将其保存至本地(“%temp% \CUVJN.exe”),最后执行它。但是CUVJN.exe并非Nanocore。请继续往下看。

接下来,我们仔细分析CUVJN.exe。用 .Net debugger dnSpy打开CUVJN.exe,发现程序会从资源区不断地加载数据块,最后把这些数据块解密数据并生成一个新的PE文件。


这个新的PE文件名为 “dll.exe”。下面这段代码中,“МđыдĐäѦГБуѦ”调用了主程序 “main” , 参数 “crap” 包含 “main” 功能。
public static void МđыдĐäѦГБуѦ(object fileName, object crap)
{
checked
{
try
{
NewLateBinding.LateCall(crap, null, "invoke", new object[]
{null, new object[0] }, null, null, null, true);
int num = 0;
object instance;
[ ... ]
“dll.exe”是一个守护进程。我们继续研究 main() 函数。首先它建立了一个 Mutex锁,检查进程是否存在。接下来,它检查Victim机器上是否已经加载了"“snxhk.dll” ,进而判断"Avast 是否已经在运行。如果 Avast已经在运行,它继续等待直到Avast被卸载。Avast是一个反病毒软件, “snxhk.dll” 是其模块之一。
public static void avast() {
try {
IntPtr moduleHandle = RunPE.GetModuleHandle("snxhk.dll");
while (moduleHandle != IntPtr.Zero) {
moduleHandle = RunPE.GetModuleHandle("snxhk.dll");
Thread.Sleep(500);
}
}
catch (Exception ex)
{ }
}
接下来执行与上述行为类似的工作,从资源区中加载数据并组成一个gzip档案。解压后又形成了一个新的PE文件,这次是NanoCore RAT核心客户端。
public static byte[] DEC(byte[] ThrowApples, int VAR12 = 70)
{
int num = 0;
GZipStream gzipStream = new GZipStream(new MemoryStream(ThrowApples), CompressionMode.Decompress, true);
int num2 = ThrowApples.Length;
byte[] result;
try
{
byte[] array;
for (;;)
{
array = (byte[])Utils.CopyArray((Array)array, new byte[num + num2 + 1]);
int num3 = gzipStream.Read(array, num, num2);
if (num3 == 0)
{ break; }
num += num3;
}
array = (byte[])Utils.CopyArray((Array)array, new byte[num - 1 + 1]);
result = array;
}
[ … ]
在执行NanoCore之前,它执行了一些检查。它检测当前进程的路径是否是“%AppData%\Microsoft\Windows\ScreenToGif\netprotocol.exe”。很显然,这里会返回False,因为我们仍然在CUVJN.exe进行中,路径为“%temp%\CUVJN.exe”。接下来,程序会停止CUVJN.exe的运行,并将其拷贝至 “%AppData%\Microsoft\Windows\ScreenToGif\” ,并重命名为 “netprotocol.exe”。之后,它建立一个新的Process对象,并调用它的Start函数。最后,它调用 “ProjectData.EndApp()"中止CUVJN.exe进程。

netprotocol.exe实际上是CUVJN.exe,它做的工作和CUVJN.exe差不多是相同的。唯独在程序中止的地方不同,netprotocol.exe在最后检查自己的绝对路径时,发现已经是netprotocol.exe,中止运行。
"dll.exe"是一个守护进程,它派生了"netprotocol.exe",插入Nanocore进内存,然后运行它。dll.exe的一个重要任务就是让netprotocol.exe中的Nanocore可以不被杀死,正常运行。dll.exe有一个类称作"ProjectMe",它有一个成员函数Project.Protect来保护自己不被杀死。"netprotocol.exe"既不是一个系统进程,也没有更高的权限,但"netprotocol.exe"不能被杀死,这很让人吃惊。下面看一下这个Protect函数
[DllImport("ntdll.dll")]
private static extern IntPtr ZwSetInformationProcess(IntPtr _1, IntPtr _2, IntPtr _3, IntPtr _4);
public static void Protect()
{
ProtectMe.ZwSetInformationProcess(ProtectMe.GetCurrentProcess(), (IntPtr)33L, (IntPtr)ProtectMe.VarPtr(-2147421911), (IntPtr)4L);
最后我发现,它调用了NTDLL.dll中的 ZwSetInformationProcess函数。这个函数可以修改进程状态,这就是为什么我杀不掉该进程的原因。
有一个名为 “RunPE.doIt()”的函数用于保护NanoCore RAT 客户端。它调用CreateProcessA开启一个新的 “netprotocol.exe”,然后再中止它。接下来,它分配新的内存给“netprotocol.exe” ,并调用WriteProcessMemory将NanoCore 插入新分配的内存。最后,它修改线程的进入点为NanoCore的进入点,调用ResumeThread继续进行NanoCore。NanoCore隐藏得很深,它的代码被混淆了。

一旦 “netprotocol.exe”开始执行,它会在 “%AppData%”目录下建立类似于“AA401429-5100-45C4-9496-689224150CC3” 的目录,此外还会建立大量的子目录,比如“DHCP Manager” 和 “Logs”,然后拷贝 “netprotocol.exe” 到“DHCP Manager”,并重命名为“dhcpmgr.exe”。然后它会在Windows注册表中的“DHCP Manager” 下面建立一个自动运行的项,路径是“dhcpmgr.exe”的位置。

Logs子目录包含了该系统中所有登录用户的行为数据。可以使用WinHex查看 .dat文件以获取详细信息 。

分析 Nanocore的更多相关文章
- alias导致virtualenv异常的分析和解法
title: alias导致virtualenv异常的分析和解法 toc: true comments: true date: 2016-06-27 23:40:56 tags: [OS X, ZSH ...
- 火焰图分析openresty性能瓶颈
注:本文操作基于CentOS 系统 准备工作 用wget从https://sourceware.org/systemtap/ftp/releases/下载最新版的systemtap.tar.gz压缩包 ...
- 一起来玩echarts系列(一)------箱线图的分析与绘制
一.箱线图 Box-plot 箱线图一般被用作显示数据分散情况.具体是计算一组数据的中位数.25%分位数.75%分位数.上边界.下边界,来将数据从大到小排列,直观展示数据整体的分布情况. 大部分正常数 ...
- 应用工具 .NET Portability Analyzer 分析迁移dotnet core
大多数开发人员更喜欢一次性编写好业务逻辑代码,以后再重用这些代码.与构建不同的应用以面向多个平台相比,这种方法更加容易.如果您创建与 .NET Core 兼容的.NET 标准库,那么现在比以往任何时候 ...
- UWP中新加的数据绑定方式x:Bind分析总结
UWP中新加的数据绑定方式x:Bind分析总结 0x00 UWP中的x:Bind 由之前有过WPF开发经验,所以在学习UWP的时候直接省略了XAML.数据绑定等几个看着十分眼熟的主题.学习过程中倒是也 ...
- 查看w3wp进程占用的内存及.NET内存泄露,死锁分析
一 基础知识 在分析之前,先上一张图: 从上面可以看到,这个w3wp进程占用了376M内存,启动了54个线程. 在使用windbg查看之前,看到的进程含有 *32 字样,意思是在64位机器上已32位方 ...
- ZIP压缩算法详细分析及解压实例解释
最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...
- ABP源码分析一:整体项目结构及目录
ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...
- HashMap与TreeMap源码分析
1. 引言 在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...
随机推荐
- 高并发解决方案限流技术-----使用RateLimiter实现令牌桶限流
1,RateLimiter是guava提供的基于令牌桶算法的实现类,可以非常简单的完成限流特技,并且根据系统的实际情况来调整生成token的速率.通常可应用于抢购限流防止冲垮系统:限制某接口.服务单位 ...
- Win10远程桌面发生身份验证错误,要求的函数不受支持
昨儿个使用远程桌面,意外发的发现连不上测试环境了.身边的同事也有连不上的.一开始以为是远程机器可能出了问题,但是而后排查确认是自个儿机器问题.原因在与机器前天晚上自动升级了系统补丁,也有部分网友反映了 ...
- Mac OSX安装 Django MySQL mysqlclient
Python3.6 $ brew install mysql-connector-c # 如果没有安装brew,先安装:# 安装可以查看:https://www.cnblogs.com/Jokergu ...
- [vijos1554&bzoj1411]硬币游戏<快速幂>
题目链接:https://vijos.org/p/1554 http://www.lydsy.com/JudgeOnline/problem.php?id=1411 这题真的淫*QAQ... 一看题还 ...
- vue2.0 操作数组下标不跟新ui,使用set()或$forceUpdate 也不能跟新视图情况
在vue 2.0 中操作数组不跟新ui图,即使使用set()或 $forceUpdate也不能跟新视图,我在前段时间也遇到了一个问题,当时我使用的时element 的tree 组件 由于需要对tree ...
- A 大地魂力
时间限制 : - MS 空间限制 : - KB 评测说明 : 1s,256m 问题描述 奶牛贝西认为,要改变世界,就必须吸收大地的力量,贝西把大地的力量称为魂力.要吸取大地的魂力就需要在地上开出 ...
- WEB缓存系统之varnish缓存项修剪
前文我们聊了下varnish的状态引擎和不同类型的变量对应该使用在那个状态引擎中,以及每个状态引擎的对应处理事务:回顾请参考https://www.cnblogs.com/qiuhom-1874/p/ ...
- 值传递:pass by value(按值传递) 和 pass by reference(引用传递)-[all]-[编程原理]
所有的编程语言,都会讨论值传递问题. 通过一个js示例直观认识 //理解按值传递(pass by value)和按引用传递(pass by reference) //pass by value var ...
- Vue点击当前元素添加class 去掉兄弟的class
<div id="app"> <ul> <li v-for="(todo, index) in todos" v-on:click ...
- ERROR:TypeError: Cannot read property 'upgrade' of undefined