lab11-01
1静态分析一波,发现有资源节存在,自然要照例用resourcehacker看看,有没有问题,果然存在一个PE文件在资源节,而且看导入函数中存在资源相关函数也能证实
字符串有几个需要注意,特别是下面这个注册表项,很可能恶意代码,是要挂钩winlogon事件
现在看看代码,首先是得到当前模块句柄,也就是Lab11-01的句柄,然后做一些初始化操作把这个句柄传给函数sub_401080,现在看看这个函数做什找到指定资源,这里参数lptype就是BINARY,lpname就是TGAD,对照resourcehacker可以确定
函数的返回值,资源的句柄被传给loadresource,用来加载资源到全局存储器,返回资源数据句柄
lockresource锁定资源并得到第一个字节指针
SizeofResource得到资源数据大小
VirtualAlloc申请内存空间
然后将资源数据复制到这个内存空间,接着打开文件msgina32.dll(sub_401080函数结束后,当前文件夹会多出msgina32.dll文件)
将内存空间数据再写到这个文件,然后关闭文件,打印DR信息,释放资源,函数sub_401080分析结束,函数返回的是申请内存块句柄
现在回到主函数
首先得到当前程序的完整路径名,然后用strrchr得到程序名Lab11-01.exe
接着是一系列内存操作,静态分析是不合算的,对于我这种脑子转的慢的人来说还是很累的,所以动态分析一波,会发现,他就做了一件事,就是得到msgina32.dll的绝对路径.
接着就是把msgina32.dll的绝对路径传给sub_00401000函数,main函数就结束了
现在看看来sub_401000函数
先是调用regcreatekeyex,创建或打开SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon注册键
regsetvalueex,写一个GinaDLL的键.键值为msgina.dll的绝对路径
然后输出RI,关闭句柄程序结束
.exe文件分析结束,现在来看看.dll文件
结合课本p217还有.dll的一堆导出函数都是wlx开头可以推测这是一个GINA拦截器
先判断是不是DLL_PROCESS_ATTACH原因调用DLLmain,是才继续
DisableThreadLibraryCalls函数禁用了DLL_THREAD_ATTACH DLL_THREAD_DETACH
GetSystemDirectoryW得到系统目录
找到系统目录下面的MSGina.dll然后加载他
dllmian分析完毕,看看一堆的导出函数,大部分都一样,都是传递函数名参数和真实msgina.dll句柄得到,真正要调用函数地址,然后用jmp xxx,的形式调用这个函数.只有,wlxloggedoutsas不一样,他又如下函数调用
从格式字符串可以推测,eax里面存在的是username password等用户登陆信息,用来填充这个格式字符串,看看函数sub_10001570
一堆文件操作不难理解,是把用户信息写到了msutil32.sys文件
恶意代码分析结束我们运行一下恶意代码,然后重启电脑,看看结果
lab11-01分析结束
lab11-02
1看一下导入导出函数,导出就一个installer,导入函数是一些文件和注册表相关函数
看一下字符串
看一下dllmain函数,前面几个函数调用都很好理解,就是,得到当前模块的绝对路径,然后打开C:\WINDOWS\system32\Lab11-02.ini,然后读文件,将读到的数据传给sub_100010b3,后面唯一值得关注的就是sub_100014b6函数.
我们先看一下导出函数installer做了什么
打开注册表项SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows,并且把键AppInit_DLLs的键值设为spoolvxx32.dll,然后把自身的代码(lab11-02.dll)复制到C:\WINDOWS\system32\spoolvxx32.dll.我们知道AppInit_DLLs会被所以加载user.dll的程序加载
函数sub_100010b3是对.ini数据的一系列操作,具体做了什么,这种细节分析最好用动态分析直接看结果不要耗时间,知道这是一个邮箱地址
重点和难点在于函数sub_100014b6:
函数先得到指定句柄的绝对路径(sub_10001075)
得到指定句柄的程序名(sub_10001104)
确定程序名是不是(THEBAT.EXE OUTLOOK.EXE MSIMN.EXE)中的一个,不是结束,是的话看loc_10001561
关键在于loc_10001561的三个函数都很复杂,我们不能急,一个一个来
观察发现sub_100013BD和sub_10001499函数及其相似,他们都会查找当前进程的所以线程,只是对线程的处理方式不一样,一个是挂起除了当前线程外的其他线程,一个是唤醒其他线程.
好了,现在只剩下最难的sub_100012A4,牢记这四个参数,都很重要
进入程序,头三个函数调用很明确,加载wsock32.dll,然后得到send函数地址
接着调用sub_10001203(三个参数,其中第一个是send函数地址)
程序的头尾都调用virtualprotect,一个是修改send代码区域可读写,一个是恢复原来的保护
这段代码把原来send函数的头五个字节保存在申请的内存空间
这段代码是对原来send函数代码的修改(我对一些参数和局部变量重命名,为了更好理解)
首先要注意三个地址,一个是lp_send_address这是send原函数的地址,一个是p_p_sub_1000113d地址他是函数1000113d的地址(这个函数会在send之前被调用,也就是说send函数被这个函数挂钩了),还有一个malloc_space这是临时申请的内存空间地址(他会被用来存放原来send函数的头五个字节和一个跳转命令)
一个一个来,看第一个E9h的赋值语句,E9就是jmp,E9被赋值给malloc_space的0a偏移处,第二个eax被赋值到偏移0b处(这两个语句中edx和ecx都是malloc_space)很明显这是跟在jmp后面的一个相对地址,他的值是send的原函数地址相对于malloc_space 0a偏移处的地址大小(这条jmp语句的执行效果就是跳转到被修改后的send函数的第一个一句jmp(jmp是5字节)后的代码,想一下eip的计算就知道为啥,eip=原eip+该汇编代码字节数(jmp是5字节)+jmp后面跟的相对地址).
上面是对malloc_space的一系列操作,下面是对原send函数的操作,同样是修改第一个字节为E9,然后第二个字节开始是ecx这里的ecx是挂钩函数sub_1000113d的地址(很明显是把send的头五个字节改成jmp sub_1000113d)
看最后的操作,把malloc_space偏移为5(为啥偏移为5看上面memcpy)的地址赋值给sub_10003484,这样call sub_10003484,就会执行原send函数头五字节汇编代码,然后跳回sned继续执行剩下的send代码.
挂钩分析完毕,现在只剩下,挂钩函数sub_1000113d了,关键在于两个memcpy
复制RCPT TO: <到dst
头两个push是memcpy的参数,strlen的参数是第三个push,把src复制到dst这里的src是之前翻译出来的邮箱地址
最后把send的四个参数传给10003484,det就是消息,eax是长度,s是套接口描述字
说了这么多,其实就是在我们发邮件的时候,添加一个收件人,这个收件人就是上面提到的的邮箱地址
分析结束(几个虚拟机都没有outlook这几个软件就没有抓包,演示了)
Lab11-03
1看下字符串,推测可能把lab11-03.dll复制到inet_epar32.dll,然后还打开了cisvc.exe索引程序,可能通过cmd.exe操作的,还有两个函数也很可疑可能和击键记录相关,再看右边.dll的可疑字符也不少
分析.exe程序,程序先复制lab11-03.dll到inet_epar32.dll,然后得到cisvc.exe的绝对路径,然后调用sub_401070函数,接着就是调用_system来启动cisvc程序,所以我们猜测关键在于sub_401070函数对原cisvc文件做了什么事,进入sub_401070,可以看到开头几个函数调用事打开cisvc,然后映射到内存,以便后面的修改操作.一直到下面的函数调用sub_401000
看sub_401000参数一个是节区数目3,一个是第一个节区名.text,函数其实是在查找.text节区头的头8字节是否具有内存访问权限,以便后面修改,并且返回.text节区头的地址
接着的是一系列的内存操作很难一步步理解,最好是直接跳过不要陷入细节,看关键的赋值
直接动态看结果,是在如下图地方的末尾添加了一串的东西
接着看,这句话是在修改程序的入口地址为1A28
用PEview打开被修改后的cisvc也可以证实,程序入口点正是被修改到,上面添加的那一段代码处
现在只需要看一下这段代码是什么,就知道.exe文件到底干了什么坏事,用ollydbg跟随cisvc程序,到下图地方可以发现程序动态加载了inet_epar32.dll也就是lab11-03.dll文件,这就是lab11-03.dll的长期驻留方式
再往下看发现程序在得到lab11-03.dll的导出函数zzz69806582函数的地址,接着就调用了这个函数,接着就回到正常的程序入口地址执行程序
现在我们开始分析lab11-03.dll,关键看一下导出函数和dllmain
可以看到dllmain没做什么内容,再看导出函数创建了一个线程就结束了,看来这个线程函数很关键,查看startaddress
可以看到创建了互斥量MZ,然后打开互斥量来确定只有一个恶意线程在运行,然后创建C:\\WINDOWS\\System32\\kernel64x.dll文件,接着SetFilePointer明显是要对上面的文件进行读写操作了,接着是函数调用
跟进就看到一个函数调用,跟进发现这个程序很大,大致浏览一下,看个几个关键字符串和关键函数有很多的getasynckeystate调用还有getforegroundwindow函数可以推测很可能是击键记录.并且传递的参数是之前传递的参数四个buffer可能用来装,击键的记录数据
再看后面两个函数调用,一个_sprintf是对buffer的写,一个是把,buffer写到文件kernel64x.dll,注意write参数有个ecx+80ch正好指向了var_4,而var_4之前被赋值为文件kernel64x.dll指针,所以是把buffer写到kernel64x.dll
现在我们运行一下程序,然后测试一下,可以看到已经记录了很多的信息,但是记录的数据还是16进制的不太好理解记得0x54我打的应该是t键
程序分析结束.