恶意代码分析实战 4 识别汇编中的C代码结构

news2025/1/17 1:06:59

4.1 Lab06-01.exe

  1. 由main函数调用的唯一子过程中发现的主要代码结构是什么?

使用Strings进行查看,需要注意最后的这两个字符串,一个是“没有网”,另一个是“联网成功”。
vmware_t1RocqczuN.png
IDA 中查看图结构。
vmware_4feqjJpxsl.png
明显是if-else结构。

  1. 位于0x40105F的子过程是什么?

明显sub_401000函数决定了分界点,点进去看一看:
vmware_FN6e23edgj.png
这个函数最后返回的值就是该函数的值,似乎这个if-else 中的内容并没有影响他的返回值,在这这两个流程中都有字符串,可以大致猜测出应该是打印字符串的功能,而sub_40105F函数恰好有两个参数,而字符串恰好是第一个参数,该函数应该就是printf。

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

该程序检查是否有一个可用的Internet连接。如果找到可用连接,就打印"Success: Internet Connection\n",如果没有找到,就打印 “Error 1.1: No Internet\n”。恶意代码在连接Internet之前,可以使用该程序来检查是否存在一个连接。

4.2 Lab06-02.exe

  1. main函数调用的第一个子程序执行了什么操作?

使用Strings查看一下程序,发现了一些有意思的字符串:

Error 1.1: No Internet
Success: Internet Connection
Error 2.3: Fail to get command
Error 2.2: Fail to ReadFile
Error 2.1: Fail to OpenUrl
http://www.practicalmalwareanalysis.com/cc.htm
Internet Explorer 7.5/pma
Success: Parsed command is %c

这几条字符串告诉我们,该程序可能会打开一个网页,并解析一条指令。我们还注意到其中有一个网页的URL,http://www.practicalmalwareanalysis.com/cc.htm。这个域名可以直接当成一条网络特征来使用。
导入表中还包含了一些网络功能的Windows API,如下所示:

InternetCloseHandle
InternetGetConnectedState
InternetOpenA
InternetOpenUrlA
InternetReadFile

这些函数都是WinINet的一部分,该库提供了通过网络使用HTTP的一组简单的API,其具体功能如下:

  • InternetOpenA 用于初始化对WinINet库的使用,并设置用于HTTP通信的User-Agent字段
  • InternetOpenUrlA 使用一个完整的FTP或者HTTP的URL,来打开一个句柄
  • InternetReadFile 用于从InternetOpenUrlA打开的句柄中读取数据
  • InternetCloseHandle 用于关闭这些一打开的文件的句柄。

接下来,使用WireShark进行动态分析。
vmware_5uwOsy0Zux.png
vmware_o8KFm4DymU.png
确确实实解析了这个网址。
使用IDA进行分析:
vmware_sI8uM3EZl2.png
第一个子进程是sub_401000,进去之后一看很熟悉。
vmware_1xpnVpRZya.png
就是Lab06-01.exe中的函数,判断是否联网的函数。

  1. 位于0x40117F的子过程是什么?

vmware_yXmyTcaa51.pngvmware_JBOEaY0flC.png
两个参数,还压入了格式化字符串,应该就是printf。

  1. 被main函数调用的第二个子过程做了什么?

点进去一看,比较复杂,单击F5,查看反汇编代码。

char sub_401040()
{
  char result; // al@2
  int Buffer; // [sp+0h] [bp-210h]@2
  char v2; // [sp+4h] [bp-20Ch]@9
  HINTERNET hFile; // [sp+200h] [bp-10h]@1
  HINTERNET hInternet; // [sp+204h] [bp-Ch]@1
  DWORD dwNumberOfBytesRead; // [sp+208h] [bp-8h]@3
  int v6; // [sp+20Ch] [bp-4h]@3

  hInternet = InternetOpenA(szAgent, 0, 0, 0, 0);
  hFile = InternetOpenUrlA(hInternet, szUrl, 0, 0, 0, 0);
  if ( hFile )
  {
    v6 = InternetReadFile(hFile, &Buffer, 0x200u, &dwNumberOfBytesRead);
    if ( v6 )
    {
      if ( (char)Buffer != 60 || SBYTE1(Buffer) != 33 || SBYTE2(Buffer) != 45 || SBYTE3(Buffer) != 45 )
      {
        sub_40117F(aError2_3FailTo, Buffer);
        result = 0;
      }
      else
      {
        result = v2;
      }
    }
    else
    {
      sub_40117F(aError2_2FailTo, Buffer);
      InternetCloseHandle(hInternet);
      InternetCloseHandle(hFile);
      result = 0;
    }
  }
  else
  {
    sub_40117F(aError2_1FailTo, Buffer);
    InternetCloseHandle(hInternet);
    result = 0;
  }
  return result;
}

