恶意代码分析实战 3 IDA Pro

news2025/9/16 12:18:16

利用IDA PRO分析Lab05-01.dll
实验目的
利用IDA Pro分析Lab05-01.dll中发现的恶意代码,回答以下问题:

  1. DLLMain的地址是什么?

vmware_ktjJxPeOeW.png
可以空格转入反汇编查看DLLMain地址,或者
vmware_gyTfDNyZAq.png
vmware_rm7u98CFpi.png
DLLMain的地址是.text:0x1000D02E。

  1. 使用Imports窗口并浏览到gethostbyname,导入函数定位到什么地址?

这样的三步来寻找地址。
vmware_pG3Vogcjpr.png
vmware_JdWNgu5d08.png
地址是.idata:100163CC。

  1. 有多少函数调用了gethostbyname?

光标滑到函数所在位置,按下+开启交叉引用。
vmware_A12e4BZKR5.png
数一数发现不同地址的函数共有5个,所以gethostbyname被5个不同的函数调用了9次。
类型p是被调用的引用,类型r是被读取的引用。

  1. 将精力集中在位于0x10001757处的对gethostbyname的调用,你能找出哪个DNS请求将被触发吗?

按下G,快速跳转。
vmware_vSjTqk20TX.png
调用了函数,32位汇编通常把参数存在eax中,查看一下什么东西导入了eax。
vmware_yRkUx7rpIx.png
后面正好有一句eax+0xD,所以解析的是后面这一部分的网址。

  1. IDA Pro 识别了在0x10001656处的子过程中的多少个局部变量?

按G定位到函数,后面是负数的是局部变量。
vmware_8bmTLo4ppE.png
一共23个。

  1. IDA Pro识别了在0x10001656处的子过程中的多少个参数?

后面是正数的是参数,所以共有一个参数。

  1. 使用Strings窗口,来在反汇编中定位字符串 \cmd.exe /c, 它位于哪儿?

+ 打开Strings窗口,搜索该字符串。
vmware_HrP244kC0o.png
它的位置是 xdoors_d:10095B34 。

  1. 在引用 \cmd.exe /c的代码所在区域发生了什么?

跳转到它的调用部分。
vmware_9tgasrTxTg.png
看起来像是远程攻击者开启了一个远程shell对话。

  1. 在同样的区域,在0x100101C8处,看起来dword_1008E5C4好像是一个全局变量,它帮助决定走哪条路径。那恶意代码是如何设置dword_1008E5C4的呢?(提示:使用交叉引用)

双击进入data处,查看交叉引用,发现只有一处是对它进行了修改。
vmware_SSDNG0No6G.png

.text:10001673 call sub_10003695
.text:10001678 mov dword_1008E5C4, eax

进入该函数看一看,

.text:10003695 VersionInformation= _OSVERSIONINFOA ptr -94h
.text:10003695
.text:10003695 push ebp
.text:10003696 mov ebp, esp
.text:10003698 sub esp, 94h
.text:1000369E lea eax, [ebp+VersionInformation]
.text:100036A4 mov [ebp+VersionInformation.dwOSVersionInfoSize], 94h
.text:100036AE push eax ; lpVersionInformation
.text:100036AF call ds:GetVersionExA
.text:100036B5 xor eax, eax
.text:100036B7 cmp [ebp+VersionInformation.dwPlatformId], 2
.text:100036BE setz al
.text:100036C1 leave
.text:100036C2 retn
.text:100036C2 sub_10003695 endp

调用了GetVersionEx,用于获取操作系统版本的信息,其中将dwOSVersionInfoSize与数字2进行比较,来确定如何设置AL寄存器。如果PlatformId为VER_PLATFORM_WIN32_NT,AL会被置位,只是简单的判断当前操作系统是否Windows 2000或更高版本,我们可以得出结论,该全局变量通常会被置为1.

  1. 在位于0x1000FF58处的子过程中的几百行指令中,一系列使用memcmp来比较字符串的比较。如果对robotwork的字符串比较是成功的(当memcmp返回0),会发生什么?

