恶意软件分析三:动态分析技术

恶意软件分析三:动态分析技术

注:文章内容只是分享自己的知识库,仅代表自己的理解,不一定准确,希望大家在观看时只是参考,思维不要受其限制。

优点

有些病毒在静态分析中被识别为正常病毒,但在运行时实际上会出现恶意行为,因此通常使用动态分析技术来实现闭环(病毒制作者通常在制作病毒的过程中对病毒进行静态反病毒处理,从而规避病毒分析软件)。

虚拟环境

出于安全考虑,大多数动态分析都是在虚拟机中进行的。

原因

由于未知的计算机病毒充满了不确定性,因此在进行动态分析时,有必要运行计算机病毒并监测其行为,同时出于安全考虑,需要一个安全可控的运行环境,以减少病毒造成的危害。

常见危害举例:

传播危险:计算机病毒可感染网络上的其他计算机(例如,连接到 WiFi 的计算机、可通过内网访问的其他计算机,这只是在实践中存在的多种可能性中的一个例子,因此不要局限于自己的想法,例如,一台正在运行的 PC 只攻击使用 WiFi 的手机或其他终端,而不会对主机造成严重破坏或损坏)。
难以清除:有些病毒很难从系统中清除,如果需要再次使用,则需要在分析结束后,通过清除磁盘数据、重新输入硬件驱动程序、重新安装驱动程序、刷新 BIOS 等方式来清除病毒对计算机所做的修改。
硬件损坏:某些病毒会以某些方式破坏计算机硬件(原因举例:通过破坏硬件来隐藏攻击记录,从而增加事后追查的难度)。

常用虚拟机软件:

  • Vmware
  • VirtulBox
  • Hyper-V
  • Parallels
  • Xen
  • QEMU
  • Android emulators (too many of these to single out)

缺点

由于虚拟环境并不真实,因此存在一些限制或缺点。

常见限制或缺点举例:

环境检测:病毒倾向于检测自身的运行环境,如果检测到病毒处于虚拟环境中,则不会实施恶意行为。
穿透攻击:病毒检测到运行时环境不是虚拟的,有些病毒会穿透虚拟机攻击真实的环境,而不会在虚拟机环境中执行恶意操作。
性能限制:由于环境是虚拟的,有时运行环境不稳定,会增加分析时间等。

行为监测

当病毒有害时,它往往会执行一些恶意或危险的操作。

可用于分析的常见行为举例:

  • 网络行为
    发送网络连接请求、远程控制、下载恶意代码、监听本地数据、传输敏感数据等。
  • 系统修改
    启动、创建计划任务、创建隐藏账户、打开端口、感染和替换系统文件、创建和停止服务、破坏系统运行时结构、修改、删除和添加注册表等。
  • 其他行为
    修改文件属性、删除、读取、添加、加密、释放文件、劫持进程、关闭、检测某些程序或进程、监控运行环境、执行攻击命令等。

常用工具

从公开产品中获取工具,自行定制开发。

软件调试

在动态分析中,通常通过调试器运行被分析程序,或将被分析进程附加到调试器上,以分析被分析程序的恶意行为。

常见调试器举例:

  • x64dbg
    适用于 Windows 的 32/64 位调试器
  • olldbg
    汇编分析调试器
  • immunity debugger
    Immunity Debugger 是编写漏洞利用程序、分析恶意软件和逆向工程二进制文件的强大新方法。它建立在一个带有功能图的可靠用户界面、业界首个专为堆创建而设计的堆分析工具,以及一个便于扩展的大型、支持良好的 Python API 基础之上。
  • windbg
    Windows 调试器(WinDbg)可用于调试内核和用户模式代码、分析故障转储并在代码执行过程中检查 CPU 寄存器。
  • dnspy
    dnSpy 是.NET 程序集的调试器和编辑器。即使没有任何源代码,您也可以用它来编辑和调试程序集!
  • GDB
    GDB 是 GNU 项目调试器,它允许你查看另一个程序执行时的 “内部 “情况,或另一个程序崩溃时的情况。
  • drozer
    领先的安卓安全评估框架。
  • frida
    面向开发人员、逆向工程师和安全研究人员的动态工具箱。
  • edb-debugger
    edb 是一个跨平台 AArch32/x86/x86-64 调试器。

