恶意代码分析实战 7 WinDbg

news2024/11/26 10:24:58

配置WinDbg双机调试。

  1. 下载Windbg(WDK)。
    1. 事实上你自己的win10上应该会自带。
    2. vmware_gmzXkb24Et.png
  2. 配置WinXP虚拟机的boot.ini
    1. vmware_17tUupogcG.png
    2. vmware_KGKjsqIW51.png
    3. vmware_eIz49bW2o2.png
    4. 改成如图所示的样子vmware_lqPbWfkHO8.png
  3. 修改主机上Windb的属性。

修改成如图所示:
explorer_4g6wC4LCE4.png

  1. 启动WinXP选择调试状态,启动Windbg即可开始调试。

7.1 Lab 10-1

分析
首先,使用一些静态分析技术来检查这个可执行文件。
vmware_DQJdmkAtWw.png像是有什么窗口之类的。
vmware_UZwELigy2a.png,这个程序可能创建了一个服务。
vmware_iNl5qUABC6.png,Lab 10-01.sys可能包含了这个服务的代码。
分析该Lab 10-01.sys文件,发现导入表只有三个函数,第一个函数是KeTickCount,剩下两个函数是RtlCreateRegistry和RtlWriteRegistryValue,这告诉我们驱动可能访问了注册表。
vmware_fE89DX5Dam.png
这些字符串看起来很想是注册表键值,然后开头的\Registry\Machine却比较怪异,并不像是诸如HKLM此类的常见注册表根键。当从内核态访问列表时,前缀\Registry\Machine等同于用户态程序访问的HKEY_LOCAL_MACHINE。EnableFirewall置为0,表示禁用Windows XP自带的防火墙。
vmware_xxQq4Xftqj.png
vmware_6qf0BRS7nV.png
由于这些字符串预示着恶意代码写了注册表,所以我们打开procmon来验证我们的假设。procmon中显示有一些读注册表的调用,但是仅有一个写注册表的调用:RegSetValue写了HKLM\SOFTWARE\Policies\Microsoft\Cryptography\RNG\Seed键值。
vmware_KvfKcFWN4p.png
这个注册表键值一直改变,对于恶意代码分析毫无意义,但是因为涉及到内核代码,我们需要确保驱动没有秘密地修改注册表。接下来我们打开执行文件,移动到主函数,发现只有四个函数调用。
vmware_QZmMZfJyQv.png
首先,它在①调用了OpenSCMangagerA获取服务管理器的句柄,然后在②调用CreateServiceA,创建一个名为Lab 10-01的服务。CreateServiceA调用告诉我们服务使用了"C:\Windows\System32\Lab10-01.sys"中的代码,服务类型为3,意味着这个文件将被加载到内核。(好奇怪,没看到3)
chrome_RWGUf9OWYy.png
如果CreateServiceA调用失败,代码会使用相同的服务名调用OpenServiceA。
如果因为服务已经存在而导致调用CreateServiceA失败,这将打开Lab 10-01服务的句柄。
vmware_LA6dOeEfO0.png
接下来,程序将调用StartServiceA来启动服务,最后u,调用ControlService。ControlService的第二个参数是发送控制消息的类型。本例中。它的值是1,查询文档,我们发现他是SERVICE_CONTROL_STOP,这将会卸载驱动,并调用驱动的卸载函数。
chrome_PfbtmzdIHV.png
vmware_psSntVBKBg.png
使用IDA Pro查看 Lab 10-01.sys
在试图使用WinDbg分析这个驱动之前,我们可以用IDA Pro打开这个驱动,来检查它的DriverEntry函数。当打开驱动文件,移动到它的入口时,看到如下代码。
vmware_5Pj4lI9lxj.png
这个函数是驱动的入口点,但是它不是DriverEntry函数。编译器在DriverEntry的周围插入封装代码。真正的DriverEntry函数位于sub_10906。
vmware_Hk0Ic5X5lG.png
函数的主体部分似乎将一个偏移量转移到另一个内存位置。除此之外,它没有进行任何函数调用,也没有与系统进行交互。
使用WinDbg分析Lab10-01.sys
现在我们可以使用WinDbg检查一下Lab10-01.sys,来查看调用ControlService卸载Lab10-01.sys时会发生什么事。用户空间可执行的代码加载Lab10-01.sys,然后立即卸载它。如果我们在运行恶意可执行程序之前使用内核调试器,因为此时驱动还未在内存中,所以我们还不能检查它。但是,如果我们等待应用程序运行完成,那时驱动又已经从内存中卸载了。
为了在Lab10-01.sys载入内存后,使用WinDbg分析它,在虚拟机中,我们将可执行程序载入到WinDbg中。使用下列命令,我们在驱动加载和卸载之间设置一个断点(在ControlService调用上):
vmware_K0TuTutywp.png
使用OllyDbg下一个断点。
vmware_hNgdiutS11.png
启动WinDbg进行调试,输入命令来获取驱动对象。

