恶意代码分析实战 9 隐蔽的恶意代码启动

news2024/9/20 14:36:18

9.1 Lab12-1

分析
查看程序的导入函数。
vmware_CujJ7HD7r0.png
通过这几个函数,可以推断出是远程线程注入。
使用ProMon检测,并没有看到什么有用的信息。
vmware_wddpYMPk58.png
使用Proexproer检查。
vmware_ITMVSe3OKW.png
也没有什么有用的信息。
拖入IDA中分析一下。
vmware_leJ3zY5g2t.png
将这几个字符串重命名,便于识别。
该程序是一个对于PID的遍历。
vmware_D6dtP6NNii.png
这个函数的作用是检查是否存在explorer.exe这个程序。
vmware_Nacxk3dVDE.png
vmware_ahJwE6GnPZ.png
Buffer表示的字符串是Lab12-01.dll.
vmware_nkM2Z2T9yk.png
这段代码所表示的就是对explorer.exe程序进行注入。
根据已知分析结果,我们取proexp中查找被注入的程序。
vmware_fgmx65LG3a.png
问题

  1. 在你运行恶意代码可执行文件时,会发生什么?

运行这个恶意代码之后,每分钟在屏幕上显示一次弹出消息,会显示已经弹出的次数。
vmware_cBghvUfwu8.png

  1. 哪个进程会被注入?

被注入的程序是explorer.exe。
vmware_fgmx65LG3a.png

  1. 你如何能够让恶意代码停止弹出窗口?

重启explorer.exe进程。

  1. 这个恶意代码样本是如何工作的?

分析Lab12-01.dll程序。
vmware_eKvfzPLAFF.png
这个恶意代码执行DLL注入,在explorer.exe中启动Lab12-01.dll,一旦Lab12-01.dll被注入,它在屏幕上每分钟显示一个消息框,并通过一个计数器,来显示已经弹出了多少次。

9.2 Lab 12-2

