恶意代码分析实战 Lab10
lab10-01
1简单的静态分析少不了,注意到恶意程序把自身伪装成GUI程序,可以用resource hacker看看资源,然后用depends看看函数导入两个库kernel32.dll和ADVAPI32.dll这是服务相关库,发现还有一个start的导出函数,然后还有一个需要关注字符串
再看看.sys文件,这是很明显会操作注册表的相关操作,不管从函数还是字符串都能看出这一点,而且函数防火墙相关的注册表操作
我们依照题意先用promon看看lab10-01.exe都做了什么操作,发现只有一个对注册表的写操作,还只是写了一个随机种子
2先分析.exe发现程序很简单把,sys注册为名为Lab10-01服务(并且他的类型为3),然后启动这个服务,最后调用ControlService,停止服务,注意第二个参数为1,是通知服务应该停止
现在要内核调试才能看到我们想要了解的信息了,配置的话一般照着课本是不会有问题的,有问题的话(一个是管理员身份运行windbg,然后注意vm中右下角那个串行接口显示的和boot.ini是一致的)
成功后查看Lab10-01的对象信息
然后在他的driverunload处下断点,然后运行,回到虚拟机中继续运行.exe程序发现马上命中断点,虚拟机停止运行
单步运行发现四次调用 RtlCreateRegistryKey,两次调用RtlWriteRegistryValue
每次都可以看一下他们的参数是什么就知道具体创建了什么注册表项和对什么项写了什么什么值,这里我只列出最后一个RtlWriteRegistryValue调用的分析
r查看个寄存器的值,参数基本都在这里面,其中eax是要写入的值,edi是要被写的项名字,ebx是绝对路径,下面一个个查看这三个寄存器里面是什么
edi是Enablefirewall
eax是0
ebx是\Registry\Machine\SOFTWARE\Policies\Microsoft\WindowsFirewall\StandardProfile
好了现在知道了这个函数做什么了,就是把下面那个EnableFirewall设置为0,其实就是关闭防火墙,顺便说一句,另一个write就是把下图里面DomainProfile里面的EnableFirewall也设置为0
好了,分析结束,实际上找到函数的位置,我们可以在idapro里面分析源代码,我们知道.sys的真正代码在他的偏移0x486位置(driverentry并没有做什么操作),然而我们的.exe文件本意是要让服务停止的,但实际上.sys做了一些注册表操作,这是因为Lab10-01驱动对象的0x34被重写为一个自己定义的偏移为0x486的函数,而这个0x34本来应该是真正的驱动卸载函数.所以现在一切都清楚了.
lab10-02
1查看字符串,关注一下几个有意思的字符串,可以猜测可能创建一个驱动服务,486 WS Driver,他的路径在c:\Windows\System32\Mlwx486.sys,这个Mlwx486.sys文件哪来的?可能是.exe程序创建的看看导入函数
导入库主要两个一个kernel32.dll一个注册表相关的advapi32.dll,kernel32.dll也导入了createfile和writefile函数,所以我们的猜测很可能成立
还发现作为CUI程序存在资源,那就值得一看,果然有猫腻,资源里面藏着程序,将他保存为Mlwx486.sys文件,而且注意到资源名为file
好了现在来分析一下.exe文件,可以发现程序很简单:
先是FindResourceA找到名为file的资源传回资源块句柄,
然后LoadResource加载这个资源,返回被装载的资源句柄,
然后CreateFileA创建C:\\Windows\\System32\\Mlwx486.sys这个文件
然后SizeofResource查看资源大小
然后WriteFile把资源写到创建的那个文件里面
然后关闭文件句柄
然后OpenSCManagerA打开服务管理器,失败输出相应信息然后结束,否则继续
然后CreateServiceA创建486 WS Driver驱动服务,两个参数需要注意,一个dwstarttype是3说明服务管理器启动,dwservicetype是1说明是驱动服务程序,同样是失败打印信息结束,成功继续
然后StartServiceA打开服务,同样是失败打印信息结束,成功继续
然后CloseServiceHandle关闭服务句柄
好了,现在.exe分析完毕,进入内核分析.sys看他做什么,其实我们已经有了他的文件,可以用IDApro直接分析看看,主要关注sub_10706函数,认真看书的同学会发现这段代码很熟悉,没错对照课本(p206)你会发现,这段代码是在挂钩NtQueryDirectoryFile函数
先是生成KeServiceDescriptorTable NtQueryDirectoryFile的Unicode字符串
然后MmGetSystemRoutineAddress,分别得到他们的地址
然后在系统服务描述符表里面寻找NtQueryDirectoryFile,找到了用函数sub_10486的地址覆盖
所以现在看看sub_10486做了什么程序就分析完成了因为我的xp一跑就蓝屏 错误码0x000000BE(换了个深度技术纯净xp就可以跑了,我原先是吾爱**专用xp不能跑,应该是ssdt被设置只读?不清楚)
没办法只能IDApro里面分析
没有动态分析,看着确实难受,不过可以用F5反编译帮助理解,说白了这段代码就是隐藏文件用的:
先是调用原NtQueryDirectoryFile函数,然后是三个判断FileInformationClass == 3 && 返回值>= 0 && 0==ReturnSingleEntry,满足这三个条件才继续.
然后RtlCompareMemory,比较每个文件的文件名的头四个字符是不是Mlwx,是的话才继续操作,否则继续比较
如果找到Mlwx时候,才做一些修改,说白了就是把指向Mlwx的FILE_BOTH_DIR_INFORMATION结构的上个FILE_BOTH_DIR_INFORMATION指向原本Mlwx的FILE_BOTH_DIR_INFORMATION指向的下一个FILE_BOTH_DIR_INFORMATION结构来达到隐藏Mlwx文件的目的.有点绕,说白了就是,比如x->y,y->z现在被改成x->z来隐藏y
补充windbg分析,依照课本查看ssdt,发现蹊跷
然后设置断点,记得关闭资源管理器,要不然一直断在没有的地方,然后dir,断点命中
查看compare的两个参数,很明显在比较文件名头四个字符是不是Mlwx
是的话才对文件进行隐藏
lab10-03
1看看字符串和函数
有服务和com组件相关库
IDApro分析.exe
都是熟悉的函数调用之前的代码分析都见过
先是打开服务管理器
创建Process Helper服务,并启动他
关闭服务句柄,得到\\.\ProcHelper这个设备句柄
然后发送请求到内核驱动
最后是弹出一个广告(这一段代码,在lab07-02里面分析过不再赘述)
现在分析驱动程序
他先创建名为\Device\ProcHelper的设备
然后创建一个\DosDevices\ProcHelper的符号链接供用户访问
看sub_10706,这里修改了主函数表偏移0(38h),2(40h-38h=8,8/4=2),e(70h-38h=38h,56/4=14=eh),处的地址,这三处按照课本上说法是create close 和deviceIocontrol,他们分别被sub_10606和sub10666替代,其中10606就IofcompleteRequest就返回,
值得注意的是sub'_10666出的函数,这里修改了程序peb,这一段赋值不好理解,我竟然说的明白点
这里为了好理解我设个结构体
LIST{
LIST *BLINK(指向前一项相当于88h处)
LIST *FLINK(指向后一项相当于8ch处)
}*LINK自身相当于初始eax
现在ecx=*FLINk,edx=*Blink,现在对[ecx]赋值,这里[ecx]指的是FLINK指向的那个LIST结构体的第一项也就是下一个结构体的*BLINk现在他被赋值为edx也就是当前结构体指向的前一个结构体,然后后面三个赋值跟这个差不多,只不过是,前一个结构体第二个项被赋值为当前结构体指向的下一个结构体,熟悉结构体和指针概念的同学可能会比较好理解
这里说白了就是隐藏当前进程.
分析结束这就是个会隐藏自身进程的广告弹窗程序.
补充windbg分析:
我们按照书上命令来,第一个要注意这里一个是driver_object 81f346e8驱动对象,一个是device_object82297c70设备对象
我们要看的是驱动对象81f346e8,注意下面的driverunload被替换为驱动程序偏移0x62a地方的函数
现在看一下他的主函数表被做了那些修改分别是0,2,e偏移的地方被做了修改,并且被替换成偏移0x606,0x606,0x666处的函数(知道偏移我们就可以在IDApro里面分析这些函数看他们做了什么)