As I mentioned in my previous post, last weekend I had a look at Purple Haze malware to see what sort of new stuff can be found there. In this blog entry, I will describe step by step what malware does – i.e. simple static and dynamic analysis. Well, it’s not so simple, but here it goes…
STATIC ANALYSIS
File properties
Name 9746b4f684b9d7d346ff131cd024e68d1b06e1b81571ce6d3c5067f0829d7932
Size 130560 0001FE00
MD5 A1B3E59AE17BA6F940AFAF86485E5907
SHA1 6D07CF72201234A07AB57FB3FC00B9E5A0B3678E
FUZZY 3072:Bkt+9iOinX6OunNa8ad76Jw+0HGdsZ7nncCH6/CH2:Bd8X6/Xad76J0GdkLLH,
"9746b4f684b9d7d346ff131cd024e68d1b06e1b81571ce6d3c5067f0829d7932"
Entropy 7.72339425411489
Type MZ PE i386 DEB
Compiled 2011-06-04 11:45:38 (Saturday)
Image ImageBase = 00400000
SizeOfImage = 0002B000
EntryPointRVA = 0001514B
EntryPointFile = 0001454B
Sections
.text
vo = 00001000, vs = 00018B5A
fo = 00000400, fs = 00018C00
flags = E0000020, XWR, CODE
.ctext
vo = 0001A000, vs = 00003492
fo = 00019000, fs = 00003600
flags = 40000040, R, IDATA
.data
vo = 0001E000, vs = 000085BB
fo = 0001C600, fs = 00001A00
flags = C0000040, WR, IDATA
.rdata
vo = 00027000, vs = 00001502
fo = 0001E000, fs = 00001600
flags = 40000040, R, IDATA
.rsrc
vo = 00029000, vs = 00000010
fo = 0001F600, fs = 00000200
flags = 40000040, R, IDATA
.reloc
vo = 0002A000, vs = 000005D8
fo = 0001F800, fs = 00000600
flags = 42000040, R, IDATA
File structure 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZ.............. ... 50 45 00 00 4C 01 06 00 E2 1A EA 4D 00 00 00 00 PE..L......M.... 00 00 00 00 E0 00 02 01 0B 01 09 00 00 8C 01 00 ................ ... 2E 74 65 78 74 00 00 00 5A 8B 01 00 00 10 00 00 .text...Z....... 00 8C 01 00 00 04 00 00 00 00 00 00 00 00 00 00 ................ 00 00 00 00 20 00 00 E0 2E 63 74 65 78 74 00 00 .... ....ctext.. 92 34 00 00 00 A0 01 00 00 36 00 00 00 90 01 00 .4.......6...... 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 40 ............@..@ 2E 64 61 74 61 00 00 00 BB 85 00 00 00 E0 01 00 .data........... 00 1A 00 00 00 C6 01 00 00 00 00 00 00 00 00 00 ................ 00 00 00 00 40 00 00 C0 2E 72 64 61 74 61 00 00 ....@....rdata.. 02 15 00 00 00 70 02 00 00 16 00 00 00 E0 01 00 .....p.......... 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 40 ............@..@ 2E 72 73 72 63 00 00 00 10 00 00 00 00 90 02 00 .rsrc........... 00 02 00 00 00 F6 01 00 00 00 00 00 00 00 00 00 ................ 00 00 00 00 40 00 00 40 2E 72 65 6C 6F 63 00 00 ....@..@.reloc.. D8 05 00 00 00 A0 02 00 00 06 00 00 00 F8 01 00 ................ 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 42 ............@..B ... .text (entropy = 7.73691850981344) 56 47 46 56 57 57 56 47 0A 9C E5 22 67 72 4D 75 VGFVWWVG..."grMu 4C 75 47 53 06 D6 81 32 93 1D 01 00 EA 07 00 00 LuGS...2........ 63 D8 74 9F E7 98 8E A0 77 CB DB A8 60 22 86 98 c.t.....w...`".. F2 D4 C2 8D 72 D5 D3 8F 7D C7 52 91 A6 A5 F0 89 ....r...}.R..... ... .ctext (entropy = 7.69122372438427) F8 BC 81 EC 07 59 F0 87 93 EC 91 5B 10 30 C4 0C .....Y.....[.0.. 9B 55 10 2C 9D F8 98 38 18 AF 18 18 6E 82 EF 82 .U.,...8....n... 8B E6 A9 20 5A B1 24 94 08 69 AB E8 72 B0 16 2C ... Z.$..i..r.., 34 30 30 BD 14 8B B2 BD 3C 24 BC 38 A0 3C 60 2E 400.....<$.8.<`. ... .data (entropy = 7.29026900956825) 00 00 00 00 E2 1A EA 4D 00 00 00 00 02 00 00 00 .......M........ 3A 00 00 00 45 F8 01 00 45 DE 01 00 4D 6A 6C 6D :...E...E...Mjlm 74 72 54 6A 55 4F 42 55 44 47 65 44 64 67 6E 58 trTjUOBUDGeDdgnX 55 4A 56 6D 49 6D 4B 50 52 6A 4A 6D 48 4F 58 61 UJVmImKPRjJmHOXa ... .rdata (entropy = 5.47242760415688) 64 77 02 00 6E 77 02 00 78 77 02 00 80 77 02 00 dw..nw..xw...w.. 8E 77 02 00 A0 77 02 00 A8 77 02 00 B2 77 02 00 .w...w...w...w.. BC 77 02 00 CA 77 02 00 D2 77 02 00 E2 77 02 00 .w...w...w...w.. EA 77 02 00 F8 77 02 00 02 78 02 00 0C 78 02 00 .w...w...x...x.. ... .rsrc (entropy = 0.020393135236085) 00 00 00 00 00 00 00 00 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 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 ................ ... .reloc (entropy = 6.43219032611337) 00 20 00 00 78 00 00 00 14 30 18 30 1C 30 20 30 . ..x....0.0.0 0 24 30 28 30 2C 30 30 30 34 30 38 30 3C 30 40 30 $0(0,0004080<0@0 44 30 48 30 4C 30 50 30 54 30 58 30 5C 30 60 30 D0H0L0P0T0X0\0`0 64 30 68 30 6C 30 70 30 74 30 78 30 7C 30 80 30 d0h0l0p0t0x0|0.0 ... Debug data 52 53 44 53 F8 D8 EF 46 9B 0A 74 43 A1 B4 9B 36 RSDS...F..tC...6 24 56 EB BC 0B 00 00 00 57 3A 5C 76 44 67 68 6E $V......W:\vDghn 4F 7A 6A 70 5C 66 73 65 73 6F 64 67 66 5C 4B 70 Ozjp\fsesodgf\Kp 65 47 68 65 41 2E 70 64 62 00 eGheA.pdb. === Entry Point 2D FB 50 00 00 55 8B EC 81 EC CC 00 00 00 53 BB -.P..U........S. 6A E2 4C 04 89 5D FC 68 80 E1 41 00 C7 45 F8 69 j.L..].h..A..E.i E2 4C 04 FF 15 D8 70 42 00 3B 35 D0 20 40 00 81 .L....pB.;5. @.. 2D C4 20 40 00 04 21 40 00 81 35 C4 20 40 00 EC -. @..!@..5. @..
DYNAMIC ANALYSIS
9746b4f684b9d7d346ff131cd024e68d1b06e1b81571ce6d3c5067f0829d7932
[x] creates/opens file %TEMP%\1.tmp
[x] creates its own copy changing it on the fly from EXE to DLL
via MapViewOfFileEx API
src: \\?\globalroot\Device\HarddiskVolume1\test\
9746b4f684b9d7d346ff131cd024e68d1b06e1b81571ce6d3c5067f0829d7932
dst: %TEMP%\1.tmp
[x] uses print spooler via AddMonitorW to load %TEMP%\1.tmp
%TEMP%\1.tmp is now loaded inside spoolsv.exe
[x] deletes file %TEMP%\1.tmp
[x] creates driver file \??\C:\WINDOWS\TEMP\2.tmp
[x] moves file
src: \\?\globalroot\Device\HarddiskVolume1\test\
9746b4f684b9d7d346ff131cd024e68d1b06e1b81571ce6d3c5067f0829d7932
dst: %TEMP%\3.tmp
[x] creates service key system\currentcontrolset\services\50d5930
[x] sets reg value HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\50d5930\\imagepath
= \??\C:\WINDOWS\TEMP\2.tmp
[x] sets reg value HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\50d5930\\type
= 1
[x] marks file %TEMP%\3.tmp for deletion via HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\
Control\Session Manager\\PendingFileRenameOperations
[x] uses NtLoadDriver to loads the driver: \registry\machine\system\currentcontrolset\
services\50d5930
writes internal files to a newly created device
[x] creates file \??\globalroot\device\00000d83\{7bd8ce81-2e78-3820-e33d-255a2feb1937}\ph.dll
[x] creates file \??\globalroot\device\00000d83\{7bd8ce81-2e78-3820-e33d-255a2feb1937}\phx.dll
[x] creates file \??\globalroot\device\00000d83\{7bd8ce81-2e78-3820-e33d-255a2feb1937}\phd
[x] creates file \??\globalroot\device\00000d83\{7bd8ce81-2e78-3820-e33d-255a2feb1937}\phdx
[x] creates file \??\globalroot\device\00000d83\{7bd8ce81-2e78-3820-e33d-255a2feb1937}\phs
[x] creates file \??\globalroot\device\00000d83\{7bd8ce81-2e78-3820-e33d-255a2feb1937}\phdata
[x] creates file \??\globalroot\device\00000d83\{7bd8ce81-2e78-3820-e33d-255a2feb1937}\phld
[x] creates file \??\globalroot\device\00000d83\{7bd8ce81-2e78-3820-e33d-255a2feb1937}\phln
[x] creates file \??\globalroot\device\00000d83\{7bd8ce81-2e78-3820-e33d-255a2feb1937}\phlx
[x] deletes kernel driver file C:\WINDOWS\TEMP\2.tmp
deletion of original \WINDOWS\system32\spoolsv.exe
[x] moves file
src: \\?\globalroot\Device\HarddiskVolume1\WINDOWS\system32\spoolsv.exe
dst: C:\WINDOWS\TEMP\4.tmp, flags=
[x] marks file C:\WINDOWS\TEMP\4.tmp (\WINDOWS\system32\spoolsv.exe) for deletion
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\PendingFileRenameOperations
so, \WINDOWS\system32\spoolsv.exe is moved to 4.tmp, marked for deletion,
but will reappear after the reboot
QUICK STATIC ANALYSIS OF COMPONENTS
Okay, once we looked at the file and its execution flow, it’s time to poke around to see what stuff is actually hidden inside the embedded files. Extracting the files is not too difficult and we can see that there is a bunch of them actually:
ComponentsName ____globalroot_device_00000d83_{7bd8ce81-2e78-3820-e33d-255a2feb1937}_ph.dll Size 28704 MD5 B0BB987BB74664F4DFB4154EED5406B1 SHA1 A7AF591015D8C1959EF0CD692372E39BD4AB4994 FUZZY 768:EvHSw/VoWy9bEUPoUy1BS9YOshh1pXSVSDgmY:EPSw/VdqEUP2Zhh1piR,"____globalroot_device_00000d83_{7bd8ce81-2e78-3820-e33d-255a2feb1937}_ph.dll" Entropy 6.29082900424848 Type MZ PE i386 DLL Compiled 2012-01-18 23:33:08 (Wednesday) The ad clicking module, interesting string:
%[^.].%[^(](%[^)])
PurpleHaze
ph|%s|%s|%s|%s
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: %d
Cache-Control: must-revalidate, no-cache, no-store
Pragma: no-cache
Expires: Sat, 01 Jan 2000 00:00:00 GMT
Connection: close
<body><a id=link href='%s'></body>
<script>document.getElementById('link').click()</script>
phdata
svchost.exe
netsvcs
Global
java.exe
jp2launcher.exe
acrord32.exe
%d.%d.%d_%d.%d_%d
S:(ML;;NW;;;LW)
%s.dll
kernelbase
http://%s%s
http/1.
host:
Name ____globalroot_device_00000d83_{7bd8ce81-2e78-3820-e33d-255a2feb1937}_phd
Size 32288
MD5 970EFB57CBB4962B6A74D94CD22BCA63
SHA1 06049082C9B367A2A0BADAE077D7F9527C5D2690
FUZZY 768:B6Ad2SmKTyScPlv75iXeeH6OMRrUfsi7fIhEl7UaAxPWaOlXuVI:B6Ad2GTolD5/NEnf72BxPWaGu+,
"____globalroot_device_00000d83_{7bd8ce81-2e78-3820-e33d-255a2feb1937}_phd"
Entropy 7.30737347784811
Type MZ PE i386 SYS DLL
Compiled 2012-01-23 12:07:36 (Monday)
Kernel driver
Name ____globalroot_device_00000d83_{7bd8ce81-2e78-3820-e33d-255a2feb1937}_phdata
Config file
[PurpleHaze]
pn=161
all=ph.dll
allx=phx.dll
wait=3600
Name ____globalroot_device_00000d83_{7bd8ce81-2e78-3820-e33d-255a2feb1937}_phdx
Size 22048
MD5 66EB89E848C036C5755406E871947700
SHA1 2AFD2AF269C620BDD5041ED0D3EE47502E3ACA4F
FUZZY 384:wcMGOJ+SOnSGQu8l6PtjVaglZSo7uvyt1/2j9tLvA+EDgS+DBcG2ATbWY0b:wcMuJnEu8l6VjggbSuM9ZvBEDgXD2GhU,
"____globalroot_device_00000d83_{7bd8ce81-2e78-3820-e33d-255a2feb1937}_phdx"
Entropy 6.07370244368794
Type MZ PE AMD64 Kernel driver for AMD64bit
Name ____globalroot_device_00000d83_{7bd8ce81-2e78-3820-e33d-255a2feb1937}_phld
Binary file
Name ____globalroot_device_00000d83_{7bd8ce81-2e78-3820-e33d-255a2feb1937}_phln
Size 3174
MD5 3B39D436107BAC7B0A62465BA9150EFF
SHA1 40FE02BE9F35135C1102A26B1F5A502C80DB7457
FUZZY 48:MCB01djg5hZ+t3ICFnX4xfQAgCvq9zk+VhF6s6a1JQlI:3Ug5hm3toxISq9F30I,
"____globalroot_device_00000d83_{7bd8ce81-2e78-3820-e33d-255a2feb1937}_phln"
Entropy 5.42879880799889
Type MZ PE i386 SYS DLL
Compiled 2012-01-18 23:31:34 (Wednesday)
Kernel driver
Name ____globalroot_device_00000d83_{7bd8ce81-2e78-3820-e33d-255a2feb1937}_phlx
Size 3688
MD5 42223C735194A70B1EBCA70DB0EDE2C1
SHA1 52A7D5AFA5FF6663CC80F1CAAAFCFCEA8394C1E7
FUZZY 48:pFkZdjymAezwDtpHH3UfcuZ3X1eD9AoizmBOsTmHtuZCzF5qzyCd8vw6XO:IymAIV8WeTcmzNXD,
"____globalroot_device_00000d83_{7bd8ce81-2e78-3820-e33d-255a2feb1937}_phlx"
Entropy 5.29079091610341
Type MZ PE AMD64
Kernel driver for AMD64bit
Name ____globalroot_device_00000d83_{7bd8ce81-2e78-3820-e33d-255a2feb1937}_phs
Binary file; contains strings:
phdata ; [PurpleHaze]
pn=161
Name ____globalroot_device_00000d83_{7bd8ce81-2e78-3820-e33d-255a2feb1937}_phx.dll
Size 3104
MD5 9B82A980F6DFBB0124D7C765F8A7F7C2
SHA1 083E31FC72FAAD085612374D90AF46CD5AAABB06
FUZZY 24:eFGSY85CW06GdUZSEdRXIQum+aUDtXAR9RWgUXdf4iE//4Cjbh45pxZ3:iY8g6GdnIRXnJTEtXATMgUeiEH4CPq,
"____globalroot_device_00000d83_{7bd8ce81-2e78-3820-e33d-255a2feb1937}_phx.dll"
Entropy 2.76585363725654
Entropy2 0.686573878169023
Type MZ PE AMD64 Portable executable 64 bit for AMD
Name _TEMP__1.tmp
Size 130592
MD5 7BD5F8C04051276C0078EBA3F28004D5
SHA1 608DC2C2B1549AF8EAC7B8FD12F875029CA84700
FUZZY 3072:Bkt+9iOinX6OunNa8ad76Jw+0HGdsZ7nncCH6/CH2:Bd8X6/Xad76J0GdkLLH,
"_TEMP__1.tmp"
Entropy 7.72253522274673
Type MZ PE i386 DEB
Compiled 2011-06-04 11:45:38 (Saturday)
Name c__WINDOWS_Temp_2.tmp
Size 32288
MD5 970EFB57CBB4962B6A74D94CD22BCA63
SHA1 06049082C9B367A2A0BADAE077D7F9527C5D2690
FUZZY 768:B6Ad2SmKTyScPlv75iXeeH6OMRrUfsi7fIhEl7UaAxPWaOlXuVI:B6Ad2GTolD5/NEnf72BxPWaGu+,
"c__WINDOWS_Temp_2.tmp"
Entropy 7.30737347784811
Type MZ PE i386 SYS DLL DEB
Compiled 2012-01-23 12:07:36 (Monday)
Kernel driver
THAT’S ALL FOR NOW
It would seem that the main dropper is an old piece from June 2011, and modules have been recompiled in January 2012.


