LShang 发表于 2013-2-9 15:55

永恒小马样本分析报告

本帖最后由 LShang 于 2013-2-9 16:07 编辑

基本信息

报告名称:永恒小马病毒分析报告
作者:LShang
报告更新日期:2013-02-09
样本发现日期:2009-10-27
样本类型:感染型木马
样本文件大小/被感染文件变化长度:25,744 字节/ 无变化
样本文件MD5 校验值:9E2D24491A06BD9EC932A61E9F911219
样本文件SHA1 校验值:165EB716923E423BBC17A9883A18C9E5319B6820
壳信息:AHTeam EP Protector 0.3 (fake PCGuard 4.03-4.15) -> FEUERRADER *
可能受到威胁的系统:Windows
已知检测名称:PWS:Win32/OnLineGames.FU

简介

运行程序后会释放DLL并通过感染系统DLL的方式来得以加载。

文件系统变化
在临时文件目录下会生成以Vch为前缀后跟随一个随机数的临时文件
在Windows\system文件夹下可以找到该临时文件的拷贝
Windows\system32文件夹下d3d9.dll和mshtml.dll被感染并替换
Windows\system32\DllCache文件夹下的d3d9.dll和mshtml.dll被改名为d3d9.dll.bak和mshtml.dll.bak

注册表变化

临时文件目录被添加到注册表键
HKLM\SYSTEM\CurrentControlSet\Control\SessionManager\Environment
下的Path中,即环境变量Path中

详细分析/功能介绍

该报告只涉及对病毒主体的分析,未对病毒释放的DLL做分析。

该样本主要流程

永恒小马.exe分析

首先,该样本获得了临时文件路径
.text:00401CCD               lea   eax,
.text:00401CD3               push    eax             ; lpBuffer
.text:00401CD4               push    104h            ; nBufferLength
.text:00401CD9               call    GetTempPathA    ; 获取临时文件路径
然后对路径进行处理后加入到了环境变量PATH中
.text:00401C30               push   
.text:00401C33               push   
.text:00401C36               call    _mbscpy
.text:00401C3B               push   
.text:00401C3E               push   
.text:00401C41               call    _mbscat
.text:00401C46               push       ; lpData
.text:00401C49               push    edi             ; lpValueName
.text:00401C4A               call    SetEnvironment; 该函数用于设置指定环境变量的值
之后又在临时文件目录生成了一个临时文件
.text:00401D7A               mov   edi, eax
.text:00401D7C               lea   eax,
.text:00401D82               push    eax             ; lpTempFileName
.text:00401D83               push    ebx             ; uUnique
.text:00401D84               lea   eax,
.text:00401D8A               push    offset PrefixString ;"Vch~f094b9fc"
.text:00401D8F               push    eax             ; lpPathName
.text:00401D90               call    GetTempFileNameA ; 生成一个临时文件名

.text:00401DAD               push    ebx             ; hTemplateFile
.text:00401DAE               push    ebx             ; dwFlagsAndAttributes
.text:00401DAF               push    2               ; dwCreationDisposition
.text:00401DB1               push    ebx             ; lpSecurityAttributes
.text:00401DB2               push    ebx             ; dwShareMode
.text:00401DB3               push    0C0000000h      ; dwDesiredAccess
.text:00401DB8               push    eax             ; lpFileName
.text:00401DB9               call    CreateFileA   ; 创建临时文件

并将自身的DLL资源写入到临时文件中,即释放DLL文件
.text:00401DC6               lea   eax,
.text:00401DC9               push    ebx             ; lpOverlapped
.text:00401DCA               push    eax             ; lpNumberOfBytesWritten
.text:00401DCB               push    edi             ; nNumberOfBytesToWrite
.text:00401DCC               push          ; lpBuffer
.text:00401DCF               push    esi             ; hFile
.text:00401DD0               call    WriteFile       ; 写文件

释放成功后在DLL文件后追加了一些数据,即自身的附加数据
.text:00401EF2               push    2               ; dwMoveMethod
.text:00401EF4               mov   ebx, eax
.text:00401EF6                push    edi             ; lpDistanceToMoveHigh
.text:00401EF7               push    edi             ; lDistanceToMove
.text:00401EF8               push    ebx             ; hFile
.text:00401EF9               call    esi ; SetFilePointer
.text:00401EFB               lea   eax,
.text:00401EFE               push    edi             ; lpOverlapped
.text:00401EFF               push    eax             ; lpNumberOfBytesWritten
.text:00401F00               push    ;nNumberOfBytesToWrite
.text:00401F03               push    ; lpBuffer
.text:00401F06               push    ebx             ; hFile
.text:00401F07               call    WriteFile       ; 追加文件

