WinDBG实战教学(1)
这里的实例选自《恶意代码分析与实战》第十章实验一
大家可以在这里下载哦
实验工具:
1、WinDBG
2、IDA
3、Dependency Walker
一、初始任务
我们将下载好的文件放到指定位置
C:\Windows\System32
使用WinGDB 连接至虚拟机(CSDN中有很多关于WinDBG的初始教学,大家可以先看看)
出现下面的界面表示连接成功:
二、开始分析
第一步,我们使用Dependency Walker 做静态分析
然后我们可以发现第一个DLL里面导入了这么几个函数
ControlService CreateServiceA OpenSCManagerA OpenServiceA StartServiceA
第二个DLL导入了这么几个函数
内容很多,但是我们要清楚,我们最最应该关注的是Create和Write
第二步,我们打开IDA查看String
在上图红框中的文件地址,告诉了我们,这个程序会去调用这个sys文件
第三步,分析sys文件
按照书上的说法,第一个函数KeTickCount是所有驱动都会包含的一个函数,这个可以忽略
然后第二个RtlCreateRegistryKey和第三个RtlWriteRegistryValue,看到这个Registry我们就大概知道这个操作是和注册表有关的操作,然后一个是Create一个是Write,所以这个是创建和写入注册表的操作
第四步,procmon检查
procmon的教学,我曾经发过一篇博客大家可以看看
我们自己查看Procmon给我们反馈的消息,我们从中找到几个核心的东西:
在程序的上部,我们可以看到:
在运行过了Lab10-01.exe之后,起了一个线程,也就是Thread Create,然后加载了一个DLL,然后创建了一个文件,C:\WINDOWS\system32\Lab10-
01.EXE-04045C98.pf,然后RegOpenKey打开一个键,结果是Read:
这个操作改变了键值,改变了一个加密用的种子值
三、分析代码
我们还是回到IDA中
这里首先调用了一个OpenSCManagerA,这里是:在指定的计算机上建立与服务控制管理器的连接,并打开指定的服务控制管理器数据库。
如果失败,返回的NULL,然后这里用test测试了返回值,test指令是和and类似的,如果返回的是NULL,test之后,结果为0,则ZF=1,JNZ不会跳转,继续执行,走红线,然后就返回了
如果没有失败,我们继续往下走
往下走就是这里,之类调用了CreateServiceA这个函数,可以看出这个服务的名字就是Lab10-01,然后访问权限dwDesiredAccess是SERVICE_ALL_ACCESS,最后需要注意的就是lpBinaryPathName,这个的值是"C:\Windows\System32\Lab10-01.sys",意味着服务起来的时候会去加载这个二进制文件,一样的,这个函数调用失败会返回NULL
在这里,如果函数失败,返回NULL,test之后,ZF=1,然后JNZ不会跳转,所以函数失败之后,会继续走红线,也就这写代码。
这里调用了OpenServiceA,如果上面这个OpenServiceA失败,然后会继续通过StartServiceA来开启这个服务
这些操作,只要一个成功了,就会直接一个JZ跳转然后返回了,如果失败,则继续往下尝试另外的函数