InternetOpenUrlA的返回值赋给hFile,判断是否为0,如果为0的话,直接关闭句柄退出了,如果不为零,判断InternetReadFile的值是否为0,然后判断得到的值的buffer,然后判断前四个字符是否是“<!–”然后打印出后面的字符,打印了html注释,否则打印出出错。

  1. 在这个子过程中使用了什么类型的代码结构?

该子例程调用 InternetReadFile ,将返回的数据填充到一个字符数组中,然后每次一个字节对这个数据进行比较,以解析一个 HTML 注释。
if-else嵌套。

  1. 在这个程序中有任何基于网络的指示吗?

vmware_4fDlbBnjxn.png
查找字符串是发现的:

http://www.practicalmalwareanalysis.com/cc.htm

  1. 这个恶意代码的目的是什么?

返回main函数,在sub_401040函数调用后,将解析出来的字符首地址在al返回并最后存放到ecx中压入栈作为参数,然后打印字符串“Success: Parsed command is %c”,而%c就是sub_401040函数解析出来的字符串。紧接着休眠0EA60h=60000ms也就是60秒。
所以综合以上分析可以得出结论,Lab06-02.exe先判断是否有可用的网络,如果没有则停止运行,如果已连接网络则在http://www.practicalmalwareanalysis.com网址下载并解析HTML文件,然后打印字符串Success : Parsed command is加上注释正文字符,最后程序休眠60s然后终止运行。

4.3 Lab06-03.exe

  1. 比较在main函数与实验6-2的main函数的调用。从main中调用的新的函数是什么?

首先从静态分析开始,使用 Strings ,找到了一些有趣的字符串。

Error 1.1: No Internet
Success: Internet Connection
Error 2.3: Fail to get command
Error 2.2: Fail to ReadFile
Error 2.1: Fail to OpenUrl
http://www.practicalmalwareanalysis.com/cc.htm
Internet Explorer 7.5/pma
Error 3.2: Not a valid command provided
Error 3.1: Could not set Registry value
Malware
Software\Microsoft\Windows\CurrentVersion\Run
C:\Temp\cc.exe
C:\Temp
Success: Parsed command is %c

这些信息说明程序可能会修改注册表。其中 Software\Microsoft\Windows\CurrentVersion\Run 是注册表中一个常用的autorun位置。C:\Temp\cc.exe 则是一个目录和文件名,可能是恶意代码将自身复制到了此处。
查看导入表:
vmware_PncbTHV4Vf.png

CopyFileA
DeleteFileA
CreateDirectoryA
RegOpenKeyExA
RegSetValueExA

前三个导入函数是自说明式的。RegOpenKeyExA 函数一般与 RegSetValueExA一起用于往注册表中插入信息,在恶意代码将其自身或其他程序设置为随着系统开机就自启动以持久化运行时,通常会使用这两个函数。
使用IDA Pro查看该程序,sub_401000 和 sub_401040处的函数与Lab 06-02 的一样。sub_401271函数则是printf函数。sub_401130 是新函数,点进去看起来像是一个switch语句。

  1. 这个新的函数使用的参数是什么?

sub_401040函数中返回的值作为了这个新函数的参数,查看sub_401040函数,发现和Lab 06-02中的函数是一样的,返回的是获取的Html中的注释的内容。
这个新的函数有两个参数,第一个是从HTML注释中解析来的指令字符,第二个参数是标准main函数中包含的参数中的argv[0],也就是程序名本身。

  1. 这个函数包含的主要代码结构是什么?

