内核级病毒与木马攻防:windows可执行文件结构解析及常用工具

2020-07-29 09:53:24 浏览数 (1)

大多数人使用windows系统,相必对其.exe结尾的文件印象深刻,执行任何程序时,你双击该文件即可,这个文件就是系统的可执行文件,我们需要了解其组成结构才能对其进行侵入,劫持或注入恶意代码。

.exe文件也叫PE文件,它由一系列段头和段来组成。它一开始是一系列段头数据结构,用于描述各个段的相关性质,接下来就是包含代码和数据的各种段。有几个段特别值得注意,.text段包含CPU可以执行的指令,其他所有段包含数据或者是辅助CPU执行该段里面指令的相关信息,这个段是唯一包含可执行代码的段。.rdata包含引入和导出的数据,同时它还包含只读数据。.data段包含程序的全局数据,也就是这里的数据代码段中的代码可以随意访问,而程序用到的局部数据则不会存储在这个段。.rsrc段包含程序资源,例如菜单,图标,字符串等。

在windows系统上,最常用的查看PE结构的程序叫PEView,其界面如下:

左边面板展示了它读取.exe文件所获得的各种头部信息,一开始的IMAGE_DOS_HEADER和MS_DOS sub program没有意义,接下来的段头是IMAGE_NT_HEADERS里面的IMAGE_FILE_HEADER段就包含了有关该exe文件的一些重要信息,例如展示了该文件的编译时间,当然这个时间可以被更改,黑客往往会将恶意代码先注入到程序,然后在编译成可执行文件,这样出来的exe文件在这个段里对应时间就会比较新,于是黑客就会对其进行修改,这样就如人看不出相应程序曾经被编译过。

里面的IMAGE_OPTINAL_HEADER则包含了很多重要信息,例如里面的Subsystem字段用于表明程序时窗口类型还是命令行类型。如果它取值是IMAGE_SUBSYSTEM_WINDOWS_GUI那就是窗口类型,如果最后三个字符是CUI那就是命令行类型。

最需要关注的信息来自于IMAGE_SECTION_HEADER,如下图所示,其中的VIRTUAL_SIZE表示段被加载到内存后的大小,Size of Raw Data表示该段的实际物理大小,通常情况下这两个段的值会一样,但考虑到加载到内存后有可能需要内存对其,因此虚拟大小会比实际大小要大一些。

这两个字段能够反映出不少信息,如果.text段中对应的Virtual Size远远大于Size Of Raw Data,那意味着这个程序极有可能被打包过。通常情况下,被打包过的可执行文件会显示出很多不正常的段,例如下面是被打包过的exe被加载到PEView的情况:

可以看到里面例如UPX1这类段与前面我们展示正常的exe文件所包含的.text这些段都不同,当发现这种情况出现时我们就要怀疑该文件被动过手脚。同时在UPX0段里,它对应的Size of Raw Data居然是0,但是Virtual Size是2000,这意味着被解压的代码将会占据那么多的虚拟空间。

在PE文件中一个非常值得关注,也是黑客经常做手脚的地方就是资源段,使用名为Resource Hacker的软件能有效查看该段的内容,如下图所示:

打开resource hacker 并加载指定exe文件后,它会读取文件的.rsrc段,取出程序运行时用到的资源,例如字符串,图标等,上面打开的是程序的对话框资源,在左边面板还有很多关键资源,例如菜单,版本信息等。黑客乃至正规程序会将代码或驱动程序,在程序启动时从资源段中将代码和驱动提前解压出来运行。

在后续进行动态分析时,我们需要将恶意代码或被感染的可执行文件运行起来,然后监视其一举一动,通过它在运行时的表现来反向推导其设计原理,这时就需要使用到一个重要的工具叫Process Monitor,它能够监控代码在运行时发起或接受的各种消息或是对系统执行的各种操作:

从上面可以看到,Process Monitor监控了当前运行程序的各种运行状况,例如选中的进程调用了一次注册表API,也就是ReqQueryKey,被监控的程序其接口调用会被它抓取,通过这些信息我们就能很好的分析恶意代码的目的和运行原理。由于它抓取的信息实在太多,因此我们需要使用过滤器找出关心的内容,例如:

例如在上图中,我们通过点击菜单”Filter”然后在弹出的对话框中选择Operation,然后再填入SetReqValue,这样它就会过滤出所有执行了该调用的进程来。另一个监控进程的有利武器就是Process Explorer,这是进行windows 木马和病毒动态分析时必不可少的利器,它运行情况如下图:

可以看到它能以丰富的界面显示出所选进程的一系列动作。它有5列分别显示进程ID,CPU使用情况,基本描述和开发商名称,它一个重要特性是能监控进程是释放的子进程,很多恶意代码都会采用这种方式。它还提供一个重要功能就是查看进程在磁盘上和在内存中的字符串,选择一个进程,右键后选择”properties”,在弹出的对话框中选择strings,这样就能查看它自带的字符串资源,此时有两个选项分别为disk,memory,黑客会用一种技术叫进程替换,如果disk选项中展示的字符串与memory中展示的差别很大,那说明该进程可能被替换掉,运行在内存中的并不是原本磁盘上的代码。

由于windows极度依赖于注册表机制,因此操纵注册表也是黑客常用的手段之一。通过监控注册表的变化也有利于分析恶意代码的运行机制,常用的注册表工具叫Regshot:

点击1st shot,它会把当前注册表的内容记录下来,然后我们运行恶意程序或代码,然后再次启动它获取注册表信息,接着和第一次进行比较,两次的不同就可以认为是恶意程序对注册表的操作。

更多的有用工具和分析方法我们在后续的实践中再加以学习和利用。

0 人点赞