监测类别

在动态分析中,监控工具通常用于监控程序运行后的运行情况,以分析被分析程序是否存在恶意行为。

常见监测工具示例:

  • 防火墙
    GlassWire、FortKnox Firewall、TinyWall、WFN、OpenSnitch、、、
  • 网络数据监测
    火绒系统诊断工具包、Windows Sysinternals、Directory Monitor、Process Hacker、Process Lasso、FSMonitor等。
  • 自动恶意软件分析环境
    在线病毒分析沙箱、在线杀毒引擎、Cuckoo 等。

注入技术

进程注入

病毒开发者通常利用进程注入技术绕过病毒防护软件,在合法进程中添加恶意功能,或从内存中读取敏感数据,干扰分析等。

在 Windows 操作系统中,允许进程分配、读取和写入另一个进程的虚拟内存,以及创建新线程、暂停线程和更改这些线程的寄存器,包括指令指针(EIP/RIP),在此基础上可以向进程注入代码(恶意利用这种技术向正常进程注入恶意代码并执行,以规避保护软件)。

DLL注入

Windows 为 DLL 创建了注册表项,以便在符合特定条件的进程中加载 DLL。其中许多条目允许将恶意软件 DLL 注入到浏览器和其他正常进程等进程中。例如:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs

20231129114701483-1688286289977

该注册表项是恶意软件滥用最严重的注册表项之一,用于向其他进程注入 DLL 代码并保持持久性。不过,它需要管理员权限才能添加,而且微软已将 LoadAppInit_DLLs 值默认设置为 0,以防止加载未知的 DLL,可以通过将该值更改为 1 来关闭它。

20231129114731755-1688286394872

原则:

通过将 AppInit_DLLs 关键字更改为要加载的 dll 的路径,所有 windows 进程都能加载该 dll。
这是因为 "AppInit_DLLs "注册表项中指定的 DLL 由 user32.dll 加载,而 user32.dll 几乎被所有应用程序使用。

分析实例

通过运行大量样本或程序并分析其中是否存在恶意行为,展示动态分析技术。

注册表监测

运行程序前,先备份注册表,打开 “火荣系统诊断工具包 “监控,运行一段时间后,检查注册表敏感操作,如:

  • 修改键值已关闭默认保护(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\LoadAppInit_DLLs – 0x1)

加载恶意DLL

(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs value is unknown dll, normal is empty)

监控攻击位置:

20231129142207386-1688286506655

攻击参数:

20231129142244513-1688286534542

拦截日志:

20231129142308751-1688287114973

网络相关 api