新的函数包含了一条switch语句和一个跳转表。
vmware_UE4E145gzX.png
vmware_WWgq5W8yH3.png
case 0:创建一个目录C:\Temp。
case 1:将自身复制到目录下并改名。“C:\Temp\cc.exe”
case 2:删除文件。
case 3:创建一个自启动项。
case 4:程序睡眠100秒钟。
default: ,打印错误,直接退出。

  1. 这个函数能够做什么?

其实上一题也提到了,这个新的函数可以打印出错信息,删除文件,创建一个文件夹,设置一个注册表项的值,复制一个文件,或者休眠100秒。

  1. 在这个恶意代码中有什么本地特征吗?

有两个本地特征,一是创建了创建了文件路径"C:\Temp\cc.exe",二是添加了一个自启动项 Software\Microsoft\Windows\CurrentVersion\Run。

  1. 这个恶意代码的目的是什么?

该程序先检查是否存在有效的Internet 连接。如果找不到,程序直接终止。否则,该程序会尝试下载-一个网页,该网页包含了一段以<!–开头的HTML注释。该注释的第-一个字符被用于switch语句来决定程序在本地系统运行的下一步行为,包括是否删除一个文件、 创建一个目录、设置一个注册表run键、复制一个文件或者休眠100秒。

4.4 Lab06-04.exe

  1. 在实验6-3和6-4的main函数中调用之间的区别是什么?

查看一下函数的流程。
首先在main函数现代用了 sub_401000 的函数,检测是否联网状态则跳转到loc_401248 处来到loc_401248处,发现这个代码块是比之前的实验多的,它将var_C偏移地址处的内容赋值0,然后无条件跳转到loc_40125A。
vmware_iEM9ZK9OQ5.png
来到loc_40125A处,这个代码块也是比Lab06-03.exe多出来的,它与5A0作比较,jge指令是如果大于等于则跳转,而之前的变量Var_C被赋值0很显然不能跳转,继续向下执行代码接下来的代码调用了sub_401040函数,和之前一样就是下载HTML文件并返回注释正文的首地址,如果返回首地址成功则跳转到loc_40127E。
vmware_Wn0pJzlwJL.png
来到loc_40127E可以看到和之前一样,就是打印出注释正文的的第一个字符然后调用sub_401150函数,最后休眠60s,然后无条件跳转到loc_401251处。
而sub_401150函数和之前的sub_401130函数一样,就是一个swich语句根据HTML文件注释正文的第一个字符实现程序自我复制和开机自启等功能。
vmware_RuvSeXSfE3.png
来到loc_401251处,发现它就是对变量var_C进行了加1操作,类似于c代码的自增,然后就又回到了loc_40125A处再接着与5A0h做计较,很明显这是一个循环结构,一直到变量大于等于5A0h则跳出循环结束程序。

  1. 什么新的代码结构已经被添加到main中?

vmware_E1IJcKTbnU.png
增添了一个循环函数。

  1. 这个实验的解析HTML的函数和前面实验中的那些有什么区别?

vmware_mtR8XMVkI6.png
进入函数sub_401040中,可以看到相比之前字符串Internet Explorer 7.50/pma%d发生了变化,多了一个%d型的参数,对应变量就是arg_0也就是函数调用之前传入的参数,即循环的次数。接下来还调用了一个sprintf函数,对传入的字符串进行了格式化,然后传给了InternetOpenA函数。
增添了了一个 sprintf 函数,从而使用传入的参数创建用于 HTTP 通信的 User-Agent 字段。

  1. 这个程序会运行多久?

vmware_CwvKMh5DxX.png
1440 * 60 (s),24个小时。

  1. 在这个恶意代码中有什么新的基于网络的迹象吗?

sub esp, 230h
mov eax, [ebp+arg_0]
push eax
push offset aInternetExplor ; “Internet Explorer 7.50/pma%d”
lea ecx, [ebp+szAgent]
push ecx ; char *
call _sprintf

是的,运行了一个新的User-Agent。它的形式是 “Internet Explorer 7.50/pma%d” ,其中%d是程序已经运行了的分钟数。

  1. 这个恶意代码的目的是什么?

