笔记
Windows 文件系统:
- 常用函数:
- CreateFile:打开和创建新的文件
- WreteFile和ReadFile:读写文件
- CreateFileMapping和MapViewOfFile:把文件映射到内存中再保存到文件中
- 特殊文件:
- ADS备用数据流可以隐藏数据
Windows 注册表:
用来保存操作系统与程序相关配置信息,也是很好的主机迹象来源
- 结构:根键,子键,键,值项,值;具体内容见网上博客
- 其中Run键用来保存自启动程序的路径
- 常用函数:
- RegOpenKeyEx:打开注册表键
- RegSetValueEx:添加注册表值
- RegGetValue:获取注册表值项的数值
- 使用reg脚本可以很方便的修改注册表
网络 API:
-
伯克利兼容套接字网络函数:ws2_32.dll
-
socket
-
bind
-
listen
-
accept
-
connect
-
recv
-
send
WSAStartup函数必须要在其他网络函数之前调用,在这里设置断点应该很快就能看到网络函数了
-
-
WinINet API:wininet.dll
- InternetOpen:初始化连接
- InternetOpenUrl:用来访问URL
- InternetReadFile和ReadFile:从互联网下载的文件中读取数据
跟踪恶意代码的运行
DLL:
- 恶意代码作者用DLL用法:
- 保存恶意代码,然后加载到其他进程里运行
- 使用windows DLL来执行功能
- 使用第三方DLL,从而避免直接使用WindowsAPI进行实现功能
- DLL基本结构
- 入口时DllMain函数
- 和exe结构差不多(都是PE)
进程:恶意代码通常创建一个新进程或修改一个已存在的进程来执行代码
线程:
- 可以通过创建线程把DLL加载到进程里
- 可以为输入和输出创建两个线程来执行
使用互斥量进程间协作:
- 进程和线程相关的时互斥量mutex,在内核中也称互斥门mutant,互斥量时全局对象,用于协调多个进程和线程,用于控制共享资源访问
服务:通过服务安装,可以更持久的驻留,甚至不会在任务管理器进程里显示出来
- 相关函数:
- OpenSCManager
- CreateService
- StartService
- 服务相关信息保存在注册表里:
HKLM\SYSTEM\CurrentControlSet\Service
- 可以通过sc命令来管理服务的启动start停止stop查询qc等操作
COM:是一种标准接口,可以在任意语言间相互调用
- 每一个使用COM的线程,必须在调用其他COM库函数之前,至少调用一次OleInitialize或CoInitializeEx
- COM对象通过全局唯一标识符GUID、类型标识符CLSID、接口标识符IID来访问
- 恶意代码常用的是Navigate,可以启动IE访问Web地址,来自IWebBrowser2接口
异常:
- 异常发生的时候会查看
fs:0
保存的异常信息(fs:0
会保存异常发生的地址,异常信息在栈上)
作业
Lab 7-1
目标文件:Lab07-01.exe
-
计算机重启后,这个程序如何确保持续运行(持久化)?
这个函数被用于实现一个服务,通常是服务运行必须的流水账式的代码之一,成为服务后,就会实现开机自启
-
为什么这个程序会使用一个互斥量?
防止程序重复执行:
如果获取互斥量成功,说明该程序已经在运行了,所以直接退出程序
-
可以用来检测这个程序的主机特征是什么?
这个程序之后会通过API来创建服务:
服务名为Malservice,可通过注册表来检查
-
可以用来检测这个程序的网络特征是什么?
网络特征根据题5的解答可知,会向指定网址发起访问
-
这个程序的目的是什么?
这个程序完成等待开始执行的时候,会创建进程,会创建20次:
这个进程会执行如下代码:
对指定网址发起访问建立连接,然后jmp跳转到上面进行死循环不停的建立连接,程序的目的是对目标网站发起DDOS攻击,感染多台设备后,在2100年同时进行攻击
-
这个程序什么时候完成执行?
这里设置了Windows的时间结构体SystemTime,初始化为0之后,给年设置为了2100年,后面把这个时间作为参数传入了SetWaitableTimer函数,随后进入WaitForSingleObject函数开始等待,到时候会开始继续执行
Lab 7-2
后面就是返回了,程序流程很简单,获取COM对象地址,然后创建一个给COM接口用的字符串,然后调用偏移0x2C处的函数,来执行功能,执行完就退出了
COM组件通过IID和clsid获取对象,使用注册表查找clsid:
得知COM组件类别是IE,通过搜索引擎搜索IID,得知:
是IWebBrowser2 接口,但这里搞不懂是怎么通过偏移来获得函数地址的,希望知道的师傅能告知一下
-
这个程序如何持久化?
没有持久化啊
-
这个程序目的是什么?
弹窗广告
-
这个程序什么时候执行?
点开的时候立即执行,执行完就终止了,没有任何痕迹留在主机上
Lab 7-3
分析目标:Lab07-03.exe,Lab07-03.dll
注意:这个程序一旦被安装很难清除,可能会引起系统损坏,务必给运行用的虚拟机拍好快照!
分析:exe
自己瞎分析了一通后,看了下答案,突然领悟了书上说的不要陷入细节,首要任务不是了解具体的实现细节,而是要知道目标程序做了哪些事情!
main函数首先判断参数:如果参数数量,和参数的值不对,程序就会立马返回,正确执行需要如下格式:
> lab07-03.exe WARNING_THIS_WILL_DESTROY_YOUR_MACHINE
往下看是一堆CreateFile,CreateFileMappingA等文件操作,其间看到字符串C:\\Windows\\System32\\Kernel32.dll
和lab07-03.dll
,然后是一堆内存操作,这里具体做什么就先不去管它了,先看整体的流程,往后看:
跳过那一段功能后,就到这里了,这里首先有一个复制文件,把Lab07-03.dll复制成kerne132.dll,这是一个文件特征
然后结束之前,还掉调用了一个函数sub_401816,参数是字符串:C:\\*
,应该是要对这个目录做些啥
进去直接就看到了FindFirstFileA函数,这个是用来搜索文件的函数:
再往下走看到这个函数调用了自己在递归,再往下看发现了stricmp函数,对比函数,上面的参数是.exe
,这里可以推测是对比文件后缀:
如果对比成功就进入函数sub_4010A0,对比失败就跳转下去返回,接下来看看对比成功后会发生什么
首先是文件操作,打开文件映射到内存进行修改,然后是字符串比对,如果有kernel32.dll就修改成kerne132.dll:
然后再往下就没啥了,这里初步推断,exe程序会遍历硬盘所有exe文件,把导入表中的kernel32.dll换成kernel132.dll,从而实现程序加载的时候,载入假的dll,dll劫持,恶意代码实际功能应该在dll里
接下来分析dll:
dll没有导出函数(非常可疑),导入函数:
字符串:
这里出现了IP地址,互斥量相关函数,网络相关函数,以及奇怪的字符串,应该是互斥量名称
接下来看看dllmain:
首先是创建的互斥量SADFHUHF,好家伙,另一个主机特征
接下来是网络连接环节,和那个ip建立连接后,发送hello,然后接收信息存在buf中,接下来对比buf中的值来进行操作:
如果buf中的前几个字母是sleep,就sleep60秒
如果是exec,就创建进程,这个CommandLine参数很神奇,没有被赋值过,但这里却有值,因为啊:
CommandLine是一片很大的空间,然后距离buf就5个字节,buf写超了的部分全部落在了CommandLine里了,比如exec cmd.exe
则CommandLine里会有cmd.exe
刚好就是命令
-
这个程序如何完成持久化驻留,来确保计算机重启还能运行?
通过修改每个exe的导入表的kernel32.dll为kerne132.dll,来随着exe启动
-
这个恶意程序两个基于主机的特征是什么?
C:\\windows\\system32\\kerne132.dll
文件,和互斥量SADFHUHF
-
这个程序的目的是什么?
连接远程服务器接收指令进行执行,是个后门
-
一旦被安装,你将如何移除它?
重装系统,或者把恶意exe给改了,把功能反过来,用kernel32.dll去覆盖kerne132.dll