x64dbg 加载程序,并在常用网络函数上设置断点,以查看它们是否会被破解(示例程序仅在运行前进行了测试,以了解网络行为)。

  • 运行前打开网络分析工具

    20231129142956137-1688263707814

  • 断点单步分析下的网络功能

    20231129143123193-1688263719092

    如上图所示:成功破解并单步查看下载文件的网络地址
    UrlCanicalizeW 函数说明:
    将 URL 字符串转换为规范格式

    LWSTDAPI UrlCanonicalizeW(
    PCWSTR pszUrl、
    PWSTR pszCanonicalized、
    DWORD *pcchCanonicalized、DWORD dwFlags。
    DWORD dwFlags
    );
    实施示例:例如,用转义序列替换不安全字符
    如果 URL 字符串包含"/... /"或"/. /",URLConicalize 会将这些字符视为 URL 层次结构中的导航字符。该函数会在合并 URL 之前将其简化,例如,"/hello/craul/. /world "简化为"/hello/world"。
  • 其他API函数
    在 Windows 中,使用网络功能的程序通常会使用 ws2_32.dll 动态链接库中的功能。
    accept
    bind
    closesocket
    connect
    freeaddrinfo
    getaddrinfo
    gethostbyaddr
    gethostbyname
    gethostname
    getnameinfo
    getpeername
    getprotobyname
    getprotobynumber
    getservbyname
    getservbyport
    getsockname
    getsockopt
    htonl
    htons
    inet_addr
    inet_ntoa
    ioctlsocket
    listen
    ntohl
    ntohs
    recv
    recvfrom
    select
    send
    sendto
    setsockopt
    shutdown
    socket
    FreeAddrInfoW
    GetAddrInfoW
    GetNameInfoW
    WEP
    WPUCompleteOverlappedRequest
    WSAAccept
    WSAAddressToStringA
    WSAAddressToStringW
    WSAAsyncGetHostByAddr
    WSAAsyncGetHostByName
    WSAAsyncGetProtoByName
    WSAAsyncGetProtoByNumber
    WSAAsyncGetServByName
    WSAAsyncGetServByPort
    WSAAsyncSelect
    WSACancelAsyncRequest
    WSACancelBlockingCall
    WSACleanup
    WSACloseEvent
    WSAConnect
    WSACreateEvent
    WSADuplicateSocketA
    WSADuplicateSocketW
    WSAEnumNameSpaceProvidersA
    WSAEnumNameSpaceProvidersW
    WSAEnumNetworkEvents
    WSAEnumProtocolsA
    WSAEnumProtocolsW
    WSAEventSelect
    WSAGetLastError
    WSAGetOverlappedResult
    WSAGetQOSByName
    WSAGetServiceClassInfoA
    WSAGetServiceClassInfoW
    WSAGetServiceClassNameByClassIdA
    WSAGetServiceClassNameByClassIdW
    WSAHtonl
    WSAHtons
    WSAInstallServiceClassA
    WSAInstallServiceClassW
    WSAIoctl
    WSAIsBlocking
    WSAJoinLeaf
    WSALookupServiceBeginA
    WSALookupServiceBeginW
    WSALookupServiceEnd
    WSALookupServiceNextA
    WSALookupServiceNextW
    WSANSPIoctl
    WSANtohl
    WSANtohs
    WSAProviderConfigChange
    WSARecv
    WSARecvDisconnect
    WSARecvFrom
    WSARemoveServiceClass
    WSAResetEvent
    WSASend
    WSASendDisconnect
    WSASendTo
    WSASetBlockingHook
    WSASetEvent
    WSASetLastError
    WSASetServiceA
    WSASetServiceW
    WSASocketA
    WSASocketW
    WSAStartup
    WSAStringToAddressA
    WSAStringToAddressW
    WSAUnhookBlockingHook
    WSAWaitForMultipleEvents
    WSApSetPostRoutine
    WSCDeinstallProvider
    WSCEnableNSProvider
    WSCEnumProtocols
    WSCGetProviderPath
    WSCInstallNameSpace
    WSCInstallProvider
    WSCUnInstallNameSpace
    WSCUpdateProvider
    WSCWriteNameSpaceOrder
    WSCWriteProviderOrder
  • 释放文件
    火绒系统诊断工具包监控示例执行将释放文件,并深入分析其释放行为。
  • 监测写入文件

    20231129143757801-1688263939553

    这里似乎写入了一个文件,但我们还不知道是如何完成的。

  • 由于示例是用 .net 编写的,没有加密,因此可以直接通过 dnspy 在源代码级进行调试。

    20231129143849409-1688263986426

    根据先前监控的写入文件搜索并定位执行代码:

    20231129143933183-1688263993603

    private void btn_crack_Click(object sender, EventArgs e)
          {
              try
              {
                  this.Dosya_Sil(new string[]
                  {
                      "C:\\metasploit\\apps\\pro\\ui\\app\\views\\layouts\\application.html.erb",
                      "C:\\metasploit\\apps\\pro\\ui\\app\\controllers\\application_controller.rb",
                      "C:\\metasploit\\apps\\pro\\ui\\app\\models\\license.rb",
                      "C:\\metasploit\\apps\\pro\\engine\\app\\concerns\\metasploit\\pro\\engine\\rpc\\tasks.rb"
                  });
                  this.Dosya_Cikar("application", "C:\\metasploit\\apps\\pro\\ui\\app\\views\\layouts\\application.html.erb");
                  this.Dosya_Cikar("application_controller", "C:\\metasploit\\apps\\pro\\ui\\app\\controllers\\application_controller.rb");
                  this.Dosya_Cikar("license", "C:\\metasploit\\apps\\pro\\ui\\app\\models\\license.rb");
                  this.Dosya_Cikar("tasks", "C:\\metasploit\\apps\\pro\\engine\\app\\concerns\\metasploit\\pro\\engine\\rpc\\tasks.rb");
                  MessageBox.Show("Metasploit Crack Done!", "OK DONE", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
              }
              catch (Exception ex)
              {
                  MessageBox.Show(ex.Message, "FAILED", MessageBoxButtons.OK, MessageBoxIcon.Hand);
              }
          }
    解析:查找文件,如果存在则替换它,如果不存在则错误提示未找到文件。

    断开单步运行,查看监测情况:

    20231129144059624-1688264036083

     证明文件已由此处的代码释放,并确定没有错误。

进程监测

运行软件后收集信息

  • 火绒系统诊断工具包

    20231129144305984-1688264721187

    过滤:路径、进程、动作
    动作类别:
    执行监控、文件监控、注册表监控、进程监控、网络监控、行为监控
    任务组:
    信息概要

    20231129145842760-1688264743726

  • procexp(进程浏览器)
    显示进程已打开或加载的句柄和 DLL 的相关信息
    属性-字符串信息。

    20231129152700141-1688264788753

    dll 信息:

    20231129152754807-1688264797493

  • 发现可疑资源信息句柄信息:

    20231129152906971-1688264826137

  • 根据访问掩码,查询所获得的权限(通常查看解码访问掩码更直观、更易读) 使用提示
    为确保显示数据是最新的,最好手动刷新,快捷键 F5
    您可以根据流程的背景颜色确定流程状态和类型,具体颜色代表的信息如下所示
    [选项]菜单下的[配置颜色]选项

    20231129153028584-1688264849336

  • GlassWire
    监测样本运行的网络行为

    20231129153109679-1688265166855 已经上线:

    20231129153142546-1688265177149

    192.168.86.131是攻击者的IP

  • TcpView
    监控TCP和UDP信息
    样本运行后:

    20231129153327374-1688265212326

  • 正在进行远程桌面查看:

    20231129153452430-1688265220438

    通知信息显示监控状态(程序已启用远程桌面服务)

  • Autoruns
    比较运行前后的自动启动项,检查新的自动启动项是否为恶意程序。

    20231129153614249-1688265247975

  • Process Monitor (Procmon)
    实时监控系统信息,如注册表、文件、进程、网络等。
    系统信息远程采样检测:

    20231129153726413-1688265263878-1

    远程控制样本的远程桌面信息:

    20231129153916284-1688265278569

    远程控制样本文件管理信息:

    20231129154010178-1688265285662

  • 科来网络分析系统
    监控网络数据并查看其详细信息:
    处理 IP 信息

    20231129154204849-1688265298664

    看到一些外联 IP 信息(其中有模拟攻击 IP),在实际场景中,将根据多个来源确定实际攻击 IP。

端口分析定位

一些样本开发了可被恶意利用的端口

  • 使用数据包捕获软件找出当前正常使用端口的进程

    20231129154329354-1688265031282

  • 使用 netstat 命令查询占用端口的进程的 PID
    netstat -ano|findstr "端口号"

    然后结合任务管理器或其他进程监控程序查询占用的进程。

    20231129154431954-1688264983238

    20231129154446900-1688264990331

防火墙辅助分析定位

大多数恶意软件会利用网络进行进一步攻击,如远程控制、远程命令执行、远程下载、远程文件窃取等。在这种情况下,防火墙往往可以监控或捕获本地端与攻击端之间的网络链接,并根据这一链接定位恶意程序或拦截恶意程序,使其无法进一步攻击。

  • ProgCop
    监控远程连接
    监控连接到远程地址的本地链接(本实验的远程样本为客户机) 监控此过程:

    20231129154749398-1688264901028

    看到该进程执行的一些危险操作(删除/写入文件、创建账户、读取注册表键值等)

 
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容