第一步:查看程序的基本信息(无壳)
第二步:查看资源信息(没有资源信息)
第三步:查看导入表、字符串资源等信息
通过查看导入表可以大概猜测一下程序的部分功能:应该是和文件操作有关系,打开一个已经存在文件或者是创建一个新的文件,并对该文件进行操作
在查看字符串的时候,可以看到一些可疑的字符串,像图中出现的Kernel32.dll和Kerne132.dll(在这里一个是系统的动态链接库文件而另一个是kerne132.dll可疑文件名),猜测是将系统的Kernel32.dll文件替换成为kerne132.dll.
第四步:详细分析
在使用OD附加程序进行调试的时候,需要注意几点:
1:通过IDA我们可以很清楚的看到,程序有对于程序参数的操作,所以需要注意这个程序在调试的时候需要手动输入参数
2:如果不手动输入参数的话,可以通过改跳转的方式继续进行调试,但是需要注意的是,在这个时候继续调试的时候,会发现程序会产生异常,所以还是要手动输入参数
可以看到,在程序之初的时候,就会对程序的参数进行判断和操作,判断程序是否有两个参数,以及第一个参数是不是指定字符串,只有当程序的参数以及参数与指定字符串的比较相同的时候才会执行下一步操作,否则直接退出程序.
指定的字符串:
所以也就是说,在使用OD进行调试的时候,要输入的参数其实就是:
WARNING_THIS_WILL_DESTROY_YOUR_MACHINE
在对程序参数进行判断之后,执行下一步操作:
打开系统的Kernel32.dll文件:
之后,为该文件创建一个映射,也就是将文件映射到内存中:
之后,打开目标文件(目标DLL文件):因为目标DLL文件就在程序目录下(这里,如果打开目标DLL文件失败,程序退出)
之后的操作和之前类似,为这个新打开的文件创建一个映射,并且把文件映射到内存中
总结:上边的一系列操作,过程其实很简单,就是输入参数启动程序,之后打开两个目标文件,之后将目标文件映射到内存中
继续分析接下来的操作:接下来的分析都是对于两个文件的PE结构的操作,所以需要分析这对于PE结构有较深的了解,之前我的博客里边也有相关知识的介绍,同时在分析的过程中,也还要使用IDA的添加结构体的功能将已经分析出的数据进行修改,这样也会大大减少分析的工作,也会增加反编译之后的程序的可读性.
(以下过程是分析过整个文件之后的小总结)
下边的整个过程在分析上比较繁琐,但是实现的功能其实很简单(这里先不明说,下边会详细分析),这里要说的主要的事情是平台的选择,这个病毒文件的动态调式要在XP平台上进行,如果实在win7上边调试的话,会产生异常,但是程序本身又没有异常处理的函数,所以会导致程序运行出错,调试环境换为XP之后问题得到解决 继续分析:
通过IDA进行反编译可以看到,函数Sub_401040使用比较频繁,所以首先对这个函数进行详细的解析:
可以看到,在添加结构体之后,函数Sub_401040的参数变成了DataDirectory[0].VirtualAddress 这个数值对应的是文件导出表的虚拟地址
在这个函数内部还包含了其他函数的引用 分析过程如下:
(这个函数的分析,没有采用添加结构体的方式,因为每次添加结构体之后,对应的成员会产生偏差 影响分析,也可能是我姿势不太对),被引用的函数的作用是判断导出表在文件的那个节区里边,所以分析下来这个函数实现的功能就是一个RVA转RAW (具体的代码实现过程,之前也有写过,可以去查看)
所以函数Sub_401040的返回值就是导出表的RAW(第一个参数的RAW)
得到导出表的RAW之后,又通过该值获得了三个同样重要的地址:
(导出表的结构如下:)
添加结构体之后:
之后就是遍历导出表的操作,遍历之后会复制到目标空间里边:具体分析过程如下:(其实这个过程一步一步跟得话是比较麻烦的,最好的理解办法就是自己写一个遍历导出表的函数,来手动实现一下,这样的话,就更容易理解整个过程,也就不需要一步一步的跟进去进行查看)(之前的博客里边有写过手动遍历导出表的函数,可以移步查阅)
总结:上边的操作实现的主要功能如下:
1:首先实现RVA转RAW
2:遍历导出表
3:遍历导出表的同时,将导出表复制到目标的内存空间
4:添加部分数据
继续下一步分析
将修改后的Lab7-03.dll重命名为Kerne132.dll并且复制到系统目录里边
接下来的操作就是遍历C盘的所有文件,匹配后缀名为exe的应用程序:
如果匹配到exe应用程序的时候,打开这个对应的文件,之后将文件映射到内存中,主要进行的操作就是,检查该应用程序的导入表的各项所对应的DLL的名称,用该名称和Kernel32.dll进行匹配,如果匹配到的话就把kernel32.dll修改为kerne132.dll
同时在进行这一块的分析的时候,可以看到对于一些API的引用:IsBadReadPtr,这个API已经过时,不再使用,具体的作用是:验证调用进程对指定的内存范围具有读取访问权限,如果调用进程具有对指定内存范围内所有字节的读取访问权,则返回值为零。如果调用进程没有对指定内存范围内的所有字节的读取权限,则返回值为非零 总结一下 也就是说这个API的作用是检测某一块内存范围是否有读取权限。
以上的分析我们可以得出这样的结论:当一个征程的程序要运行的时候,都会去调用这个恶意的DLL文件,所以我们有必要去看一下,这个文件到底干了什么(相对于技巧来说这个其实不是很重要)
可以看到,这个DLL文件的主要功能是产生网络连接,执行并且发送相关C2下达的命令以及需要收集的数据
查看字符串,也可以很明显的看出来:
值得注意的是,有一个很明显的标记可以让我们找到这个病毒,就是互斥体,我们可以用这个互斥体的名字来判断当前系统是否遭受感染:
总结一下
1:该病毒文件的运行平台是XP系统,在Win7平台上运行的时候会产生异常(包括调试的时候)
2:该病毒文件的运行需要手动输入参数,参数是 WARNING_THIS_WILL_DESTROY_YOUR_MACHINE
3:分析该病毒的需要注意的几个主要的点:第一个就是RVA地址转RAW地址(这个之前有博客介绍可以移步查阅);第二个点就是遍历文件导出表的过程(这个最好也是自己动手实现一下,这样在分析的过程中就减少很多麻烦);第三个点就是遍历C盘的文件(这个相对比较简单,之前也有相关博客实现,可以移步查阅);第四个就是遍历程序的导入表(这个原理和遍历导出表导出函数大同小异,也可以自己手动实现一下)
4:该病毒在运行之后造成的影响:该病毒在运行之后,会将C盘所有的应用程序文件(exe文件)内部调用的kernel32.dll都替换称为kerne132.dll,之后再实现相应的功能
5:预防措施以及专杀方案:
预防的话 其实就是普通的那些预防建议,开启防火墙、不要随意点击恶意链接之类的
专杀方案:专杀方案主要分为以下几个点来进行考虑:
0:判断当前系统受到感染
1:切断网络连接
2:文件的修复
3:恶意文件的朝朝以及删除
如何判断感染:有以下几点:第一互斥体的检测、第二可以的网络连接
焦点主要集中在文件的修复上边(提供一个思路,没进行实现):我们可疑到相同系统的系统盘下边拷一个原来的kernel32.dll文件,之后把复制过来的文件放到我们的系统盘里边,之后通过遍历系统盘的目录来进行文件的遍历和匹配(匹配应用程序文件:exe文件),匹配到之后再匹配导入表的名字 匹配Kerne132.dll,匹配到之后,将改名字修改为kernel32.dll就好了