8.1 Lab 11-01
代码分析
首先使用strings进行分析。
Gina是在 msgina.dll中的。
很多有关资源的函数。
关于注册表的函数。
使用ResourceHacker查看。
发现是一个PE文件。
保存为dll文件。
动态分析
启动Promon。
进入注册表查看。
- 这个恶意代码向磁盘释放了什么?
向磁盘释放了一个msgina32.dll。使用WinMD5发现这个dll和我们在资源中提取出来的文件是同一个文件。
- 这个代码如何进行驻留?
代码将自己添加到注册表中,使得系统被重启后,msgina32.dll会被重新加载。
- 这个恶意代码如何窃取用户登陆凭证?
非常多的以Wlx开头的函数名字,可以判断是gina。 查看字符串发现了msutil32.sys文件。
还有格式化的字符串,可能是用来记录用户登录凭证的。
使用IDA进行分析。
Dllmain首先检查参数fdReason,这个传入参数表示着DLL入口函数被调用的原因。恶意代码检查传入参数是否为DLL_PROCESS_ATTACH,在进程启动或者使用loadLibrary函数加载DLL时,带有这一参数的入口函数将会被调用。如果这个特殊的DllMain在DLL_PROCESS_ATTACH期间被调用,那么将会调用loadLibrary函数,获取Windows系统目录中msgina.dll的句柄。(这个真的实现GINA的Windows的DLL,然而msgina32.dll是拦截GINA的恶意DLL程序。设计成msgina32.dll是为了欺骗分析人员。)
程序会调用GetSystemDirectoryW这个函数,用于获取系统目录。然后调用lstrcatW把上面获取的目录与"\MSGina"组合在一起,再使用LoadLibraryW函数获取msgina.dll的句柄。这里将LoadLibraryW的返回值保存到了eax,然后又将eax的值保存到了hModule里面。这样就可以让这个恶意的DLL程序的导入函数使用真实的msgina.dll中的函数,从而使系统操作得以正常执行。
- 这个恶意代码对窃取的证书做了什么处理?
分析一下导出函数,找到WlxLoggedOnSAS。
可以看到,这里现将字符串“WlxLoggedOnSAS”作为参数压栈,然后调用了sub_10001000这个函数。双击进去分析一下:
可以看到,这里使用到了我们刚刚所获取的msgina.dll的句柄hModule以及WlxLoggedOnSAS(lpProcName)这个字符串。下面调用了GetProcAddress,目的就是获取WlxLoggedOnSAS的地址。继续分析其它的导出函数,基本上和WlxLoggedOnSAS这个函数差不多。但是发现这个函数WlxLoggedOutSAS有点不一样,这个函数是在系统注销的时候被调用的,进去分析一下。
这里进行了一系列的push操作,还有一个格式化字符串"UN %s DM %s PW %s OLD %s",可以看到这些参数都是函数sub_10001570的函数,双击进去查看一下:
这里是将时间,日期和登录凭证写入到msutil32.sys这个文件里。
- 如何在你的测试环境让这个恶意代码获得用户登录凭证?
重启电脑,然后找到msutil32.sys这个文件并打开。
8.2 Lab 11-02
静态分析
使用strings进行分析。
存在注册表的位置和AppInit_DLLs,表明程序可能通过注册表来达到永久驻留自身的功能,此外还出现了Lab11-02.ini则表明程序可能使用了这个文件。而send和wsock32.dll,表明程序可能有联网的操作。
还有OUTLOOK.EXE这种字符串,可能是对邮件进行了操作。
Lab11-02.ini文件的字符串看起来应该是进行了加密。
使用IDA进行分析
使用交叉引用。
installer注册了一个键值,将文件复制到其他目录。
首先检查DLL_PROCESS_ATTACH。
接下来,DLLMAIN试图打开Lab11-02.ini。
①处程序试图提取Windows系统目录,以及②处的字符串Lab11-02.ini。③处程序使用strncat将它们组成一个路径。恶意代码在④处打开一个用来读取的INI文件,如果不能,则退出。
恶意代码如果成功打开了INI文件,就会生成一个缓冲区,最后将内容传入到一个解密函数中去。
使用OllyDbg来查看解密的内容。
是一个邮箱,有可能是我们的邮件会给这个邮箱发一份。
下面还有一个函数,我们命名为hook_installer。
分析挂钩函数
hook_installer函数安装挂钩之前,会检查恶意代码正在哪个进程中进行。它调用了三个函数来获取当前的进程名。
接下来恶意代码检查当前进程大写字母的进程名是否与这四个相同,不同的话就会退出。
接下来,分析安装inline挂钩的函数。
在①中我们看到它首先调用GetCurrentProcessId函数,然后是sub_100012FE函数,我们将这个函数命名为suspend_threads。suspend_threads函数调用了GetCurrentThreadId,它返回当前运行线程的线程标识符(TID)。接下来,suspend_threads调用CreateToolhelp32Snapshot,并且使用结果循环遍历当前的所有TID,如果TID不是当前的线程,则用TID调用SuspendThread。我们可以得出结论,在①处的函数调用挂起了进程的所有运行线程。
③处函数调用做的工作则是恢复所有线程,使用ResumeThread函数,两个函数的意图是,先挂起,然后恢复执行。恶意代码执行一些影响改变当前进程运行行为的动作比较常见,例如修改内核或者是安装一个inline挂钩。
接下来,检查②处调用的代码。将该函数的参数修改成合适的名字。
内联钩子原理图:
此函数存在三个参数,进入此函数进行分析:
可以发现此过程是在修改地址,首先将0E9赋值到edx中,接着用参数覆盖ecx寄存器中的值,这一过程就是实现jmp执行,因为jmp指令的机器码就是E9。
此过程执行完毕以后就会跳转到sub_1000113D函数执行位置:
因为此函数的地址是作为参数传递进去的。现在将此函数重命名为:hook_function现在我们返回到钩子函数执行过程函数:
VirtualProtect函数可以修改进程的运行,保护其读和写的权限,下面又调用了此函数的目的是恢复原始进程权限。在上图中我们发现其使用malloc函数分配的新的空间并将其保存在var_8这个参数里面,目的是为了以后在构造E9(jmp指令)时所需的空间。
- 这个恶意DLL导出了什么?
使用depends查看导出函数。
可以看到,导出函数的名字叫做,installer。
- 使用rundll32.exe安装这个恶意代码后,发生了什么?
使用promon来监控rundll32.exe。
写入了注册表,查看一下。而且创建了一个新文件。
可以看到这个文件其实是Lab11-02.dll复制的自身。
文件还试图打开system32下的lab11-02.ini文件,因此为了程序顺利运行,我们将该文件放入对应的目录下。
- 为了使这个恶意代码正确安装,Lab11-02.ini必须放置在何处?
应该放置到该目录下。
- 这个安装的恶意代码如何驻留?
恶意代码将自身安装到AppInit_DLLs的注册表键值中,这可以使恶意代码加载到所有装载User32.dll的文件中。
- 这个恶意代码采用的用户态Rootkit技术是什么?
这个恶意代码针对send函数安装了一个inline函数(hook)。
- 挂钩代码做了什么?
这个挂钩检查向外发出的包,看外传的包是否包含RCPT T0:的电子邮件信息,如果发现了这个字符串,则它会添加一个额外的RCT T0行,来增加一个恶意的电子邮件账户。
- 哪个或者哪些进程执行这个恶意攻击,为什么?
我们可以看到其会针对以上三个进程进行攻击。,这三个进程都是有关于邮件的进程。
- ini文件的意义是什么?
这个.ini文件里面包含一个经过加密的邮件地址,解密之后发现就是一个邮箱 billy@malwareanalysisbook.com。
- 你怎么用wireshark动态抓获这个恶意代码的行为?
使用WireShark,过滤tcp。
随便写点什么。
点击这里。
可以看到它额外添加了一个发送邮箱。
8.3 Lab 11-03
- 使用基础的静态分析过程,你可以发现上面有趣的线索?
首先使用strings进行分析。
启动了一个服务,这个服务是系统的索引服务。可能创建了一个文件inet_epar32.dll,还有一个奇怪的程序。
上网查一下cisvc.exe是什么:
查看一下Lab11-03.dll:
这里的GetForegroundWindow;GetiindowTextA;GetAsyncKeyState三个导入函数。初步推断是要做键盘记录。
查看一下导出函数:
在IDA中查看一下:
这个导出函数暂时也不知道是干什么的。这里好像创建了个kernel64 x.dll的文件,其他还有创建文件,创建互斥体,创建线程什么的,我们就先不管。
Lab11-03.exe包含字符串inet_epar32.dll和 net start cisvc,这意味着它可能启动CiSvc索引服务。包含字符串C:\WINDOWS\System32\kernel64x.dll的Lab11-03.dl导入了API函数GetAsyncKeyState和 GetForegroundwindow,这让我们怀疑它是一个记录到文件kernel64x.dll的击键记录器。
- 当运行这个恶意代码时,发生了什么?
用procmon来监测一下,过滤一下:
可以看到,这里会创建inet_epar32.dll,还有Lab11-03.dll的一堆操作。我们打开创建的inet_epar32.dll看看)。进行MD5比对能够发现,inet_epar32.dll和Lab11-03.dll是相同的文件,所以我们可以知道恶意代码复制了lab11-03.dll到windows系统目录。
恶意代码首先复制Lab11-03.dll到Windows系统目录的inet_ epar32.dll中, 并有针对cisvc.exe的操作。
- Lab11-03.exe如何安装Lab11-03.dll使其长期驻留
用IDA调试一下Lab11-03.exe。
在main函数中一开始是复制lab11-03.dll到system32系统目录中的inet_epar32.dll。之后创建一个字符c:\windows\system32\cisvc.exe,将其作为参数传递给了sub_401070.之后是使用系统运行命令net start cisvc,来启动索引服务。
接下来我们看看他的子函数:
从上图可知调用了createfile(创建文件),createfilemappingA(创建一个文件映射内核对象)和MapViewOfFile(将一个文件映射对象映射到当前应用程序的地址空间),将cisvc.exe映射到内存中。这些函数都有访问这个文件的权限。
MapViewOfFile返回的内存映射视图的基地址(lpBaseAddrress)可以被读写:
我们接着往下看:
可以看到调用了UnmapViewOfFile(停止当前程序的一个内存映射),这样对这个文件做的任何修改都会被写入到硬盘。
同时我们顺着绿色那条线看下来(上三图的下面那张),查看在调用该函数sub_401070之前的操作。
能够发现其实是进行了写入操作。一开始文件的映射位置移入到EDI,用Var_28调整一些偏移量。rep movsd循环,用ecx(4E)计数来写入该数量的DWORD。之后byte_409030被移入ESI,复制byte_409030的数据到映射文件中。
按c。
进缓冲区看一眼,
是一个文件的目录。
发现这里出现了被感染的dll和这个exe的导出函数。所以我们可以猜测,shellcode加载了这个dll,并调用了它的导出函数。
接下来IDA分析一下感染后的文件。
这里call了sub_1001AD5,我们跟过去看看
这里call的这些个函数不知道是个啥,所以我们上OD里面调试一下在01001B0A用这个函数的位置下断点,运行提示出用的是loadlibrary函数,在数据窗口看一下这个位置。
可以知道其作用是将inet_epar32.dll载入内存,同理接着看下一个函数,00101B1B处下断点,看到此时是调用GetProcAddress,其作用是获取导出函数的地址(在右下角可以看到导出函数)返回值在eax,接下来将eax赋给ebp-8,之后是call ebp-8,那么也就是说下一个call就是在调用这个导出函数。
所以,恶意代码通过入口点重定向从而使它永久性地安装Lab11-03.dll。它通过重定向入口点,来运行加载这个DLL的shellcode。
- 这个恶意代码感染Windows系统的哪个文件?
为加载inet epar32.dll,恶意代码感染了cisvc.exe,然后调用了inet_epar32.dll的导出函数zzz69806582。
- Lab11-03.dll做了什么?
查看看他的导出函数。
这里有个创建线程,其中有个startaddress参数,跟进去:
这里创建了个“MZ”互斥量(因为前面OpenMutexA那个地方没有互斥量,所以跟着绿线运行下来)
创建了文件"C:\WINDOWS \System32\kernel64x.dll"
SetFilePointer:在一个文件中设置新的读取位置,dwMoveMethod值为2(开始点为文件的结尾位置)然后call了个sub_10001380,看看是什么
call了个sub_10001030,跟进:
这里看到了一开始静态分析的时候看到的GetForegroundWindow,GetiindowTextA,用来判断当前哪个程序正在输入和获取当前的标题。
用到了GetAsyncKeyState判断一个按键是被按下还是弹起。
所以Lab11-03.dll 是一个轮询的记录器,这在它的导出函数zzz69806582中得到实现
- 这个恶意代码将收集的数据存放在何处?
恶意代码存储击键记录和窗体输入记录,其中击键记录被存入到C:\Windows\System32\kernel64x.dll。