最近在办公室里突然有蠕虫传播开了,因为办公室内网里都是没装杀软的,然后发发邮件就感染一片了(笑),而且只要有一台计算机没有清除就依然会传遍局域网。在电脑上找了一下,发现了名称为 DesktopLayer.exe 的病毒文件,于是把它保留了一份,打算研究研究。

样本:
文件: DesktopLayer.exe
大小: 56320 字节
文件版本: 106.42.7
修改时间: 2017年8月28日, 19:04:24
MD5: FF5E1F27193CE51EEC318714EF038BEF
SHA1: B4FA74A6F4DAB3A7BA702B6C8C129F889DB32CA6
CRC32: 40C57347

exe 分析

  1. 首先病毒是用UPX加了壳,脱了壳后看OEP像是用汇编写的。
  2. 入口

  3. 运行后病毒首先通过查询注册表(HKCR\http\shell\open\command)的方式获得默认浏览器的路径,并确认文件的存在,如果不存在还会在备用路径(%ProgramFiles%\Internet Explorer\iexplore.exe
    和 SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\IEXPLORE.EXE)中查找。
  4. 创建命名互斥体防止重入(这里的互斥体随后又马上被关闭)。
  5. 检查当前运行的 exe 文件名是否为 DesktopLayer.exe,不是的话则会遍历以下7个目录:
    • %ProgramFiles%
    • %CommonProgramFiles%
    • %HOMEDRIVE%%HOMEPATH%
    • %APPDATA%
    • 系统目录
    • Windows目录
    • 临时目录

    如果有一个能写入文件且没有对应文件存在的话则复制自身到该目录下的 Microsoft 目录并重命名为 DesktopLayer.exe,然后停止尝试。随后运行刚复制的病毒。成功则结束程序,后续操作交由刚运行的病毒进行处理。

  6. (新运行的病毒)通过 GetProcAddress 获取所需的 ntdll.dll API 地址。
  7. 对 ntdll.dll 中的 ZwWriteVirtualMemory 进行 Hook。
  8. 运行默认浏览器并退出。

乍一看 hook 自身的 ntdll 函数并没有什么作用,但关键之处在于使用 CreateProcess 创建进程时会调用 ZwWriteVirtualMemory 对新进程写入数据,这个时候 hook 函数就会起作用了,避免了远线程的创建。

接下来看 hook 函数。

  1. 首先转发原始操作。hook code
  2. 随后从自身释放出一个dll,并加载到在病毒进程中。
  3. 将加载后的Dll全部写入到浏览器进程中,这里两个进程中加载的地址是相同的,均为0x20010000,这么做避免了dll的重定位。
  4. 继续写入初始化导入表的代码。
  5. 写入修改内存页属性的代码。
  6. 最后向程序入口写入跳转代码。

这样浏览器进程启动之后便会跳转至注入代码执行。

注入代码

  1. 依照注入顺序,代码从入口跳转过后依次进行导入表的初始化,内存区段的属性修改,随后调用DllMain
    入口跳转
    DllMain
  2. DllMain中首先创建于 exe 中相同的命名互斥量。
  3. 初始化套接字,收集了一些设备信息,也会在浏览器程序所在的目录下生成文件 dmlconf.dat 用于记录一些数据,向网站 fget-career.com 发送数据。
  4. 创建7个完成核心功能的线程:
    1. 每秒检查注册表 HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon 下的 UserInit,确认病毒是否在其中,达到开机自启动的目的,不在常见的 Run 中不容易发现。
    2. 每(60+10)秒向 google.com:80, bing.com:80, yahoo.com:80 发送 http 请求,还记录了连接成功的间隔时间。
    3. 每分钟向文件 dmlconf.dat 写入几个全局变量中保存的值。
    4. 如果步骤3中的网络相关操作成功的话则创建一个每分钟向 fget-career.com 发包并接收回包的线程。
    5. 也是网络通讯相关线程。
    6. 每30秒检查一下磁盘,并对硬盘类型的磁盘进行遍历,分别处理两种文件:
      1. exe 和 dll: 如果已存在 .rmnet 节则说明已经感染,跳过;反之找到合适的空间写入一个 .rmnet 节。如果导入表中存在 LoadLibraryA 和 GetProcessAddress 这两个函数,则会对其进行重定位,以便注入代码使用。
      2. html 和 htm: 检查文件尾是否为 “</SCRIPT>”,是则说明已经感染,跳过;反之则添加一段脚本。
        html插入脚本
    7. 每10秒检查磁盘,若有可移动磁盘,通过 autorun.inf 的头 3 字节是否为 “RmN” 判断是否感染。若未感染,则在可移动磁盘根目录下创建 RECYCLER 目录,里面塞了随机命名的病毒 exe; 添加 autorun.inf, 使其自动运行病毒 exe
      autorun.inf

至此该蠕虫基本分析完毕。
该病毒通过注入浏览器进程来伪装自己,因为现在的浏览器基本都是多进程的,不容易被发现。不过运行被感染的程序后会在同一目录下释放出一个带有 Srv 后缀的同名 exe, 这个操作还是比较醒目的。而且邮件客户端会因为 html 被感染而显示乱码,不然也不容易被发现中了毒。

杀毒的话主要还是文件修复,可执行文件需要删除 .rmnet 段并修复入口点,网页文件则删除最后一段 <SCRIPT> 脚本内容。

———————————————-

相关文件:
DesktopLayer病毒样本,解压密码 123456