.text:10010444 loc_10010444: ; CODE XREF: sub_1000FF58+4E0j
.text:10010444 push 9 ; Size
.text:10010446 lea eax, [ebp+Dst]
.text:1001044C push offset aRobotwork ; “robotwork”
.text:10010451 push eax ; Buf1
.text:10010452 call memcmp
.text:10010457 add esp, 0Ch
.text:1001045A test eax, eax
.text:1001045C jnz short loc_10010468
.text:1001045E push [ebp+s] ; s
.text:10010461 call sub_100052A2
.text:10010466 jmp short loc_100103F6

如果memcmp返回0,jnz是不是零的时候就跳转,会执行sub_100052A2函数,进入函数内部看看。

.text:100052DF push eax ; phkResult
.text:100052E0 push 0F003Fh ; samDesired
.text:100052E5 push 0 ; ulOptions
.text:100052E7 push offset aSoftwareMicros ; “SOFTWARE\Microsoft\Windows\CurrentVe”…
.text:100052EC push 80000002h ; hKey
.text:100052F1 call ds:RegOpenKeyExA

发现首先用RegOpenKeyExA函数打开了注册表HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion,然后查询了aWorktime和aWorktimes键也就是worktime和worktimes键的值,然后调用了sub_100038EE函数,
双击进入sub_100038EE函数查看,发现其调用了了malloc函数创建了内存空间,然后又调用了send函数,最后调用了free函数释放内存空间,所以猜测可能是对注册表SOFTWARE\Microsoft\Windows\CurrentVersion进行了修改或查询操作,然后再将结构发送出去。

  1. PSLIST导出函数做了什么?

vmware_GG45aGG4dP.png
通过菜单View->Open Subview->Exports,查看该DLL的导出表。在其中可以看到PSLIST,双击它,光标来到0x10007025处,也就是导出项代码的起始处。这个函数选择两条路径之一执行,这个选择取决于sub_100036C3的结果。sub_100036C3函数检查操作系统的版本是Windows Vista/7,或是 Windows XP/2003/2000。这两条路径都使用CreateToolhelp32Snapshot函数,从相关字符串和API调用来看,用于获得一个进程列表。这两条代码路径都通过send将进程列表通过socket发送。

  1. 使用图模式来绘制出对sub_10004E79的交叉引用图。当进入这个函数时,哪个API函数可能被调用?仅仅基于这些API函数,你会如何重命名这个函数?

首先定位到0x10004E79,然后将光标移动到感兴趣的函数名上,通过菜单的View->Graphs->User Xrefs Chart,我们可以得到函数的交叉引用图。
vmware_y8F7jqXNqN.png
该函数调用了GetSystemDefaultLangID和send,该信息告诉我们,该函数可能通过socket发送语音标志,因此,右击函数名,给他一个更有意义的名字,例如send_languageID

  1. DllMain直接调用了多少个Windows API?多少个在深度为2时被调用?

vmware_mRh1Owfq7F.png
DLLMain直接嗲用了strncpy,strnicmp、CreateThread 和 strlen这些API。进一步地,调用了非常多的API,包括Sleep、WinExec、getthostbyname,以及许多其他网络函数调用。

  1. 在0x10001358处,有一个对Sleep(一个使用一个包含要睡眠的毫秒数的参数的API函数)的调用。顺着代码向后看,如果这段代码执行,这个程序会睡眠多久?

vmware_DkfUINgToc.png
查看一下什么进了eax。
vmware_TOhm1mUiuV.png
是个30。
vmware_Wx5IHAG1vi.png
乘了1000。
所以恶意代码会休眠30秒。

  1. 在0x10001701处是一个对socket的调用,它的3个参数是什么?

2,1,6

  1. 使用MSDN页面的socket和IDA Pro中的命名符号常量,你能使参数更有意义吗?修改后,参数是什么?

Winsock2.h

SOCKET WSAAPI socket(
  [in] int af,
  [in] int type,
  [in] int protocol
);

https://learn.microsoft.com/zh-cn/windows/win32/api/Winsock2/nf-winsock2-socket
它的每个值的含义都在这里面。
我找了找,分别对应:
AF_INET
SOCK_STREAM
IPPROTO_TCP
可以这样进行修改。
vmware_DgEUn9s3eb.png
vmware_lW9b4DUNMr.png

  1. 搜索in指令(opcode 0xED)的使用。这个指令和一个魔术字符串VMXh用来进行Vmware检测。在这个恶意代码中被使用了吗?使用对执行in指令函数的交叉引用,能发现进一步检测Vmware的证据吗?