!drvobj Lab10-01

windbg_s0b904BJRG.png
命令!drvobj输出给我们提供了驱动对象的地址,因为在设备对象列表中没有设备列出,所有以我们明白这个驱动没有供用户空间中应用程序访问的设备。
可以使用 !object \Driver 命令获取当前内核中驱动对象列表。
获取了对驱动对象的地址,就可以使用dt命令查看它。

dt _DRIVER_OBJECT 8a1158b0

windbg_u0uOyXq9z8.png
我们尝试确定驱动卸载时调用的函数——偏移量为0x034的信息DriverUnload。然后,我们使用如下命令设置一个断点。

bp 0xba799486

然后恢复运行。
windbg_zngZ9n2DId.png
windbg_3U0ODLJNH8.png
文件被加载到ba799000。从上文中,可以得知,卸载函数位于0xba799486。我们从0xba799486减去0xba799000得到偏移量。然后在IDA中跳转到卸载函数。例如,如果IDA中架子基地址0性00000,那么我们在IDA Pro中地址0星00486处找到卸载函数。
继续运行会触发断点,单步运行可以看到调用了nt!RtlCreateRegistryKey
windbg_01e9rxVax9.png
chrome_UN4dJWtBmr.png

NTSTATUS RtlWriteRegistryValue(
  _In_     ULONG  RelativeTo,
  _In_     PCWSTR Path,
  _In_     PCWSTR ValueName,
  _In_     ULONG  ValueType,
  _In_opt_ PVOID  ValueData,
  _In_     ULONG  ValueLength
);
  1. 这个程序是否直接修改了注册表(使用procmon来检查)?

唯一的写入是写入一个随机值,其他的探测不到。

  1. 用户态的程序调用了ControlService函数,你是否能够使用WinDbg设置一个断点,以此来观察由ControlService的调用导致内核执行了怎么样的操作?

使用OllyDbg将可执行文件下断点到函数前,然后使用另外一个操作系统的WinDbg,使用!drvobj命令获得驱动设备的句柄,它包含一个卸载函数的指针。接下来,在驱动的卸载函数上设置一个断点。重启可执行文件之后,断点将会被出发。

  1. 这个程序做了些什么?

修改了注册表,并关闭了防火墙。

7.2 Lab10-02

分析
查看文件的导入表。
vmware_vghgcrAYCL.png
vmware_6UZA95GPQM.png
这几个函数告诉我们这个程序创建并启动衣蛾服务。因为程序也调用了CreateFile和WriteFile,说明这个程序可能创建一个文件,而LoadResource和FindResource则说明了该程序对Lab10-02.exe的资源节做了某些处理。
认识到程序可能对资源节进行了操作,我们使用Ressource Hacker来检查资源节。我们可以发现在资源节中藏了另外的一个PE头文件。
vmware_QnTILAGbBd.png
使用ProcessMon进行监视发现,该程序创建了一个文件,但我们在当前目录下却并不能查找到该文件。
vmware_5qbT9pJFBh.png
查找Rootkit
为了进一步的调查,我们要检查我们的内核驱动是否被加载。我们使用sc命令,检查运行我们内核驱动程序的服务状态。
vmware_u1lApRF17s.png
我们查询名为486 WS Driver的服务,它在CreateService中被指定。我们看到这个服务仍然运行②,这告诉我们在内核代码中。奇怪的是仍然运行,但是它没有在硬盘上。现在为了确定怎么回事,我们使用WinDbg机型调试。使用lm命令,查看驱动是否被真正加载。我们看到一个与Lab10-02.exe创建文件名匹配的条目:
windbg_3BFRVlqKfM.png
现在,我们确定了文件名为Mlwx486.sys的驱动被载入到内存,但是文件没有在硬盘上显示,这暗示了它可能是一个Rookit。
接下来,我们检查SSDT的所有修改项。
windbg_cjGjTEfuuy.png
我们可以看到有一处条目所在的内存位置很明显位与ntoskrn1模块的范围之外,位与Mlwx486.sys驱动内。为了确定替换了哪个函数,我们回复虚拟机安装Rootkit之前的状态,以便于我们查看存储在SSDT中的哪个函数被覆盖了。
分析函数

  1. 找到SSDT地址和NtQueryDirectoryFile地址
  2. 遍历SSDT找到NtQueryDirectoryFile项
  3. 修改NtQueryDirectoryFile项修改为FakeNtQueryDirectoryFile

