分析 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 ...
随机推荐
- dijskra算法(求正权图中最短路)
思想:每次找到离原点最近的顶点,以这个点为中心扩展松弛,更新其余点到原点的最短路径. 注意:if(e[u][v]>x)e[u][v]=x; book[ ]数组标记最短路程的顶点集合 #inclu ...
- 超图iserver登录密码忘记,重置密码
如果大家在用超图iserver发布服务的过程中将登录密码忘记,大家不要慌,iserver自带的有密码重置功能. 1.首先在登录过程中提示密码错误,具体内容如下图所示: 2.首先先停止iserver服务 ...
- LeetCode(42.接雨水)多解法详解
接雨水解法详解: 题目: 基本思路:从图上可以看出要想接住雨水,必须是凹字形的,也就是当前位置的左右两边必须存在高度大于它的地方,所以我们要想知道当前位置最多能存储多少水,只需找到左边最高处max_l ...
- Dockerfile极简入门与实践
前文中,罗列了docker使用中用到的基本命令 此文,将会对怎样使用Dockerfile去创建一个镜像做简单的介绍 Dockerfile命令 要开始编写Dockerfile,首先要对相关的命令有个清晰 ...
- JavaScipt创建函数的方法
JavaScipt的函数的定义有三种方式: 一.命名函数定义 1.JavaScript 函数通过 function 关键词进行定义,其后是函数名和括号 (). 2.函数名可包含字母.数字.下划线和美 ...
- Unity引擎入门——制作第一个2D游戏(1)
Unity作为当今最流行的游戏引擎之一,受到各大厂商的喜爱. 像是炉石传说,以及最近的逃离塔克夫,都是由unity引擎开发制作. 作为初学者的我们,虽然无法直接做出完成度那么高的作品,但每一个伟大的目 ...
- Linux - Ubuntu18.04下更改apt源为阿里云源
进入apt目录,备份原来的源地址 cd /etc/apt mv ./source.list ./source.list.bak 修改源文件source.list vim source.list 更换阿 ...
- JVM基础结构与字节码执行引擎
JVM基础结构 JVM内部结构如下:栈.堆. 栈 JVM中的栈主要是指线程里面的栈,里面有方法栈.native方法栈.PC寄存器等等:每个方法栈是由栈帧组成的:每个栈帧是由局部变量表.操作数栈等组成. ...
- js 实现浏览器全屏效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 分享layui的table的一些小技巧,前端分页
最近一直在折腾报表,期间使用了layui的table做展示(版本号:2.5.5) 起初:以为是查询结果出来后,前端和服务端分页一弄就完事了,参考例子,但是sql写得太长太长了,翻页困难,数据库是老旧的 ...