vmware_ne5bTj8AtZ.png
vmware_Fc6oXc2DgF.png
有“VMXh”样式字符串,可能有检测虚拟机的行为。

  1. 将你的光标跳转到0x1001D988处,你发现了什么?

在0x1001D988处可以看到一些看起来随机的数据。

  1. 如果你安装了IDA Python插件(包括IDA Pro的商业版本插件),运行Lab05-01.py,一个IDA Pro Python脚本(确定光标是在0x1001D988处),在运行该脚本后发生了什么?

首先安装IDAPython,参考链接如下:
https://blog.csdn.net/betabin/article/details/7318233
https://www.cnblogs.com/afublog/p/11228771.html
vmware_rGFMdqV0Eh.png
运行之后,不再是乱码了。

  1. 将光标放于同一位置,你如何将这个数据转成一个单一的ASCII字符串?

按下A键,就可以将其变为一个可读字符串了:

xdoor is this backdoor, string decoded for Practical Malware Analysis Lab :)1234

  1. 使用一个文本编辑器打开这个脚本。它是如何工作的?
sea = ScreenEA()

for i in range(0x00,0x50):
        b = Byte(sea+i)
        decoded_byte = b ^ 0x55
        PatchByte(sea+i,decoded_byte)

该脚本的工作原理是,对长度为0x50字节的数据,用0x55字节的数据,用0x55分别与其进行异或,然后用PatchByte函数在IDA中修改这些字节。

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

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

相关文章

这几个步骤,让你的电脑避免卡顿~

C盘主要是系统运行的存储空间,如果C盘装满了东西,那就意味着电脑的存储空间小,电脑运行就会更慢。😯 另外,桌面上的文件也属于C盘,所以桌面也不要放太多东西。除装机时候的一些必要软件,后期装的…

SpringBoot切换数据源

基本使用添加依赖<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.3.0</version> </dependency>数据源配置spring:datasource:dynamic:primary: fir…

【多元统计分析】Python实现对应分析

&#xff08;一&#xff09;题目要求 数据集包含地区生产总值的四个相关指标&#xff1a;x1劳动者报酬&#xff0c;x2生产税净额&#xff0c;x3固定资产折旧&#xff0c;x4营业盈余。对各个地区生产总值进行对应分析&#xff0c;揭示不同地区的生产总值构成特征。要求&#xf…

对多线程中线程池的理解

一.概念理解何为线程池&#xff1f;线程池的释义正如它的命名&#xff1a;专门用来存放线程的池子&#xff08;集合类&#xff09;&#xff0c;也就是将线程存储于集合类&#xff0c;使用时从线程池中直接获取&#xff0c;使用结束后将线程放回集合类即可&#xff0c;这样就避免…

macOS Ventura 13.2 (22D49) Boot ISO 原版可引导镜像

本站下载的 macOS Ventura 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。 2023 年 1 月 23 日&#xff08;北京时间 24 日凌晨&#xff09;&#xff0c;m…

基于电流型磁链观测器的异步电机矢量控制学习

导读&#xff1a;本期主要介绍电流型磁链观测器&#xff08;current flux observer&#xff09;在不同坐标系下的表现形式&#xff0c;应用在异步电机矢量控制系统中。如需要文中的仿真模型&#xff0c;关注微信公众号&#xff1a;浅谈电机控制&#xff0c;获取。一、引言磁链估…

JavaEE day4 初识HTML+总结3

FORM表单的常见type属性 FORM表单的tpye属性非常多&#xff0c;这里只介绍常见的几个&#xff1a; text &#xff1a; 输入普通文本&#xff0c;例如登录注册下的用户名 password &#xff1a; 输入密码文本&#xff0c;例如登录注册下的密码&#xff0c;隐藏用户的输入 ra…

如何使用JDBC操作数据库,JDBC实战案例详细解读

1. 前言 前面 3 篇 JDBC 入门级基础文章中&#xff0c;我们已经探讨了什么是 JDBC&#xff0c;如何使用JDBC 操作数据库&#xff0c;JDBC API 详细解读&#xff0c;以及数据库连接池的基础等。文章带来的反馈还不错&#xff0c;今天我们使用前面学习的内容做一个实战案例训练。…

贪心 135. 分发糖果

135. 分发糖果 难度困难1086 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&…

uboot启动流程简要版(基于armv7)