设置了系统使用与隐藏的文件属性以隐藏自身
.text:00401F14               push    6               ; dwFileAttributes
.text:00401F16               push    ; lpFileName
.text:00401F19               call    SetFileAttributesA ; 设置文件属性
.text:00401F19                                       ; 6 <==>0110 <==> 0100 | 0010
.text:00401F19                                       ; 0100系统使用属性
.text:00401F19                                       ; 0010隐藏属性
下图为释放并设置了文件属性的DLL文件属性,被伪装成了tmp文件

将其拷贝到 Windows\system文件夹下,以保证临时文件目录被清空后仍可被加载
.text:00402014               lea   eax,
.text:0040201A               push    0               ; bFailIfExists
.text:0040201C               push    eax             ; lpNewFileName
.text:0040201D               push    esi             ; lpExistingFileName
.text:0040201E               call    CopyFileA       ; 拷贝临时文件

然后感染和替换掉指定的系统DLL文件,以达到自启动目的
.text:00402059               lea   eax,
.text:0040205F               push    eax             ; 不带路径的临时文件名
.text:00402060               push    offset InfectFile ; 该函数用于感染文件
.text:00402065               push    offset aD3d9_dllMshtml ;"d3d9.dll+mshtml.dll"
.text:0040206A               push    0
.text:0040206C               call   ReplaceDLL   ; 该函数用于解析需要被感染的DLL 的字符串
.text:0040206C                                    ; 然后感染和替换 DLL 文件

最后通过CMD程序删除自身,然后结束进程
.text:00401213               lea   eax,
.text:00401219               push    ebx             ; uCmdShow
.text:0040121A               push    eax             ; lpCmdLine
.text:0040121B               call    WinExec         ; 创建进程
.text:00401221               push    ebx             ; uExitCode
.text:00401222               call    ExitProcess   ; 结束自身进程

替换过程分析

将原始DLL文件拷贝一份用于感染
.text:004023F9               lea   eax,
.text:004023FF               push    ebx             ; bFailIfExists
.text:00402400               push    eax             ; lpNewFileName
.text:00402401               lea   eax,
.text:00402407               push    eax             ; lpExistingFileName
.text:00402408               call    esi ; CopyFileA ; 将system32\dll 复制到 system32\dll.rep

利用sfc_os.dll的5号导出库函数(5号门)暂时禁止对指定系统文件的保护
.text:0040249B               lea   eax,
.text:004024A1               push    eax
.text:004024A2               call    SetSfcFileException ; 该函数暂时禁止指定系统文件的文件保护
.text:004024A2                                       ; 禁止后文件可被修改和替换,时间为 60S

.text:004024E1               lea   eax,
.text:004024E7               push    eax
.text:004024E8               call    SetSfcFileException ; 该函数暂时禁止指定系统文件的文件保护
.text:004024E8                                       ; 禁止后文件可被修改和替换,时间为 60S

修改无文件保护的系统文件名
.text:004024B4               push    3               ; dwFlags
.text:004024B6               push    eax             ; lpNewFileName
.text:004024B7               lea   eax,
.text:004024BD               push    eax             ; lpExistingFileName
.text:004024BE               call    edi ; MoveFileExA ; 移动文件 --> 重命名文件
.text:004024BE                                 ; 3 <==>0011 <==> 0001 | 0010
.text:004024BE                                 ; 0001 如果目标文件存在,则替换目标文件
.text:004024BE                                 ; 0010 如果移动到不同的卷,则复制文件后删除自身

.text:004024EE               lea   eax,
.text:004024F4               pop   ecx
.text:004024F5               push    1               ; dwFlags
.text:004024F7               push    eax             ; lpNewFileName
.text:004024F8               lea   eax,
.text:004024FE               push    eax             ; lpExistingFileName
.text:004024FF               call    edi ; MoveFileExA ; 修改文件名

感染拷贝的系统文件
.text:004024C0               push   
.text:004024C3               lea   eax,
.text:004024C9               push    eax
.text:004024CA               call    ; 该函数用于感染文件