首先检测网络连接,如果没有网络连接则停止运行;
如果网络已连接则下载HTML网页,该网页包含了注释,解析该网页,然后根据注释正文的第一个字符做出swich语句的跳转操作:
参数为‘a’时创建C:\Temp的目录;
参数为‘b’时,进行了程序的自我复制;
参数为‘c’时,删除了C:\Temp\cc.exe;
参数为‘d’时,将程序设为开机自启动;
参数为‘e’时,程序休眠100秒。
并且将检测到网络连接后的操作循环运行1440次。

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

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

相关文章

进程间通信/管道/消息队列/共享内存/信号量

本文重点目标&#xff1a; ⭐进程间通信介绍⭐ ⭐管道⭐ ⭐消息队列⭐ ⭐共享内存⭐ ⭐信号量⭐ 1.进程间通信介绍 什么是通信&#xff1f; 通信指的是数据传输、资源共享、通知事件和进程控制。 ①数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 ②资源共享&a…

【GIS】高分辨率遥感影像智能解译

1 绪论 随着航空科技工业的不断成熟与发展&#xff0c;我国遥感卫星研制能力不断攀升&#xff0c;发射数量逐年提高&#xff0c;在轨运行的遥感卫星为社会生产及居民日常生活提供了巨大的支持与便利。我国目前同时在轨运行的遥感卫星数量已超过60颗&#xff0c;每天获取并传回…

LeetCode[990]等式方程式的可满足性

难度&#xff1a;中等题目&#xff1a;给定一个由表示变量之间关系的字符串方程组成的数组&#xff0c;每个字符串方程 equations[i]的长度为 4&#xff0c;并采用两种不同的形式之一&#xff1a;"ab"或 "a!b"。在这里&#xff0c;a 和 b 是小写字母&#…

【Python学习003】高效数据结构-列表

【Python学习003】高效数据结构-列表 我们的公众号是【朝阳三只大明白】&#xff0c;满满全是干货&#xff0c;分享近期的学习知识以及个人总结&#xff08;包括读研和IT&#xff09;&#xff0c;希望大家一起努力&#xff0c;一起加油&#xff01;求关注&#xff01;&#xf…

浏览器使用本地硬盘上的JS文档

网页通过<script>标记可以引入在线的js文档&#xff0c;只有把网页保存在本地硬盘才能使用相对路径引入本地js文档&#xff0c;普通浏览器难以实现在线页面上引入本地js文档。怎么解决这个问题呢&#xff1f;首先准备好需要引入的JS文档&#xff0c;可以是成熟的JS库&…

【docker概念和实践 4】(3)本地镜像提交到阿里云

一、说明 本篇讲述如何将自己制作的容器转化成镜像&#xff0c;再将镜像推送到远端阿里云上。 二、制造一个本地容器 2.1 从远端仓库拉取ubuntu镜像 使用镜像拉取语句&#xff1a; docker pull ubuntu:20.04 docker run -it ubuntu&#xff1a;20.04 bash 通过以上两句&…

LeetCode[200]岛屿数量

难度&#xff1a;中等题目&#xff1a;给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外&am…

5-4中央处理器-控制器的功能和工作原理

文章目录一.控制器的结构和功能二.硬布线控制器1.硬布线控制单元图2.微操作命令分析3.CPU的控制方式&#xff08;1&#xff09;同步控制方式&#xff08;2&#xff09;异步控制方式&#xff08;3&#xff09;联合控制方式4.硬布线控制单元的设计步骤&#xff08;1&#xff09;分…

qsort函数用法 + 模拟实现qsort函数

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前是C语言学习者 ✈️专栏&#xff1a;【C/C】算法 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞…

论文笔记目录(ver2.0)

1 时间序列 1.1 时间序列预测 论文名称来源主要内容论文笔记&#xff1a;DCRNN &#xff08;Diffusion Convolutional Recurrent Neural Network: Data-Driven Traffic Forecasting&#xff09;_UQI-LIUWJ的博客-CSDN博客iclr 2017使用双向扩散卷积GRU&#xff0c;建模空间和…