分析
首先,查看导入函数。
vmware_8WTGdkWjql.png
CreateProcessA、GetThreadContext以及SetThreadContext暗示着这个程序创建新的进程,并修改进程中线程的上下文。导入函数ReadProcessMemory和WriteProcessMemory告诉我们这个程序对进程内存空间进行了直接的读写。导入函数LockResource和SizeOfResource告诉我们这个进程比较重要的数据可能保存在哪里。
首先,我们分析CreateProcessA函数的目的。
vmware_mjZUed3bKe.png
在代码①处,我们看到一个push 4指令。而它被IDA Pro标记为参数dwCreationFlags。查看MSDN文档我们可以得知,这是CREATE_SUSPENDED标志,它允许进程被创建但并不启动。这个进程将不会被执行,除非等到这个主进程调用API ResumeThread函数时,它才会被启动。
在如下所示的位置,我们看到这个程序正在访问一个线程上下文。GetThreadContex的hThread参数与②处传递给CreateProcessA的参数处于同一个缓冲区,他告诉我们在这个程序正在访问挂起进程的上下文。获取进程句柄非常重要,因为程序将使用这个进程句柄与怪气进程进行交互。
调用GetThreadContext以后,我们看见这个进程奖杯用于ReadProcessMemory的调用。为了更好地判断这个程序用进程上下文做了什么,我们需要在IDA Pro中添加CONTEXT结构体。要添加这个标准结构题,需要单击Structures标签页,按INS键。接着单击ADD Standard Structure按钮,并放置名为CONTEXT的结构体。
vmware_IniOiJgJwy.png
0x4A偏移实际上调用了这个进程的EBX寄存器。
vmware_ynFdL6o8Wy.png
这个新创建就被挂起的进程EBX寄存器总是包含一个指向进程环境块(PEB)的数据结构。如下所示,在①处,程序以8字节递增结构体,并将这个值压到栈上,作为要读取内存的起始地址。
vmware_sR2KHayiJZ.png
因为PEB数据结构并不是标准IDA Pro数据结构中而定一部分,我们使用其他的工具来判断PEB数据结构的8字节偏移处是什么:一个指向ImageBaseAddress(被加载的可执行文件起始部分)的指针。将这个地址作为读取位置,并在②处读取4个字节,我们看到IDA Pro已标记为Buffer的变量将包含被挂起进程的ImageBase。
这个程序使用在0x004011E8处的GetProcessA,手动解析导入函数UnMapViewOfSection,并且在0x004011FE处,ImageBaseAddress作为UnMapViewOfSection的一个参数传入。UnMapViewOfSection的调用从内存中溢出这个被挂起的进程,此时程序不再被执行。
vmware_Ts2QsUk2LN.png
在①处,显示了这个程序在被挂起进程的地址空间分配内存。在函数的开头,程序检查在0x004010FE处的魔术值MZ和0x00401119处的魔术值PE。
vmware_6heZOGWFbX.png
在②处,这个程序要求内存被分配在PE文件ImageBase的地址,它告诉Windows加载器这个可执行文件更倾向于被加载到哪个位置。在③处,这个程序请求由PE头ImageSize属性指定内存的大小。最终,在④处,我们查询MSDN文档判定这部分内存是以PAGE_EXECUTE_READWRITE权限分配的。
一旦这部分内存被分配后,在0x00401251处指令会调用writeProcessMemory函数。从这个PE文件的开头写入数据到挂起进程时分配的内存中。要写入的字节数是从PE文件头的偏移0x54处取得的,也就是SizeOfHeaders。第一次WriteProcessMemory调用将PE文件头复制到被挂起的进程中,这表明了这个程序正移动一个PE文件到另一个进程的地址空间。
vmware_oEBI50PnvQ.png
整体有一个循环函数。这个循环函数的作用试讲PE字节复制到内存中。
vmware_4EJgNk6qc0.png
恢复了被挂起的进程。
vmware_uoSZXjcFfY.png
被替换的进程是%SystemRoot%\System32\svchost.exe。
现在我们这个这个程序启动的是svchost.exe,但我们还需要判断要替换svchost.exe的进程。我们通过跟随在0x00401539处的变量lpBuffer,来跟踪传递给sub_4010EA的PE缓冲区,就像原路返回到Dst变量一样。
vmware_fNbCLJeNnR.png
我们定位到lpBuffer,它在①处接受EAX,通过检查之前的指令,可以发现在②处的一个函数调用。记住EAX用作一个函数的返回值,我们知道这个缓冲区来自函数sub_40132C,很明显,它使用变量hModule,即一个指向程序本身——Lab12-02.exe———内存指针。
vmware_z2huNqfptW.png
使用Resourcehack查看:
vmware_IMnYJ5JQfE.png
使用winhex解密:
vmware_0tILP0fpun.png
问题

  1. 这个程序的目的是什么?

这个程序的目的是秘密地启动另一个程序。

  1. 启动器恶意代码是如何隐蔽执行的?

这个程序使用进程替换来秘密执行。

  1. 恶意代码的负载存储在哪里

这个恶意的有效载荷(payload)被保存在这个程序的资源节中。这个资源节的类型是UNICODE,且名字是LOCALIZATION。

  1. 恶意负载是如何被保护的?

保存在这个程序资源节中的恶意有效载荷是经过XOR编码过的。这个解码例程可以在sub_40132C处找到,而XOR字节在0x0040141B处可以找到。

  1. 字符串列表是如何被保护的?

这些字符串是使用sub_401000处的函数,进行XOR编码的。

9.3 Lab 12-3