uboot启动流程&#xff08;armv7&#xff09; uboot介绍 uboot就是一段引导程序&#xff0c;在加载系统内核之前&#xff0c;完成硬件初始化&#xff0c;内存映射&#xff0c;为后续内核的引导提供一个良好的环境。 uboot是bootloader的一种&#xff0c;全称为universal boot…

二叉树基础oj练习

1.单值二叉树 题目: 力扣https://leetcode.cn/problems/univalued-binary-tree/ 思路: 单值二叉树 root和左右孩子的值相等 左子树是单值二叉树 右子树是单值二叉树 代码: /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeN…

CSS 艺术之心形-彩虹-加载动画

CSS 艺术之心形-彩虹-加载动画&#xff08;居中抖动问题&#xff09;参考描述效果HTMLCSS重置元素的部分默认样式bodyli动画定义指定animationul居中抖动问题代码总汇参考 项目描述搜索引擎BingMDNMDN Web Docs 描述 项目描述Edge109.0.1518.61 (正式版本) (64 位) 效果 HTML…

【Vue笔记】Vue中默认插槽slot、具名插槽slot、自定义组件的v-model属性的使用

这篇文章&#xff0c;主要介绍Vue中默认插槽slot、具名插槽slot、自定义组件的v-model属性的使用。 目录 一、插槽slot介绍 1.1、默认插槽 1.2、具名插槽 &#xff08;1&#xff09;如何定义具名插槽&#xff1f;&#xff1f;&#xff1f; &#xff08;2&#xff09;如何使…

3DMAX纹理插件BerconMaps使用教程

BerconMaps是3dMax的第三方纹理插件。它添加了五个新的3dMax纹理贴图&#xff1a;噪波&#xff08;Noise&#xff09;、木纹&#xff08;Wood&#xff09;、瓷砖&#xff08;Tile&#xff09;、失真&#xff08;Distortion&#xff09;和渐变&#xff08;Gradient&#xff09;。…

linux配置samba服务

文章目录samba服务第一步&#xff1a;下载samba服务第二步&#xff1a;开启服务&#xff0c;查看服务状态第三步&#xff1a;在文件夹系统查看第四步&#xff1a;设置samba的配置文件第五步&#xff1a;再次去尝试连接linux服务共享修改smab服务的配置设置samba服务的用户名和密…

verilog实现计算器设计

该实验为用verilog编写的一个运算系统,其功能是实现4位整数的加、减、乘、除运算。运算时通过矩阵键盘输入运算类型和运算所需要的数据,然后通过内部电路处理,将计算的结果送于数码管或LCD1602显示。 工程截图如下: 本设计分为两个子模块,按键输入和数码管输出。 还有LC…

python字符串

python字符串 文章目录python字符串一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤1.字符串创建2.转义字符3.运算符4.格式化5.三引号6.内建函数总结一、实验目的 掌握字符串的用法 二、实验原理 字符串 字符串是一种序列&#xff0c;用于表示和存储文本。py…

Ubuntu16.04安装Chrome出错

安装了Ubuntu16.04之后想要装个Chrome&#xff0c;本来觉得是很简单的事情&#xff0c;下载->安装就结束了&#xff0c;结果没想到搞了好久&#xff0c;最后发现是因为自己偷懒所造成的&#xff01;因此&#xff0c;写下这篇博文做警示&#xff0c;如果其他人也碰到这样的问…

20230124使AIO-3568J开发板在Android12下横屏

20230124使AIO-3568J开发板在Android12下横屏 2023/1/24 14:05 百度搜索&#xff1a;RK3568 强制横屏 http://www.360doc.com/content/12/0121/07/29321110_1049371522.shtml RK3568 Android-HDMI旋转屏幕显示 硬件开发板&#xff1a;OK3568-C开发板&#xff08;基于国产瑞芯微…

【Leetcode每日一题】34.在排序数组中查找元素的第一个和最后一个位置|二分求下标

&#x1f331;博主简介&#xff1a;大一计科生&#xff0c;努力学习Java中!热爱写博客~预备程序媛 &#x1f4dc;所属专栏&#xff1a;LeetCode每日一题–进击大厂 ✈往期博文回顾: 【Leetcode每日一题】35.搜素插入位置|二分查找数组下标 &#x1f575;️‍♂️近期目标&#…