目标跟踪心得篇五:MOT数据集标注、TrackEval的使用、DarkLabel不能自动跟踪解决方案及如何在MMTracking上输出跟踪评测

跟踪方向的标注成本非常很大的 ,那么我们如何尽可能一次性弄好呢? 所选标注工具:DarkLabel DarkLabel是一个轻量的视频标注软件,尤其做MOT任务非常友好,其标注可以通过脚本转化为标准的目标检测数据集格式、ReID数据集格式和MOT数据集格式。 使用之前: darklabel.yml:保…

传参的理解

前言 当我们调用函数的时候&#xff0c;参数是怎么传递给被调用方的&#xff0c;有想过这个问题吗&#xff1f;传递不同大小的参数对调用方式有影响吗&#xff1f;本文将带你探究这些问题&#xff0c;阅读本文需要对函数栈帧有一定的理解&#xff0c;并了解基本的汇编指令。 …

傅一平:2022年我的私人书单

2022年过去了&#xff0c;推荐我的TOP 10 书单&#xff0c;同时附上我的一句话评语和豆瓣的评分&#xff0c;这些书代表了我学习的方向&#xff0c;包括学习方法、思考方法、数据治理、数字化转型、系统架构、职场管理、个人修养、生活态度等。TOP 1 学习究竟是什么一句话评语…

【Ajax】HTTP超文本传输协议

一、HTTP协议简介什么是通信通信&#xff0c;就是信息的传递和交换。通信三要素&#xff1a;通信的主体通信的内容通信的方式1.1 现实生活中的通信案例&#xff1a;张三要把自己考清北大学的好消息写信告诉自己的好朋友李四。其中&#xff1a;通信的主体是张三和李四&#xff1…

Linux网络:应用层之HTTP协议

文章目录一、应用层1.协议2.网络版计算器二、HTTP 协议1. URL2. HTTP 协议格式3.查看 HTTP 请求4.发送 HTTP 响应5. HTTP 的方法6. HTTP 的状态码7. HTTP 的版本8. HTTP 常见 Header9. Cookie 与 session三、HTTP 与 HTTPS一、应用层 我们程序员写的一个个解决实际问题&#x…

jvm 堆 栈中存什么?

数据类型 Java虚拟机中&#xff0c;数据类型可以分为两类&#xff1a;基本类型和引用类型。基本类型的变量保存原始值&#xff0c;即&#xff1a;他代表的 值就是数值本身&#xff1b;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用&#xff0c;而不是对象本身&…

矩阵理论复习(六)

Q代表有理数&#xff0c;即整数和小数部分有限的分数和小数部分无限循环的分数。无限不循环的小数就是无理数。所有无理数和有理数加起来就是实数集R。与实数对应的就是虚数。 数域的定义 线性空间的定义 线性空间的基和维数 子空间的定义 子空间的判别方法 最常见的…

【唐诗学习】二、初唐诗词领路人

二、初唐诗词领路人 唐朝之前的主流诗人都是在宫廷混口饭吃&#xff0c;他们整天围着皇帝转&#xff0c;写的大多是宫廷奢靡的生活&#xff0c;还会拍皇帝马屁。主流诗人受前朝影响很大&#xff0c;就这么发展到了初唐。照这个剧情发展下去&#xff0c;诗歌迟早要完蛋。 可有些…

狂神聊Git~

版本控制&#xff1a; 版本控制的概念: 它是一种在开发的过程中用于管理我们对文件&#xff0c;目录或工程等内容的修改历史&#xff0c;方便我们查看历史记录&#xff0c;备份以便恢复以前的版本的软件工程技术 版本控制的作用: 用于管理多人协同开发项目的技术 实现跨区…

Tomcat进程占用CPU过高怎么办?

在性能优化这个主题里&#xff0c;前面我们聊过了Tomcat的内存问题和网络相关的问题&#xff0c;接下来我们看一下CPU的问题&#xff0c;CPU资源经常会成为系统性能的一个瓶颈&#xff0c;这其中的原因是多方面的&#xff0c;可能是内存泄漏导致频繁GC&#xff0c;进而引起CPU使…