分析
查看导入函数。
vmware_fzHp7SJx2J.png
SetWindowsHookExA,这是一个允许应用程序挂钩或监控微软Windows内部事件的API。
vmware_hQZlbNKrDN.png
我们看到SetWindowsHookExA在main中被调用,第一个参数是)0Dh,对应WH_KEYBOARD_LL,它使用IDA Pro标记为fn的挂钩函数启用键盘事件监控。这个函数可能对键击消息做些手脚,而这个fn函数正在接受这击键记录。
注册接受键盘事件的钩子之后,程序在0x00401076处的循环中调用了GetMessageA。本例中,程序一定要调用GetMessageA,因为Windows不会讲消息发送到程序进程的钩子函数中,知道循环产生错误,它才会停止。
移动fn函数,我们开始查看程序对截获的击键事件做了什么处理。fn是一个通用函数,它带有三个参数,它有一个定义为HOOKPROC的原型。查询MSDN文档,我们确定WH_KEYVOARD_LL回调函数,实际上是LowLevelKeyboardProc回调函数。
vmware_rMEAkmhUTw.png
程序利用cmp指令检查按键的类型,将虚拟按键码传递到随后的函数sub_4010C7函数中。
检查sub_4010C7函数,我们看到程序首先打开一个文件practicalmalwareanalysis.log。打开文件之后,恶意代码调用GetForegroundWindows和GetWindoTextA,如下所示。GetForegroundWindows选择按键按下时的活动窗口,然后使用GetWindoTextA获得窗口的标题。通过这些操作,帮助程序提供按键来源的上下文。
vmware_M43Xx2pIGu.png
一旦程序将窗口标题写入到日志文件,它就进入下一个跳转表。确定变量var_c包含传入函数sub_4010C7的虚拟按键码后,我们看到虚拟按键码作为一个查询表的索引。查询表得到的值作为跳转表off_401441的一个索引。
vmware_QhawAPWmJp.png
vmware_FvqVhmgvjq.png
在sub eax,8处,剩下的值为0x8。在byte_40148D查找偏移量0x8。得到值3,3被存入到ecx中。然后,ecx乘以4,得到0xC,将它作为off_401441的一个偏移量,然后返回到位置loc_401249,这里我们发现字符串[SHIFT]被写入到日志文件中。
vmware_kwAmInBafh.png
问题

  1. 这个恶意负载的目的是什么?

这个程序是一个击键记录器。

  1. 恶意负载是如何注入自身的?

这个程序使用挂钩注入,来偷取击键记录。

  1. 这个程序还创建了哪些其他文件?

这个程序创建文件practicalmalwareanalysis.log,来保存击键记录。

9.4 Lab 12-4

分析
首先查看导入表。
vmware_jIiH5hPyyT.png
vmware_w0BPHhJPKV.png
可能对资源有一些操作,所以我们使用resourcehack查看。
vmware_DBy6Enw4f6.png
确实为一个PE文件,我们将它提取出来。
启动wireshark和promon,进行动态分析。
vmware_XpyJjmzCjf.png
程序添加了一个文件,使用winmd5可知这个文件和我们在上从程序中提取出来的文件是同一个文件。
vmware_vAJSrXwyTU.png
vmware_MlffgJy99d.png
试图从一个网址下载程序。
问题

  1. 位置0x401000的代码完成了什么功能?

使用IDA对程序进行分析。
vmware_FbpFxhgUa0.png
首先是调用函数,重命名。
然后是遍历PID。
vmware_XwpUGL6ZvP.png
进入函数查看。
查看str1和str2中保存了什么字符串。
vmware_VmQHXWXurr.png
比对str1和str2。
vmware_ysA7o984yQ.png
这个函数的作用是对比当前进程是否是winlogon.exe。

  1. 代码注入了哪个进程?

进入该函数查看。
vmware_g1DXA0q8Yn.png
vmware_TqQqsIN3uM.png
而hprocess存储的就是winlogon.exe的句柄,所以被远程注入的程序就是winlogon.exe。

  1. 使用LoadLibraryA装载了哪个DLL程序?

vmware_Yw80EDbkRp.png
装载的DLL程序是sfc_os.dll,调用的函数可以禁用文件保护机制。

  1. 传递给CreateRemoteThread调用的第4个参数是什么?

指向的是一个函数而定指针,就是sfc_os.dll中序号为2的函数的指针。

  1. 二进制主程序释放出了哪个恶意代码?