vmware_j90Vcg5lJC.png
sub_10486函数:循环将文件名与”Mlxw“比较,如果匹配就修改上一个的NextEntryOffset跳过匹配文件
vmware_daLpfPssN5.png

返回字符串代表函数的地址
PVOID MmGetSystemRoutineAddress(
  PUNICODE_STRING SystemRoutineName
);
根据传入的目录句柄返回下面的各种文件信息
__kernel_entry NTSYSCALLAPI NTSTATUS NtQueryDirectoryFile(
  HANDLE                 FileHandle,
  HANDLE                 Event,
  PIO_APC_ROUTINE        ApcRoutine,
  PVOID                  ApcContext,
  PIO_STATUS_BLOCK       IoStatusBlock,
  PVOID                  FileInformation,
  ULONG                  Length,
  FILE_INFORMATION_CLASS FileInformationClass,
  BOOLEAN                ReturnSingleEntry,
  PUNICODE_STRING        FileName,
  BOOLEAN                RestartScan
);
结构体
typedef struct _FILE_BOTH_DIR_INFORMATION {
  ULONG         NextEntryOffset;//指向下一个结构体
  ULONG         FileIndex;
  LARGE_INTEGER CreationTime;
  LARGE_INTEGER LastAccessTime;
  LARGE_INTEGER LastWriteTime;
  LARGE_INTEGER ChangeTime;
  LARGE_INTEGER EndOfFile;
  LARGE_INTEGER AllocationSize;
  ULONG         FileAttributes;
  ULONG         FileNameLength;
  ULONG         EaSize;
  CCHAR         ShortNameLength;
  WCHAR         ShortName[12];
  WCHAR         FileName[1];
} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;

  1. 这个程序创建文件了吗?它创建了什么文件?

创建了文件,C:\Windows\System32\Mlwx486.sys。

  1. 这个程序有内核组件吗?

有内核组件,就在Lab10-02.exe的资源节中。

  1. 这个程序做了些什么?

通过修改SSDT的NtQueryDirectoryFile为FakeNtQueryDirectoryFIle,来隐藏文件。

7.3 Lab10-03

  1. 这个程序做了些什么?

· 这个程序首先依然是安装驱动,驱动位置在C:\Windows\System32\Lab10-03.sys
然后接着打开设备对象:

通过IO通信给驱动发送了控制码0ABCDEF01h,接下来的几个函数初始化了COM对象,并在每30s执行一次某个函数,这个函数有一个参数是这个网址字符串,经过在虚拟机运行程序可知,这是每30s弹出一个广告网页。

加载驱动,每30秒弹出一次广告。驱动从系统_EPROCESS中摘除进程

  1. 一旦程序运行,怎么停止?

重启系统。

  1. 它的内核组件做了什么操作?

内核组件负责响应,从进程链表中摘除进程的DeviceIoControl请求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/177896.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaWeb】JavaScript基础语法(下)

✨哈喽,进来的小伙伴们,你们好耶!✨ 🛰️🛰️系列专栏:【JavaWeb】 ✈️✈️本篇内容:JavaScript基础语法(上)! 🚀🚀代码托管平台github:JavaWeb代码存放仓库&#xff01…

程序员的自我修养第七章——动态链接

继续更新《程序员的自我修养》这个系列,主要是夏天没把它看完,补上遗憾。本篇来自书中第七章。 再说动态链接前,我们先阐明为什么要动态链接: 动态链接的产生来自静态链接的局限性。随着静态链接的发展,其限制也越来越…

zookeeper可视化工具

参考资料: 参考网址 使用过程: 首先打开网址,将资源克隆下来解压压缩包 打开压缩目录下 startup.bat ,填入对应地ip即可(记得优先启动zookeeper,否则会报错)

我的1周年创作纪念日

机缘 我目前还是一名六年级小学生,下半年便升入初中了。 我是在2021年上半年(我四年级下期时)开始学习C的。后来我自己想做一些小游戏,便经常要在百度上搜索,后来就发现CSDN中的内容比较全面,便加入了CSD…

MacOS下在Pycharm中配置Pyqt5工具(2023年新版教程)

前提:使用Anaconda的包管理工具进行管理。创建environment,然后在该Environment上进行下载操作!!!一、安装相关模块安装pyqt5、pyqt5-tools两个基础包,命令如下:pip install -i https://pypi.tu…

CSS文本与字体(文本格式化/对齐/装饰/转换/间距/阴影/字体/样式/大小/简写属性)

目录 文本颜色 文本颜色和背景色 文本对齐 文本方向 垂直对齐 文字装饰 文本转换 文字缩进 字母间距 行高 字间距 空白 文本阴影 所有 CSS 文本属性 字体选择很重要 通用字体族 Serif 和 Sans-serif 字体之间的区别 一些字体的例子 CSS font-family 属性 字…

