selph
selph
发布于 2021-11-04 / 492 阅读
0
0

恶意代码分析实战Lab07-分析恶意Windows程序

笔记

Windows 文件系统:

  • 常用函数:
    • CreateFile:打开和创建新的文件
    • WreteFile和ReadFile:读写文件
    • CreateFileMapping和MapViewOfFile:把文件映射到内存中再保存到文件中
  • 特殊文件:
    • ADS备用数据流可以隐藏数据

Windows 注册表:

用来保存操作系统与程序相关配置信息,也是很好的主机迹象来源

  • 结构:根键,子键,键,值项,值;具体内容见网上博客
  • 其中Run键用来保存自启动程序的路径
  • 常用函数:
    • RegOpenKeyEx:打开注册表键
    • RegSetValueEx:添加注册表值
    • RegGetValue:获取注册表值项的数值
  • 使用reg脚本可以很方便的修改注册表

网络 API:

  • 伯克利兼容套接字网络函数:ws2_32.dll

    • socket

    • bind

    • listen

    • accept

    • connect

    • recv

    • send

      WSAStartup函数必须要在其他网络函数之前调用,在这里设置断点应该很快就能看到网络函数了

  • WinINet API:wininet.dll

    • InternetOpen:初始化连接
    • InternetOpenUrl:用来访问URL
    • InternetReadFile和ReadFile:从互联网下载的文件中读取数据

跟踪恶意代码的运行

DLL:

  • 恶意代码作者用DLL用法:
    • 保存恶意代码,然后加载到其他进程里运行
    • 使用windows DLL来执行功能
    • 使用第三方DLL,从而避免直接使用WindowsAPI进行实现功能
  • DLL基本结构
    • 入口时DllMain函数
    • 和exe结构差不多(都是PE)

进程:恶意代码通常创建一个新进程或修改一个已存在的进程来执行代码

线程:

  • 可以通过创建线程把DLL加载到进程里
  • 可以为输入和输出创建两个线程来执行

使用互斥量进程间协作:

  • 进程和线程相关的时互斥量mutex,在内核中也称互斥门mutant,互斥量时全局对象,用于协调多个进程和线程,用于控制共享资源访问

服务:通过服务安装,可以更持久的驻留,甚至不会在任务管理器进程里显示出来

  • 相关函数:
    • OpenSCManager
    • CreateService
    • StartService
  • 服务相关信息保存在注册表里:HKLM\SYSTEM\CurrentControlSet\Service
  • 可以通过sc命令来管理服务的启动start停止stop查询qc等操作

COM:是一种标准接口,可以在任意语言间相互调用

  • 每一个使用COM的线程,必须在调用其他COM库函数之前,至少调用一次OleInitialize或CoInitializeEx
  • COM对象通过全局唯一标识符GUID、类型标识符CLSID、接口标识符IID来访问
  • 恶意代码常用的是Navigate,可以启动IE访问Web地址,来自IWebBrowser2接口

异常:

  • 异常发生的时候会查看fs:0保存的异常信息(fs:0会保存异常发生的地址,异常信息在栈上)

作业

Lab 7-1

目标文件:Lab07-01.exe

  1. 计算机重启后,这个程序如何确保持续运行(持久化)?

    这个函数被用于实现一个服务,通常是服务运行必须的流水账式的代码之一,成为服务后,就会实现开机自启

    image-20211004202123194

  2. 为什么这个程序会使用一个互斥量?

    防止程序重复执行:

    image-20211004201902255

    如果获取互斥量成功,说明该程序已经在运行了,所以直接退出程序

  3. 可以用来检测这个程序的主机特征是什么?

    这个程序之后会通过API来创建服务:

    image-20211004202615584

    服务名为Malservice,可通过注册表来检查

  4. 可以用来检测这个程序的网络特征是什么?

    网络特征根据题5的解答可知,会向指定网址发起访问

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

    这个程序完成等待开始执行的时候,会创建进程,会创建20次:

    image-20211004203427113

    这个进程会执行如下代码:

    image-20211004203450934

    对指定网址发起访问建立连接,然后jmp跳转到上面进行死循环不停的建立连接,程序的目的是对目标网站发起DDOS攻击,感染多台设备后,在2100年同时进行攻击

  6. 这个程序什么时候完成执行?

    image-20211004203016841

    这里设置了Windows的时间结构体SystemTime,初始化为0之后,给年设置为了2100年,后面把这个时间作为参数传入了SetWaitableTimer函数,随后进入WaitForSingleObject函数开始等待,到时候会开始继续执行

