Desktopla 一、病毒危害 蠕虫病毒入侵并完全控制一台计算机之后,就会把这台机器作为宿主,进而扫描并感染其他计算机。当这些新的被蠕虫入侵的计算机被控制之后,蠕虫会以这些计算机为宿主继续扫描并感染其他计算机,这种行为会一直延续下去。蠕虫使用这种递归的方法进行传播,按照指数增长的规律分布自己,进而及时控制越来越多的计算机。严重的占用有限的网络资源,最终引起整个网络的瘫痪,使用户不能通过网络进行正常的工作。 二、病毒分析 在对样本进行分析之前,先用 PEiD对样本进行查壳:
通过PEiD可以发现,该样本加了UPX壳,手动脱掉之后的文件为upDesktopla Phase1: 1-1:获取 IE 路径并验证 IE 可执行文件是否存在 (3种方法): 如果三种方法均不能找到 IE 路径并验证对应路径下IE可执行文件的存在,则样本行为就此终止。 (1-1-1)通过注册表 "HKEY_CLASSES_ROOT\http\shell\open\command" 获取 IE 路径并验证 IE 可执行文件是否存在 (1-1-2)通过绝对路径 "C:\Program Files\Internet Explorer\IEXPLORE.EXE" 获取 IE 路径并验证 IE 可执行文件是否存在 (1-1-3)通过注册表 "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\ CurrentVersion\App Paths\IEXPLORE.EXE" 获取 IE 路径并验证 IE 可执行文件是否存在 1-2:依次尝试在 1:"C:\Program Files\"; 2:"C:\Program Files\Common Files\ "; 3:"C:\Documents and Settings\Administrator\ "; 4:"C:\Documents and Settings\Administrator\Application Data\ "; 5:"C:\WINDOWS\system32\ "; 6:"C:\WINDOWS\ "; 7:"C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\"; 下创建" Microsoft"目录并写入临时文件,用于测试能否在该目录下成功创建文件,为后续在该目录下创建文件 "Desktopla 这里演示仅以第一个路径作为示例: (1-2-1)创建文件夹 "C:\Program Files\Microsoft" 新创建的文件夹" Microsoft ": (1-2-2)通过在该文件夹下创建一个临时文件以检验能否在该文件下创建新文件 (1-2-3)删除刚刚创建的临时文件 1-3:释放一个新样本到之前创建的目录下,名命为 “Desktopla (1-3-1)获取当前应用程序路径名称 (1-3-2)释放新样本到新创建的文件夹下,新文件名称为 “Desktopla
释放的新样本文件: (1-3-3)启动 "C:\Program Files\Microsoft\Desktopla Phase2: 2-1 验证特定文件夹(Phase1创建的文件夹)下是否存在样本文件:
2-2 获取 ntdll.dll 的一些导出函数地址保存到全局变量中,便于后续代码的调用:
2-3:Hook ZwWriteVirtualMemory (2-3-1) 获取 ntdll.dll 的模块基地址
(2-3-2) 获取 ZwWriteVirtualMemory 的函数地址
(2-3-3) 更改 ZwWriteVirtualMemory 函数头前 0X10 字节的内存属性为 PAGE_EXECUTE_READWRITE
(2-3-4) 计算 ZwWriteVirtualMemory 函数头能够被修改的字节数
(2-3-5) 申请 0XF 大小的内存空间,存放 Hook ZwWriteVirtualMemory 过程中的一些数据
(2-3-6) 具体的 Hook 过程中
(2-3-7) 修改之前申请的 0XF 大小的内存空间属性为只读
(2-3-8) 还原 ntdll.ZwWriteVirtualMemory 的内存属性
(2-3-9) Hook ntdll.ZwWriteVirtualMemory 前后机器码以及函数执行流程对比 (2-3-9-1) 机器码对比 被 Hook 之前的 ZwWriteVirtualMemory
被 Hook 之后的 ZwWriteVirtualMemory
(2-3-9-2) 函数执行流程对比 调用原来的流程
新添加的流程
2-4:调用 CreateProcessA 来启动 iexplorer.exe 进程, 内部完成对 iexplorer.exe 的注入
通过对 VirtualAllocEx 和 WriteProcessMemory 的断点可以详细的看到为 iexplorer.exe 申请空间并写入数据的过程5次为 IE 进程申请空间 为 IE 进程第1次申请内存空间(Addr = 20010000, Size = 0000D000)
为 IE 进程第2(Addr = 00020000, Size = 00000233)、 3(Addr = 00030000, Size = 000000DF)、 4(Addr = 00040000, Size = 000000A5 )、 5(Addr = 00050000, Size = 00000138 )、 次申请内存空间
6次 向IE 进程写入数据 向 IE 进程第1次写入数据(Addr = 20010000, Size = 0000D000)
向 IE 进程第2(Addr = 00020000, Size = 00000233)、 3(Addr = 00030000, Size = 000000DF)、 4(Addr = 00040000, Size = 000000A5)、 5(Addr = 00050000, Size = 00000138) 次写入数据
向 IE 进程第6次写入数据(Addr = 00401A25, Size = 0000000C) 00401A25 为 IE 的 OEP,这里实际上是更改 IE 的OEP 在该 API调用执行之前,修改 DesktopL.0040DFA7内存处的首字节为 0XCC(同时记下原来的字节数据:0XBF,用于恢复), 即可用 OD 段下新启动的IE进程
Phase3: 3-1 注入前后 iexplorer.exe 机器码和流程对比: 正常的 IE 入口点代码
被修改过后的 IE 入口点代码(修改了前 0X0C 字节)
由此可见,原程序的的路程跳转到了 40000 处 3-2 注入后的 iexplorer.exe 创建工作线程之前的行为分析: (3-2-1) 处理内存 PE 的导入表
(3-2-2) 处理内存 PE 的节信息
(3-2-3) 利用 "KyUffThOkYwRRtgPP" 创建互斥体,依据返回值判断当前是否该样本的其他实例在运行
(3-2-4) 初始化 SOCKET (3-2-5) 对 2001A010 处的数据进行解密
(3-2-6) 获取本机信息并生成字符串
(3-2-7) 获取当前系统时间, 在 iexplorer.exe 目录下创建 dmlconf.dat 文件并将系统时间写入
3-3 创建6个工作线程: 创建第1个线程(ThreadFunction:20017ACA)
创建第2个线程(ThreadFunction:20017626)
创建第3个线程(ThreadFunction:2001781F)
创建第4个线程(ThreadFunction:2001790C)
创建第5个线程(ThreadFunction:20016EA8)
创建第6个线程(ThreadFunction:20016EC2)
3-4 工作线程行为分析: (3-4-1):Thread1(ThreadFunction:20017ACA) 功能描述: 每隔 1 秒就打开注册表项: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon 并读取 Userinit 的键值,然后检查路径 c:\program files\microsoft\desktopla
获取注册表项的 "Userinit" 键值
检查样本文件路径是否在注册表键值中
样本文件路径不在注册表键值中时,将样本文件路径添加到注册表中
休息 1S 之后,再次检查注册表
(3-4-2):Thread2(ThreadFunction:20017626) 功能描述: 间歇性的测试同 google.com 的 80 端口、bing.com 的 80 端口、yahoo.com 的 80 端口的连通性,只要有一个连通,就不再测试后面的网址并在全局变量 2001A23B 处保存两次能够连通的时间差(秒单位) 获取网址和端口号
(3-4-3):Thread3(ThreadFunction:2001781F) |