vue-countTo不兼容vue3解决方案

我们想要做一个数值增长的过度效果可以使用vue-count-to 官网的地址:https://www.npmjs.com/package/vue-count-to 官网的截图 vue2的使用方式 cnpm install -S vue-count-to在main.js import vueCountTo from "vue-count-to"; Vue.component("C…

【JavaEE】如何开始基础的Servlet编程(基于Tomcat服务器)

如何开始最简单的Servlet编程?(基于Tomcat服务器)知道了如何借助Tomcat开始进行最简单的Servlet编程后,我们就可以进一步完善功能制作一个基础的网站了。在此之前我们先了解一下Servlet的生命周期。Servlet的生命周期初始化init -…

C++ list

目录 一. 初步了解 1.构造、析构、赋值 2.容量 3.元素访问 4.增删 二. 模拟实现 框架 push_back 迭代器 带参构造、析构、赋值 增删 反向迭代器 所有代码 说白了,就是一个双向循环带头链表,由于我们在数据结构中已经学习过链表的知识&a…

macOS Big Sur 11.7.3 (20G1116) Boot ISO 原版可引导镜像

本站下载的 macOS Big Sur 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装。 请访问原文链接:https://sysin.org/blog/macOS-Big-Sur-boot-iso/&a…

Nginx学习整理|入门记录

目录 1. Nginx概述 1.1 Nginx介绍 1.2 Nginx下载和安装 1.3 Nginx目录结构 2. Nginx命令 3. Nginx配置文件结构 4. Nginx具体应用 4.1 部署静态资源 4.2 反向代理 4.3 负载均衡 1. Nginx概述 1.1 Nginx介绍 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件…

积分电路的并联电阻、反向放大电路的并联电容的区别?

运放反相比例放大电路中反馈电阻两端经常并联一个电容,而运放积分电路的反馈电容上常常并联一个电阻,两者电路结构相似,如下所示(隐去阻容值),二者有何区别呢?电阻、电容分别又起到什么作用&…

Catboost

CatBoost简介 CatBoost是俄罗斯搜索巨头Yandex在2017年开源的机器学习库,是Boosting算法的一种,CatBoost和XGBoost,Lightgbm并称为GBDT三大主流神器,都是在GBDT算法框架下的一种改进实现,XGBoost是被广泛应用于工业界…

使用jstack解决线程爆满问题

问题发现生产应用现存在问题,影响到系统的使用,前端页面只配置了35个派生指标,后台任务生成20000多线程任务,占用了全部资源,导致其他系统也没资源可用,指标工厂也无法进一步使用,今天上午发的死…

Email Signature Manager 9.3 Crack

概述 Email Signature Manager为所有用户创建和部署电子邮件签名 包括合并的联系方式、公司徽标、社交媒体图标 和链接,甚至个性化内容,如用户照片 创建和附加电子邮件活动,向所有人介绍奖项, 活动或促销,或设置运行的…

基于STM32的FreeRTOS开发(1)----FreeRTOS简介

为什么使用freertos FreeRTOS 是一个免费和开源的实时操作系统,它主要用于嵌入式系统。它非常轻量级,可以在很小的硬件资源上运行,因此非常适合在限制硬件资源的嵌入式系统中使用。 FreeRTOS提供了一组简单的任务管理功能,可以让…

基于Springboot vue前后端分离在线培训考试系统源码

# 云帆培训考试系统 管理账号:admin/admin 学员账号:person/person # 介绍 一款多角色在线培训考试系统,系统集成了用户管理、角色管理、部门管理、题库管理、试题管理、试题导入导出、考试管理、在线考试、错题训练等功能,考…

C++:运算符重载与类的赋值运算符重载函数

目录 章节知识架构 一.运算符重载 1. 运算符重载的基本概念 代码段1 2.关于运算符重载的重要语法细则 二.运算符重载在类中的使用 三.类的默认成员函数:重载函数(赋值运算符重载) 1.自定义重载函数 代码段2 2.编译器默认生成的重载函数 四.前置(--)和后置…

Facebook小组与主页:哪个更适合SEO?

在 SEO中,对于优化人员来说有两种策略:一种是在 Facebook组上投放广告;另一种则是在主页上投放广告。那么,这两种策略哪种更好呢?对于 SEO来说又有什么影响呢?如果你已经在 Facebook上进行了一些优化工作&a…

Python---文件操作

专栏:python 个人主页:HaiFan. 专栏简介:本专栏主要更新一些python的基础知识,也会实现一些小游戏和通讯录,学时管理系统之类的,有兴趣的朋友可以关注一下。 文件操作思维导图前言文件是什么文件路径文件操…