vmware_OAaeOEVDeN.png
将文件名做了修改,然后调用函数对资源进行了操作。
vmware_aH23Zk4eHb.png
查看一下资源文件。
vmware_GQcflTKOrk.png
从网页中下载文件,重命名到目录:\system32\wupdmgrd.exe。
恶意文件wuodmgrd.exe比正常wuodmgr.exe多了一个字母d。
恶意代码从资源段中释放一个二进制文件,并且将这个二进制文件覆盖旧的Windows更新程序( wupdmgr.exe)。覆盖真实的wupdmgr.exe之前,恶意代码将它复制到%TEMP%目录,供以后使用

  1. 释放出恶意代码的目的是什么?

恶意代码向winlogon.exe注入一个远程线程,并且调用sfc_ os.dll 的一个导出函数(序号为2的SfcTerminateWatcherThread),在下次启动之前禁用Windows的文件保护机制。因为这个函数一定要运行在进程winlogon.exe 中,所以CreateRemoteThread调用十分必要。恶意代码通过用这个二进制文件来更新自己的恶意代码。

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

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

相关文章

【MyBatis】| MyBatis使用⼩技巧

目录 一:MyBatis使用⼩技巧 1. #{}和${} 2. typeAliases 3. mappers 4. IDEA配置⽂件模板 5. 插⼊数据时获取⾃动⽣成的主键 一:MyBatis使用⼩技巧 1. #{}和${} #{}:先编译sql语句,再给占位符传值,底层是Prepar…

【C语言进阶】一文带你学会C语言文件操作

前言 我们前面学习结构体时,写了通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录…

Python---自动生成二维码

专栏:python 个人主页:HaiFan. 专栏简介:本专栏主要更新一些python的基础知识,也会实现一些小游戏和通讯录,学时管理系统之类的,有兴趣的朋友可以关注一下。 自动生成二维码 二维码的本质上,就…

人工智能学习06--pytorch05--torchvision中的数据集使用DataLoader的使用

torchvision中的数据集使用 test_set的class属性 把数据集每一部分都变成tensor类型 现在输出的就是tensor数据类型了 DataLoader的使用 batch_size 一摞牌中,每次抓几张shuffle 打乱,第二次打牌前,牌的顺序要跟第一次不一样&#xff0…

【JavaSE】一文看懂构造器/构造方法(Cunstructor)

🌱博主简介:大一计科生,努力学习Java中!热爱写博客~预备程序媛 📜所属专栏:Java冒险记【从小白到大佬之路】 ✈往期博文回顾: 【JavaSE】保姆级教程|1万字10张图学会类与对象–建议收藏 🕵️‍♂️近期目标…

CSS边框、边距、轮廓(边框宽度/颜色/各边/简写属性/圆角边框/内外边距/高度宽度/框模型/轮廓宽度/颜色/属性/偏移)——万字长文|一文搞懂

目录 CSS边框 CSS 边框属性 CSS 边框样式 实例 CSS 边框宽度 实例 特定边的宽度 实例 CSS 边框颜色 实例 特定边框的颜色 实例 HEX 值 实例 RGB 值 实例 HSL 值 实例 CSS 边框 - 单独的边 实例 不同的边框样式 实例 它的工作原理是这样的: …

ROS学习寄录1

1 创建ROS工作空间 1.1 创建工作空间 (1)创建工作空间 mkdir catkin_ws (2)进入catkin_ws文件夹,然后创建一个src文件夹 cd catkin_ws mkdir src (3)进入src文件夹,生成CMakeL…

「自控原理」4.2 根轨迹法分析与校正

本节介绍利用根轨迹法分析系统性能发热方法 本节介绍根轨迹校正 文章目录利用根轨迹分析系统性能主导极点法增加零极点对系统的影响根轨迹校正串连超前校正原理与步骤超前校正例题串连滞后校正附加开环偶极子的作用原理与步骤滞后校正例题利用根轨迹分析系统性能 利用根轨迹分…

Oracle cloud vps实例配置访问

Oracle cloud vps实例配置访问创建一个免费配置的实例,并配置访问创建实例时,系统映像选择创建实例时候的ssh密钥配置子网,打开22端口使用工具登录服务器配置多个公钥,支持多个ssh私钥来登录登录vps实例修改登录用户和身份验证方式…

【接口】接口超时原因分析

