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的更多相关文章

  1. alias导致virtualenv异常的分析和解法

    title: alias导致virtualenv异常的分析和解法 toc: true comments: true date: 2016-06-27 23:40:56 tags: [OS X, ZSH ...

  2. 火焰图分析openresty性能瓶颈

    注:本文操作基于CentOS 系统 准备工作 用wget从https://sourceware.org/systemtap/ftp/releases/下载最新版的systemtap.tar.gz压缩包 ...

  3. 一起来玩echarts系列(一)------箱线图的分析与绘制

    一.箱线图 Box-plot 箱线图一般被用作显示数据分散情况.具体是计算一组数据的中位数.25%分位数.75%分位数.上边界.下边界,来将数据从大到小排列,直观展示数据整体的分布情况. 大部分正常数 ...

  4. 应用工具 .NET Portability Analyzer 分析迁移dotnet core

    大多数开发人员更喜欢一次性编写好业务逻辑代码,以后再重用这些代码.与构建不同的应用以面向多个平台相比,这种方法更加容易.如果您创建与 .NET Core 兼容的.NET 标准库,那么现在比以往任何时候 ...

  5. UWP中新加的数据绑定方式x:Bind分析总结

    UWP中新加的数据绑定方式x:Bind分析总结 0x00 UWP中的x:Bind 由之前有过WPF开发经验,所以在学习UWP的时候直接省略了XAML.数据绑定等几个看着十分眼熟的主题.学习过程中倒是也 ...

  6. 查看w3wp进程占用的内存及.NET内存泄露,死锁分析

    一 基础知识 在分析之前,先上一张图: 从上面可以看到,这个w3wp进程占用了376M内存,启动了54个线程. 在使用windbg查看之前,看到的进程含有 *32 字样,意思是在64位机器上已32位方 ...

  7. ZIP压缩算法详细分析及解压实例解释

    最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...

  8. ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

  9. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

随机推荐

  1. 044.集群存储-StorageClass

    一 StoragClass 1.1 StorageClass概述 StorageClass作为对存储资源的抽象定义,对用户设置的PVC申请屏蔽后端存储的细节,一方面减少了用户对于存储资源细节的关注,另 ...

  2. Android | 教你如何用华为HMS MLKit SDK 三十分钟在安卓上开发一个微笑抓拍神器

    Android | 只要三十分钟就可以在手机上开发一个微笑抓拍神器!!! 前言 前段时间Richard Yu在发布会上给大家介绍了华为HMS Core4.0,回顾发布会信息请戳: 华为面向全球发布HM ...

  3. 面试官:ThreadLocal的应用场景和注意事项有哪些?

    前言 ThreadLocal主要有如下2个作用 保证线程安全 在线程级别传递变量 保证线程安全 最近一个小伙伴把项目中封装的日期工具类用在多线程环境下居然出了问题,来看看怎么回事吧 日期转换的一个工具 ...

  4. 文件上传 Window & Linux

    1. 在application配置文件添加图片存储路径的参数 上传路径前必须加 file:/ 否则网页图片请求可能404window gofy: uploadPath: file:/F:/fileUp ...

  5. 用一个例子说说gRPC的四种服务方法

    本文通过一个简单的例子来演示这4种类型的使用方法 案例代码:https://github.com/codeAB/grpc-sample-example 目录结构说明 ├── calculator.pr ...

  6. Java中使用RSA算法加密

    Java中使用RSA算法加密 概述 RSA加密算法是一种非对称加密算法 RSA加密的方式 使用公钥加密的数据,利用私钥进行解密 使用私钥加密的数据,利用公钥进行解密 RSA是一对密钥.分别是公钥和私钥 ...

  7. [ASP.NET Core MVC] 如何实现运行时动态定义Controller类型?

    昨天有个朋友在微信上问我一个问题:他希望通过动态脚本的形式实现对ASP.NET Core MVC应用的扩展,比如在程序运行过程中上传一段C#脚本将其中定义的Controller类型注册到应用中,问我是 ...

  8. nginx 安装教程

    Nginx 安装教程 本教程在CentOS6.7中安装nginx 1.8.0,Nginx中加入了taobao的concat模块,nginx-upload-module模块,pcre 以及nginx-u ...

  9. Unity 游戏框架搭建 2019 (二十六) 第一轮整理完结

    昨天呢我们把第八个示例整理完了.整理之后学习了类的第一作用:方法的集合,还有 Obselete 这个 API.并且在进行整理的时候贯彻了我们新的约定和规则:先确保功能有效,再去做变更和删除. 今天我们 ...

  10. 整数逆序输出 Python

    输入形式:123  输出形式:321 输入形式:120 输出形式:21  (整数不能以0打头) 输入形式:-123 输出形式:-321 代码: a=int(input()) b=0 if a<0 ...