用感染后的文件替换原始文件
.text:00402527               lea   eax,
.text:0040252D               push    1               ; dwFlags
.text:0040252F               push    eax             ; lpNewFileName
.text:00402530               lea   eax,
.text:00402536               push    eax             ; lpExistingFileName
.text:00402537               call    edi ; MoveFileExA ; 用感染后的文件替换原文件

删掉原始文件备份
.text:004025C1               lea   eax,
.text:004025C7               push    eax             ; lpFileName
.text:004025C8               call    DeleteFileA   ; 删除备份文件
.text:004025CE               test    eax, eax
.text:004025D0               jnz   short loc_4025DE
.text:004025D2               push    4               ; dwFlags
.text:004025D4               lea   eax,
.text:004025DA               push    ebx             ; lpNewFileName
.text:004025DB               push    eax             ; lpExistingFileName
.text:004025DC               call    edi ; MoveFileExA ; 重启后删除文件
.text:004025DC                                       ; 4<==> 0100
.text:004025DC                                       ; 0100在重启后移动文件

感染过程分析

加载感染文件映射
.text:00401615               push    ebx             ; dwNumberOfBytesToMap
.text:00401616               push    ebx             ; dwFileOffsetLow
.text:00401617               push    ebx             ; dwFileOffsetHigh
.text:00401618               push    0F001Fh         ; dwDesiredAccess
.text:0040161D               push       ; hFileMappingObject
.text:00401620               call    MapViewOfFile   ; 加载文件映射到当前地址空间

保存原始入口点代码
.text:00401930               push    16h             ; Size
.text:00401932               push    esi             ; Src
.text:00401933               push    (offset byte_404098+4Ah) ; Dst
.text:00401938               call    memcpy

插入病毒代码,修改入口点代码
.text:004019F0               mov   eax, edi      ; 文件映射的有效代码尾部内存地址
.text:004019F2               sub   ecx, edi
.text:004019F4               mov   edi, 84h
.text:004019F9
.text:004019F9 loc_4019F9:                           ; CODE XREF:InfectFile+483j
.text:004019F9               mov   dl,
.text:004019FC               mov   , dl
.text:004019FE               inc   eax
.text:004019FF               dec   edi
.text:00401A00               jnz   short loc_4019F9
.text:00401A02               push    16h             ; Size
.text:00401A04               push    offset byte_404080 ; Src
.text:00401A09               push    esi             ; Dst
.text:00401A0A               call    memcpy          ; 修改入口点代码

预防及修复措施

方式一(手工修复):
使用16进制编辑工具载入被感染DLL文件,找到被感染位置。
可能为以下两处:
1)      在文件偏移322H处向后查看,如存在字符串“AION” 则是PEHead被感染2)      计算.text节的有效代码尾部偏移,从该偏移向后查看,如存在“AION” 则是.text节被感染
如果为PEHead被感染
在文件偏移30AH处复制16H字节。
计算.text节首文件偏移,用复制的16H字节覆盖掉当前.text节首内容。
将2C0H偏移后84H字节用0填充。
如果为.text节被感染
       在有效代码尾部向后偏移4AH处复制16H字节。
计算.text节首文件偏移,用复制的16H字节覆盖掉当前.text节首内容。
       将有效代码尾部后84H字节用0填充。
完成以上修复后
删除掉临时文件目录下Vch开头的tmp文件。
删除掉system文件夹下的Vch开头的tmp文件。
将临时文件目录从环境变量PATH中删除
方式二:
使用未被感染的系统DLL替换已被感染的DLL,可在PE环境下进行替换。

技术热点及总结

该样本不同于其他捆绑或添加区段的样本,仅利用已存在空间进行插入代码。并不会增加系统DLL的体积,不易被察觉。
同时感染部分对于感染代码的精心构造以及PE格式的利用也很值得学习。

样本下载

a13005746827 发表于 2013-2-9 16:01

那么详细...支持.

希望出个kiss.exe的病毒分析.不会手动修复啊.

笑容茹椛 发表于 2013-2-9 16:17

菜鸟路过 表示看都看不懂

1354669803 发表于 2013-2-9 17:45

鄙视放马的

fndht 发表于 2013-2-10 13:20

太牛了 这个要好好学习一下

ruige8866 发表于 2013-7-8 18:40

顶一个~~~~~~~~~~

忘缘随缘 发表于 2013-8-9 15:06

太牛了 这个要好好学习一下

malcode 发表于 2016-1-3 23:28

看看这个小马
页: [1]
查看完整版本: 永恒小马样本分析报告