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. HDU - 1999 不可摸数,快速求因子和

    题意:定义s[m]为m内的因子的和,给定一个n,判断是否有s[m]==n,若没有,则是不可摸数. 思路:首先要打表求出s[m]的值,标记这些出现过的值. 打表求因子和: for(int i=1;i&l ...

  2. WeChat-SmallProgram:组件的业务 slot 的使用

    1.调用组件向自定义组件插入内容,使用  slot 在自定义模板中有一对 <view><slot></slot></view> 这里是干什么用的呢? 在 ...

  3. Activiti网关--包含网关

    1.什么是包含网关 包含网关可以看做是排他网关和并行网关的结合体:和排他网关一样,你可以在外出顺序流上定义条件,包含网关会解析它们:但是主要的区别是包含网关可以选择多于一条顺序流,这和并行网关一样,包 ...

  4. Maximum splitting

    Maximum splitting You are given several queries. In the i-th query you are given a single positive i ...

  5. [Vue warn]: Failed to mount component: template or render function not defined. found in ---> <XFbwz> at src/views/XFbwz.vue <App> at src/App.vue <Root>

    1.引入.vue文件忘记加.vue 2.引入文件内容为空

  6. PTA数据结构与算法题目集(中文) 7-41PAT排名汇总 (25 分)

    PTA数据结构与算法题目集(中文)  7-41PAT排名汇总 (25 分) 7-41 PAT排名汇总 (25 分)   计算机程序设计能力考试(Programming Ability Test,简称P ...

  7. php-fpm cgi fast-cgi

    基础 在整个网站架构中,Web Server(如Apache)只是内容的分发者.举个栗子,如果客户端请求的是 index.html,那么Web Server会去文件系统中找到这个文件,发送给浏览器,这 ...

  8. 创建堆(python)

    创建最大(小)堆 二叉堆本质上是一种完全二叉树,存储方式并不是链式存储,而是顺序存储 堆操作:插入(叶子节点上调),删除(堆顶元素下沉) 堆创建:非叶子节点下沉(从最后一个非叶子节点开始) 最小堆: ...

  9. 33.1 File 获取目录下的所有文件及子目录

    重要获取功能 String[] list() 返回当前路径下所有的文件和文件夹名称 //注意:只有指向文件夹的File对象才可以调用该方法(指向文件的file对象使用list会报错npe) File[ ...

  10. 14-jmeter分布式环境

    1.分布式概念: jmeter做性能时,会消耗本地机器资源 本机无法没有限制的创建运行线程(一般500线程就差不多会报错) 一般这时候会用到分布式的环境 2.环境: 前提条件:环境一致(有时候可以直接 ...