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. 震惊!程序员的福音!不需要敲代码就能完成复杂的逻辑应用? —— Azure Logic App

    (大家看完标题可能以为是营销号,哈哈哈哈哈哈哈哈哈...客官请留步, 正经博主....好吧) 今天我们的主题是Azure Logic Apps Azure Logic Apps 是什么? 官方解释:h ...

  2. windows找不到文件gpedit.msc处理方法

    新建一个txt,输入 @echo offpushd "%~dp0"dir /b C:\Windows\servicing\Packages\Microsoft-Windows-Gr ...

  3. 使用maven-pom进行依赖管理与自动构建

    使用maven-pom进行依赖管理与自动构建 span.kw { color: #007020; font-weight: bold; } /* Keyword */ code > span.d ...

  4. win10 安装redis相关问题。

    最近需要在win10安装redis,但是redis的msi文件总是报这个错误: Redis on Windows Setup Wizard ended prematurely 都说是.NET fram ...

  5. D. Little Artem and Dance(带环模拟 + 规律)

    D. Little Artem and Dance Little Artem is fond of dancing. Most of all dances Artem likes rueda - Cu ...

  6. JDBC获取连接抛出java.sql.SQLException: The server time zone...

    今天尝试数据库,代码确实没问题就是给了给这个东西 java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecogniz ...

  7. JS中this指向问题和改变this指向

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...

  8. PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分)

    PTA数据结构与算法题目集(中文)  7-43字符串关键字的散列映射 (25 分) 7-43 字符串关键字的散列映射 (25 分)   给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义 ...

  9. 基于.NetCore3.1搭建项目系列 —— 使用Swagger导出文档 (补充篇)

    前言 在上一篇导出文档番外篇中,我们已经熟悉了怎样根据json数据导出word的文档,生成接口文档,而在这一篇,将对上一篇进行完善补充,增加多种导出方式,实现更加完善的导出功能. 回顾 1. 获取Sw ...

  10. ansible--ansible基础

    配置文件 ansible的配置文件只有一个,即ansible.cfg,它可以存在于多个地方,ansible读取配置文件的顺序依次是当前命令执行目录->用户家目录下的.ansible.cfg-&g ...