Skip to content

Latest commit

 

History

History
131 lines (66 loc) · 10.2 KB

逆向入门分析实战(四).md

File metadata and controls

131 lines (66 loc) · 10.2 KB

> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [mp.weixin.qq.com](https://mp.weixin.qq.com/s/S5ZlFhvtSn7PaA6ijVW73A)

亲爱的, 关注我吧

9/14

文章共计 1836 个词

是逆向入门分析实战系列的第四篇

逆向入门分析实战(一)

逆向分析入门实战(二)

逆向入门分析实战(三)

来和我一起阅读吧

这次我们对很多木马和 APT 组织常见的一个手法进行正向开发和逆向分析,这个手法就是当发现当前系统中存在特定的杀毒软件和行为监控软件等安全软件时,退出自身进程不再执行自身的恶意模块。其实这个原理还是很简单的,就是进程遍历,然后与这些安全软件的进程进行对比。

进程遍历的常见方法是首先使用 CreateToolhelp32Snapshot 函数创建一个进程快照,这个快照是当前系统中所运行的所有进程,和使用 Windows 任务管理器查看进程的结果类似,区别在于 Windows 任务管理器是实时的,而创建进程快照是 “拍照” 那一刻所运行着的所有进程。之后使用 Process32First 和 Process32Next 对所有的进程进行遍历,将得到的进程名与安全软件的进程名进行对比,如果相等,则退出自身进程。对于 windows10 的任务管理器不再显示映像名称,可以使用 cmd 中的 tasklist 命令来查看当前运行的所有进程。

那我们怎么知道安全软件的进程名呢?这就要靠自己去收集了,比如 360tray.exe 和 360sd.exe 就是 360 安全卫士和 360 杀毒的进程名,我们以 360 杀毒为例,当我们发现当前机器上运行了 360 杀毒则直接退出。

1

正向开发之进程遍历查找 360 杀毒

1、CreateToolhelp32Snapshot 函数

这个函数的参数有两个,第一个是 dwFlags 参数,这个参数用来指定快照中包含的系统内容,在这里我们要查看当前系统中所有的进程,所以 dwFlags 参数要指定为 TH32CS_SNAPPROCESS,第二个参数为进程 ID,这里我们应该指定为 0,为什么会有这个参数呢?因为 CreateToolhelp32Snapshot 函数不仅仅可以用来查看当前系统中运行的进程,还可以查看某一个指定进程的所有堆(TH32CS_SNAPHEAPLIST)或者模块(TH32CS_SNAPMODULE),这个参数只有当查看某一个指定进程的所有堆或者模块时才有效。我们需要将其指定为 0,表示查看当前系统中运行的进程,函数调用成功后返回值是快照的句柄(handle)。如果想了解更多内容可以查看 MSDN 文档。

2、Process32First 函数

这个函数查找系统快照中第一个进程信息,有两个参数,第一个参数 hSnapshot 是 CreateToolhelp32Snapshot 返回的进程句柄,第二个参数 LPPROCESSENTRY32 是一个结构体指针,而这个结构体首先是需要我们来初始化,之后当 Process32First 调用成功后,就会将函数的返回值存储到这个结构体中,这一点和 Python 不太一样,需要注意。

3、Process32Next 函数

这个函数查找系统快照中下一个进程信息,和 Process32First 参数一样,两者结合即可遍历系统快照中的进程。

4、编写代码

首先需要把必须的一些头文件包含进来,之后创建了一个 listProcess 函数来遍历进程,在 listProcess 函数里首先初始化 LPPROCESSENTRY32 结构体,其中需要注意的是在调用 Process32First 之前,我们需要先将结构体中的 dwSize 初始化,这个值表示结构体大小,可以通过 sizeof(LPPROCESSENTRY32) 获取。之后依次调用 CreateToolhelp32Snapshot、Process32First、Process32Next,然后使用 StrStr 函数进行对比,系统快照中的进程名保存在 LPPROCESSENTRY32 结构体中的 szExeFile 这个成员变量里。理解这几个 API 函数和相互之间的调用关系,编写程序便水到渠成了。编译运行,在一台没有装 360 杀毒的主机上运行,最后执行完毕:

如果在一台装有 360 杀毒的主机上运行,当检测到有 360se.exe 之后便停止运行:

2

逆向分析之进程遍历查找 360 杀毒

ida 停留在这个界面,我们双击查看 listProcess 函数的内容:

首先查看其调用了 CrateToolhelp32Snapshot 函数:

其中可以看到 PROCESSENTRY32 结构体在此系统版本和编译环境下的大小为 128h,dwFlags 的值为 2,这是因为 TH32CS_SNAPPROCESS 是一个宏定义,它对应的常量为 2:

得到 CrateToolhelp32Snapshot 返回值后为什么要将其与 0FFFFFFFFh 进行对比?查看其二进制:

32 个 1,我们通过查看宏的方式,看到这个值是 -1。

为什么是 32 个 1 呢?我第一时间想到原来学习计算机组成原理的时候有一节课在讲补码,好像涉及到这个。经过查阅资料,发现确实是 -1。负数是通过对其绝对值相同的正数先按位取反再加 1 得到的,即 -1 是通过对 1 按位取反之后再加 1 得到的,这样能保证两者相加结果为 0(两者相加会溢出,正好为 0)。把当年没认真学的知识弄清楚的感觉真棒!

之后,调用了 Process32First 函数,参数分别为一个指针和一个快照:

之后,获取其进程名然后使用 StrStr 查找是否包含 360sd.exe:

重点查看这里:

其中,先将 eax 的值(即为 PROCESSENTRY32 结构体中的 szExeFile 成员变量,具体可查看 PROCESSENTRY32 结构体)存入 esp+4,再将 the process is %s\n 字符串存入 esp 中,这其实相当于是先 push eax,再 push 字符串,然后调用 printf 进行输出。

之后再调用 StrStr 将进程名与 360sd.exe 进行对比。如果匹配上,则直接进入最左侧:

如果匹配不上,则进入右侧,调用 Process32Next,再循环执行。当 Process32Next 返回值为 FALSE 即为零时,则会跳转到中间,此时所有的进程已经遍历完。

至此,整个程序逆向分析完毕。

3

总结

此次正向开发和逆向分析,主要是对 windows 中的进程遍历相关的 API 进行了熟悉和掌握,同时,将遍历到的每一个进程名与常见的安全软件进行匹配,之后再采取相应的措施。基于此,可以拓展开发更多的功能,比如匹配一些行为监控软件、Wireshark、虚拟机 vmtools 软件等等。

9/14

欢迎投稿至邮箱:[email protected]

有才能的你快来投稿吧!

稿件一经发布,现金奖励 200 – 800 元。

投稿细则都在里面了,点击查看哦重金悬赏 | 合天原创投稿涨稿费啦!

戳 “阅读原文” 我们一起学习