Lab 7-2

image-20211004205539084

后面就是返回了,程序流程很简单,获取COM对象地址,然后创建一个给COM接口用的字符串,然后调用偏移0x2C处的函数,来执行功能,执行完就退出了

COM组件通过IID和clsid获取对象,使用注册表查找clsid:

image-20211004210214919

得知COM组件类别是IE,通过搜索引擎搜索IID,得知:

image-20211004210416611

是IWebBrowser2 接口,但这里搞不懂是怎么通过偏移来获得函数地址的,希望知道的师傅能告知一下

  1. 这个程序如何持久化?

    没有持久化啊

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

    弹窗广告

  3. 这个程序什么时候执行?

    点开的时候立即执行,执行完就终止了,没有任何痕迹留在主机上

Lab 7-3

分析目标:Lab07-03.exe,Lab07-03.dll

注意:这个程序一旦被安装很难清除,可能会引起系统损坏,务必给运行用的虚拟机拍好快照!

分析:exe

自己瞎分析了一通后,看了下答案,突然领悟了书上说的不要陷入细节,首要任务不是了解具体的实现细节,而是要知道目标程序做了哪些事情!

main函数首先判断参数:如果参数数量,和参数的值不对,程序就会立马返回,正确执行需要如下格式:

> lab07-03.exe WARNING_THIS_WILL_DESTROY_YOUR_MACHINE

image-20211005152350983

往下看是一堆CreateFile,CreateFileMappingA等文件操作,其间看到字符串C:\\Windows\\System32\\Kernel32.dlllab07-03.dll,然后是一堆内存操作,这里具体做什么就先不去管它了,先看整体的流程,往后看:

image-20211005152642921

跳过那一段功能后,就到这里了,这里首先有一个复制文件,把Lab07-03.dll复制成kerne132.dll,这是一个文件特征

然后结束之前,还掉调用了一个函数sub_401816,参数是字符串:C:\\*,应该是要对这个目录做些啥

进去直接就看到了FindFirstFileA函数,这个是用来搜索文件的函数:

image-20211005152956609

再往下走看到这个函数调用了自己在递归,再往下看发现了stricmp函数,对比函数,上面的参数是.exe,这里可以推测是对比文件后缀:

image-20211005153316473

如果对比成功就进入函数sub_4010A0,对比失败就跳转下去返回,接下来看看对比成功后会发生什么

首先是文件操作,打开文件映射到内存进行修改,然后是字符串比对,如果有kernel32.dll就修改成kerne132.dll:

image-20211005153505087

然后再往下就没啥了,这里初步推断,exe程序会遍历硬盘所有exe文件,把导入表中的kernel32.dll换成kernel132.dll,从而实现程序加载的时候,载入假的dll,dll劫持,恶意代码实际功能应该在dll里

接下来分析dll:

dll没有导出函数(非常可疑),导入函数:

image-20211005153856322

字符串:

image-20211005153915285

这里出现了IP地址,互斥量相关函数,网络相关函数,以及奇怪的字符串,应该是互斥量名称

接下来看看dllmain:

image-20211005154030334

首先是创建的互斥量SADFHUHF,好家伙,另一个主机特征

image-20211005154928680

接下来是网络连接环节,和那个ip建立连接后,发送hello,然后接收信息存在buf中,接下来对比buf中的值来进行操作:

image-20211005155019187

如果buf中的前几个字母是sleep,就sleep60秒

image-20211005155436075

如果是exec,就创建进程,这个CommandLine参数很神奇,没有被赋值过,但这里却有值,因为啊:

image-20211005155526024

CommandLine是一片很大的空间,然后距离buf就5个字节,buf写超了的部分全部落在了CommandLine里了,比如exec cmd.exe则CommandLine里会有cmd.exe刚好就是命令

  1. 这个程序如何完成持久化驻留,来确保计算机重启还能运行?

    通过修改每个exe的导入表的kernel32.dll为kerne132.dll,来随着exe启动

  2. 这个恶意程序两个基于主机的特征是什么?

    C:\\windows\\system32\\kerne132.dll文件,和互斥量SADFHUHF

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

    连接远程服务器接收指令进行执行,是个后门

  4. 一旦被安装,你将如何移除它?

    重装系统,或者把恶意exe给改了,把功能反过来,用kernel32.dll去覆盖kerne132.dll


评论