接口超时的原因: 一、网络抖动 有可能是你的网络出现抖动、网页请求API接口、接口返回数据给网页丢包了。 二、被带宽占满 用户量暴增,服务器网络带宽被占满。 服务器带宽:一定时间内传输数据的大小,如:1s传输10M…

剑指Offer 第1天

第 1 天 栈与队列(简单) 剑指 Offer 09. 用两个栈实现队列 class CQueue { public: CQueue() {} void appendTail(int value) { s1.push(value); } int deleteHead() { while(!s1.empty()) { …

【Git :分布式版本控制工具】

【Git :分布式版本控制工具】 了解 Git 基本概念 能够概述 Git 工作流程 能够使用 Git 常用命令 熟悉 Git 代码托管服务 能够使用 IDEA 操作 Git 一、 概述 1. 开发中的实际场景 备份代码还原协同开发追溯问题代码的编写人和编写时间 2. 版本控制器的方式 集中式…

【数据结构】6.6 图的应用

文章目录生成树及其构造生成树的特点无向图的生成树6.6.1 最小生成树最小生成树及其典型应用MST性质构造最小生成树1. Prim(普里姆)算法2. Kruskal(克鲁斯卡尔)算法两种算法比较6.6.2 最短路径最短路径问题1. Dijkstra(迪杰斯特拉)算法迪杰斯特拉算法步骤2. Floyd(弗洛伊德)算法…

从零搭建一个组件库(二)创建代码规范

文章目录前言集成eslint1.安装2.替换默认解析器3.创建.eslintrc.yml配置文件4.创建忽略文件.eslintignore集成 prettier1.安装2.创建配置文件.prettierrc集成# commitizen1.安装2.修改package.json3.测试className的BEM规范1.安装2.BEM概述3.创建hooks函数4.使用hooks函数5.封装…

Vuex里面四个map方法(mapState、mapGetters、mapActions、mapMutation)

本章节主要讲述Vuex里面的四个优化代码的map方法,mapState、mapGetters、mapActions、mapMutation 一、store文件夹下面index.js主要内容,包含state(用于存储数据)、getters(计算属性)、mutatiions(加工数据)、actions(相应组件动作、写逻辑) 二、四个ma…

多个盒子排列规则(视觉格式化模型) 多个盒子的排列 页面布局

目录常规流常规流布局块盒的排列规则常规流 盒模型:规定单个盒子的规则 视觉格式化模型(布局规则):页面中的多个盒子排列规则 视觉格式化模型,大体上将页面中盒子的排列分为三种方式: 常规流浮动定位 …

react源码:目录结构、调试源码

我的技术栈是React,最近在整理react的源码,react版本是18.1.0,之前版本,没有看过,就此略过。 源码目录 从github将源码下载后,先看看源码目录结构,如下图所示: fixtures:代码贡献者提供的测试react package:react源码的主要部分,包含了Schedule、reconcile等等 s…

RadSystems Studio 8.1.8 Crack

RadSystems Studio 是一个用于快速开发和交付自定义应用程序的环境,快速应用开发环境,更快生成完整应用。RadSystems为生成现代应用程序和 API 提供了无数的设计选项和组件。很少或没有编码。无需专门的编程知识。可通过减少冗余编码时间来促进应用程序开…

Centos7 安装SkyWalking

Centos7 安装SkyWalkingCentos7 安装SkyWalking1 基础介绍1.1 概念1.2 核心三部分1.3 架构图2 快速安装2.1 前提条件2.2 拉取镜像2.3 启动SkyWalking2.4 访问SkyWalking UI界面Centos7 安装SkyWalking 1 基础介绍 1.1 概念 SkyWalking是一个国产的开源框架,2015年…

计算机组成原理3个实验-logisim实现“七段数码管”、“有限状态机控制的8*8位乘法器”、“单周期MIPS CPU设计”。

目录 标题1.首先是七段数码管 标题二:有限状态机控制的8*8位乘法器 标题三:单周期MIPS CPU设计 标题1.首先是七段数码管 1看一下实验要求: 2.接下来就是详细设计: 1. 组合逻辑设计 由于7段数码管由7个发光的数码管构成&#x…