HawkEye Malware: Technical Analysis – Cybersecurity Insiders


HawkEye, also known as PredatorPain (Predator Pain), is a malware categorized as a keylogger, but over the years, it has adopted new functionalities that align it with the capabilities of other tools like stealers.

History of HawkEye

HawkEye emerged before 2010, with records of its use and sale dating back to 2008, making it quite long-lived. After several spearphishing campaigns in which this well-known malware was attached, it gained significant popularity starting in 2013.

This keylogger has been available on various dark web sites, even having dedicated websites where the tool was sold. However, this keylogger has been cracked for years and used by different actors without going through the subscription method imposed by its creators, whose price ranged between $20 and $50. This has contributed to its continued notoriety, and it has been used not only by criminal actors but also by script kiddies due to its ease of use.

Although it is not one of the most widely used malwares, it remains in active use and saw a significant resurgence during the COVID period. During this time, certain actors took advantage of the general hysteria to obtain company data through phishing campaigns.

Additionally, HawkEye has been used in conjunction with other loaders and/or malware that invoked this keylogger. Over its long trajectory, various actors and malware have been involved in attacks on companies, some of which include Galleon Gold, Mikroceen, iSPY crypter related with Gold Skyline, Remcos used on campaigns with HawkEye, Pony used on campaigns with HawkEye, etc.

Analysis in the ANY.RUN Sandbox

To conduct a quick analysis of HawkEye to extract critical data fast, we can use ANY.RUN’s Interactive Sandbox. The service lets us easily upload and detonate a sample in a safe virtual environment and engage with it and the system just like on a standard computer.

Analysis of a HawkEye sample in the ANY.RUN sandbox

Consider this analysis session, After executing the malware, the sandbox instantly identifies it as HawkEye and starts tracking its system and network activities. It also lists all the malicious actions performed by the threat and automatically maps them to MITRE ATT&CK TTPs.

HawkEye config extracted by the ANY.RUN Sandbox

It also generates a comprehensive report, lists indicators of compromise (IOCs), and extracts the sample’s config information.

To start using ANY.RUN, request a 14-day free trial and access all features. You can also take advantage of a Black Friday offer to buy a license and receive another for free.

Technical Analysis

HawkEye’s delivery methods are quite diverse compared to other malware. However, its execution and behavior have remained relatively consistent over the years. A behavior graph of what has been observed in recent months would look as follows:

Overview GraphOverview Graph

HawkEye graph

During the analysis process, I typically spend weeks, even months, collecting samples to understand how they function as a whole based on the existing variants. Therefore, we may observe variations among those presented. In most executions, we encounter enormous trees of processes based on their activities. To simplify, as you’ve seen in the previous graph, it’s not as complex compared to other stealers or RATs. It generally consists of an executable that drops others in temporary paths, then injects code into one of them or into a .NET-related software. Later, in memory, it gathers all possible data and sends it to a C&C.

ProcDOT detonation chart

Going straight to the point, in an initial execution of one of the samples I analyzed, we see a rather extensive process—a succession of execution copies launched in temporary paths.

囗 e | 。 「 e 「 e
15 , 32g K
IS 旧 32K
24s2
囗 e | 。 e
26 , 456K
2 072K
2724
lgfpeßaxa
12 , S K
15 , 168K
2536 NVIDIA user apenence Dri
囗 se 「 「 exe
13 , 744 K
15 , 480 K
1700
asqlse 「 捣「 axe
26 , 46g K
29.004 K
2336 囗 e | 。 「 e 「 e
15 , 32g K
IS 旧 32K
24s2
囗 e | 。 e
26 , 456K
2 072K
2724
lgfpeßaxa
12 , S K
15 , 168K
2536 NVIDIA user apenence Dri
囗 se 「 「 exe
13 , 744 K
15 , 480 K
1700
asqlse 「 捣「 axe
26 , 46g K
29.004 K
2336

Process Tree execution (Image 1)

gfpeß axe
sq I server exe
qlsenjerexe
Command Ljna:
14.976 K
28.472 K
16.920K
23.184K
Vpp Data LocaI Temp Syst em sqlservar axe
Data M_ocal Tamp Systam sqlservar exe gfpeß axe
sq I server exe
qlsenjerexe
Command Ljna:
14.976 K
28.472 K
16.920K
23.184K
Vpp Data LocaI Temp Syst em sqlservar axe
Data M_ocal Tamp Systam sqlservar exe

Process Tree execution (Image 2)

In this instance, they used the RoamingTemplates path, but this is highly variable depending on who created it. Generally speaking, they tend to abuse paths like AppDataRoaming and AppDataTemp, which are classic choices.

2X2 」 2 」 04 鬲 2 dwel 裟 op 長 、 ン ′ 工 0 巴 」 O 透 言 L 当 E20 ′ 2 ロ
2X2 」 2 」 0 鬲 2 五 Lue ト 鬲 ′ ′ 工 0 巴 」 型 言 u - E20 ′ 2 ロ dd ′
2X2 」 2 」 0 - 叫 ′ 五 Lue ト 鬲 裟 ヴ ェ 0 巴 」 型 言 u 一 E20 ′ 2 ロ は d ′
2X2 」 2 」 0 ( 叫 ′ 五 Lue ト 鬲 裟 ヴ ェ 0 巴 」 型 言 u 一 E20 ′ 2 ロ は d ′
巴 2 的 コ ′ い 2 2 鬻 80 」 d 09
巴 2 的 コ ′ い
巴 2 的 コ ′ い
巴 2 的 コ ′ い 2 曰 - pe 当 66
2 曰 - pe 当 09
2 曰 - pe 当 09
2X2 」 2 」 0 - 2 ロ
2X2 」 2 」 0 - 2 ロ
2X2 」 2 」 。 - 2 ロ
ェ ロ
ェ ロ
ェ ロ 2X2 」 2 」 04 鬲 2 dwel 裟 op 長 、 ン ′ 工 0 巴 」 O 透 言 L 当 E20 ′ 2 ロ
2X2 」 2 」 0 鬲 2 五 Lue ト 鬲 ′ ′ 工 0 巴 」 型 言 u - E20 ′ 2 ロ dd ′
2X2 」 2 」 0 - 叫 ′ 五 Lue ト 鬲 裟 ヴ ェ 0 巴 」 型 言 u 一 E20 ′ 2 ロ は d ′
2X2 」 2 」 0 ( 叫 ′ 五 Lue ト 鬲 裟 ヴ ェ 0 巴 」 型 言 u 一 E20 ′ 2 ロ は d ′
巴 2 的 コ ′ い 2 2 鬻 80 」 d 09
巴 2 的 コ ′ い
巴 2 的 コ ′ い
巴 2 的 コ ′ い 2 曰 - pe 当 66
2 曰 - pe 当 09
2 曰 - pe 当 09
2X2 」 2 」 0 - 2 ロ
2X2 」 2 」 0 - 2 ロ
2X2 」 2 」 。 - 2 ロ
ェ ロ
ェ ロ
ェ ロ

Paths commonly abused (Image 1)

Зехр]огег ехе
igfpewexe
igfpewexe
2492
2536
2536
С  [ JseB
03t в Тетр Syst ет vigfpeB ехе
Ster1
Theed Зехр]огег ехе
igfpewexe
igfpewexe
2492
2536
2536
С  [ JseB
03t в Тетр Syst ет vigfpeB ехе
Ster1
Theed

 Paths commonly abused (Image 2)

C  exe
magen exe
magart exe
1412 Z Process Creata
748 Process Start
748 Thread Create C  exe
magen exe
magart exe
1412 Z Process Creata
748 Process Start
748 Thread Create

Paths commonly abused (Image 3)

Here’s the list of paths observed for dropping files:

  • C:UsersAppDataLocalTemp
  • C:UsersAppDataRoaming
  • C:UsersAppDataRoamingMicrosoftWindowsTemplates
  • C:UsersAppDataLocalTempSystem
  • C:UsersMusic

 

All of these files that are launched, and which we’ve observed executing in the previous step, are copies of themselves. The filenames are also highly variable, as you might expect, but they often try to have an icon that makes the victim think it’s a legitimate program, or the malware description might be altered to make it seem like legitimate software. 

Ultimately, after comparing the dropped files, we can see they are simple copies of the original, with the particularity that some versions launch them in hidden mode, so you can’t see them unless you’ve enabled the “View hidden files” function in Windows.

Hidden files duplication graph

During these file droppings, we can encounter both replicas of the original file in different paths, as well as support files whose functionality is typically to establish persistence (or check if it’s already done, and if not, do it) and to perform injector functions, which is a characteristic of this malware. In this case, the smaller binary is responsible for these actions. 

Computer
Local Disk (C:) Users
AppData
Local
Temp
System
Include in library
Name
Share with
New folder
Date modified
igfpers.exe
sqlserver.exe
Type
Application
Application
Size
36 KB
151 KB Computer
Local Disk (C:) Users
AppData
Local
Temp
System
Include in library
Name
Share with
New folder
Date modified
igfpers.exe
sqlserver.exe
Type
Application
Application
Size
36 KB
151 KB

Injector written in temporary folder

I check to see if there is any shared information between the two binaries and notice that certain parts of the code match the original. This will become relevant later, as right now we’re seeing them separately, but everything will make sense afterward.

Comparison of the injector and the Hawkeye bin

After this step, we can see how persistence is established. PredatorPain isn’t just a malware that establishes persistence once—it’s been observed to check and establish persistence up to three different times, depending on the phases (Loader > Injector > Payload). 

This makes it clear that the malware is determined to persist on the system, one way or another. At this stage, to avoid revealing persistence mechanisms through strings, it obfuscates a string and then decodes it to introduce, in this case, one of the binaries launched earlier. This practice isn’t as common and adds a level of sophistication not found in other samples.

public string e(string
—int
e. Length;
e 255;
num2 =
Persistence
hkey
e)
array
chart) array = e.ToCharArray();
while (--num e)
(char) (
array [num)
return string. Intern (new string(array));
registryKey
Identity
Name
SubKeyCcunt
ValueCcunt
checkMode
keyName
rerncteKey
_identity
Static members
e
. a Cnum2)
e));
11)
[21
[3]
[5]
[71
[8]
OxEA8F
true);
Type
REG_SZ
array
[1]
[2]
[3]
[4]
[5]
[7]
[8]
pubLIC static void
ResistryKey registryKey
if (resistryKey null)
return;
resistryKey . Close ( ) ;
Resi stry. CurrentUser.
char[Ox00000009]
ox0073 's'
ox006C 'l'
0*0073
Software CurrentVersion Run}
Btringto—l]
-NVIDIA User Experience Driver Component-
{H KEV_C URREN T_tJSERlSoftwa tv ersion IRun )
rrentVersionRu npublic string e(string
—int
e. Length;
e 255;
num2 =
Persistence
hkey
e)
array
chart) array = e.ToCharArray();
while (--num e)
(char) (
array [num)
return string. Intern (new string(array));
registryKey
Identity
Name
SubKeyCcunt
ValueCcunt
checkMode
keyName
rerncteKey
_identity
Static members
e
. a Cnum2)
e));
11)
[21
[3]
[5]
[71
[8]
OxEA8F
true);
Type
REG_SZ
array
[1]
[2]
[3]
[4]
[5]
[7]
[8]
pubLIC static void
ResistryKey registryKey
if (resistryKey null)
return;
resistryKey . Close ( ) ;
Resi stry. CurrentUser.
char[Ox00000009]
ox0073 's'
ox006C 'l'
0*0073
Software CurrentVersion Run}
Btringto—l]
-NVIDIA User Experience Driver Component-
{H KEV_C URREN T_tJSERlSoftwa tv ersion IRun )
rrentVersionRu n

Hawkeye persistence in registers

Not only does it create persistence in the registry, but we also find samples that establish persistence in tasks using commands like the following:

schtasks.exe /Create /TN “” /XML “

After observing its behavior in the early stages, we delve deeper into the entire execution thread throughout the analysis phase with debugging. I’ve followed several samples, and they’re mostly similar—samples in .NET, sometimes obfuscated with tools like Confuser, Eaz, Reactor, or similar, which are relatively easy to deobfuscate.

public string u2FW,
int num = u2Føø.Length;
int num2 =
u2Føø & 255;
int u2Føø)
chart) array =
while (--num e)
array C num)
(char)
—return
// Token: axa4øøøøaA RID: la
public static readonly Xu2Fß3. Xu2Føa Xu2Føø;
// Token: axuøøøøaa RID: 11
private byte[] Xu2FßI;
((int)this. u2FøICnum2)
u2Føø)); public string u2FW,
int num = u2Føø.Length;
int num2 =
u2Føø & 255;
int u2Føø)
chart) array =
while (--num e)
array C num)
(char)
—return
// Token: axa4øøøøaA RID: la
public static readonly Xu2Fß3. Xu2Føa Xu2Føø;
// Token: axuøøøøaa RID: 11
private byte[] Xu2FßI;
((int)this. u2FøICnum2)
u2Føø));

Hawkeye code obfuscated

In most samples, I noticed heavy interaction with resources, which will become crucial shortly since I observed a significant amount of data in these resources across most of the samples I found.

FindResource
SizeofResource
LoadResource
IfirtualAllocEx FindResource
SizeofResource
LoadResource
IfirtualAllocEx

 Resources data content (Image 1)

ss
2€
]соп
]соп Grou2
0000EFBz
0000EF>z<br />
0000EFzz<br />
0000EFEZ<br />
0000Fooz<br />
0000F02z<br />
0000F04z<br />
0000F0Ez<br />
0000Fnz<br />
0000Fozz<br />
0000F0Ez<br />
0000F10z<br />
0000F12z<br />
0000F14z<br />
од 24<br />
21<br />
42<br />
91<br />
Ез<br />
23<br />
92<br />
64<br />
67<br />
24<br />
43<br />
22<br />
92<br />
64<br />
67<br />
25<br />
53<br />
Ез<br />
22<br />
зв<br />
70<br />
67<br />
Ез<br />
вв<br />
70<br />
52<br />
Ез<br />
32<br />
вв<br />
70<br />
Ез<br />
sc<br />
32<br />
вв<br />
70<br />
2€<br />
67<br />
72<br />
во<br />
вв<br />
70<br />
29<br />
ss<br />
67<br />
35<br />
33<br />
вв<br />
41<br />
во<br />
дз<br />
67<br />
36<br />
34<br />
42<br />
51<br />
47<br />
67<br />
€2<br />
34<br />
42<br />
52<br />
70<br />
24<br />
29<br />
зс<br />
25<br />
2€<br />
yR@rZ<br />
) з глллллллллллт<br />
34<br />
94<br />
24<br />
вв<br />
23<br />
27<br />
вв<br />
47<br />
29<br />
вв<br />
21<br />
52<br />
33<br />
вв<br />
44<br />
21<br />
вз<br />
вв<br />
53<br />
20<br />
вв<br />
07<br />
41<br />
23<br />
40<br />
вв<br />
24<br />
дз<br />
вв<br />
25<br />
04<br />
вв<br />
св<br />
43<br />
72<br />
вв<br />
ЕЕ<br />
вв<br />
42<br />
29<br />
вв<br />
28<br />
76<br />
ЕВ<br />
сз<br />
Ез<br />
BVZSERIYUJGF+_)<br />
• ссссдддд±еее<br />
3444тттт<br />
cddppppp<br />
ееееееееееее<br />
fggg<br />
XXXXL ” width=”624″ height=”119″ class=”lazyload”/><img data-lazyloaded=Resources data content (Image 2)

In the malware’s initial phases, it looks for the running process (which will be the previously prepared copy), where it will check the PID to access the resources. Within these resources, we see two distinct types of code: the initial part, which acts as a key, and the data chunk, which is what will be deobfuscated. To achieve this, it uses XOR + Poly, and at the end of the process, it extracts a Portable Executable.

Load from rsrc
- OUL;
1 _ fal -
Classl _fa2 -
1 _fa3 -
Classl _fa: -
1 _fa5 -
1 _ fas -
_ G7
if
Limit -
int nw;
stuk&rk,
-1
Ill
fir:
QRexorVcz Load from rsrc
- OUL;
1 _ fal -
Classl _fa2 -
1 _fa3 -
Classl _fa: -
1 _fa5 -
1 _ fas -
_ G7
if
Limit -
int nw;
stuk&rk,
-1
Ill
fir:
QRexorVcz

Graph of binary load from resources

It can do this in various ways depending on the sample, but we see the same extraction of a binary from a resource as we do from obfuscated code in memory, like the example shown below.

O
O
O
O
O
O
O
O
O
O
m
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
m
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
m
O
O
O
O
O
O
O
O
O
O
O
O
O
O
m
0
0
m
m
수』
최•
m
O
O
O
최•
O
O
수』
O
O
O
O
O
O
O
O
최•
수』
O
O
O
O
O
O
O
O
m
O
O
O
0
O
최•
O
O
O
O
O
m
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
최•
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
최•
O
0
O
O
O
O
O
O
O
O
m
O
0
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
0
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
m
O
O
O
O
O
O
O
O
O
O
1,
O
O
O
O
최•
O
O
O
O
O
O
O
O
O
O
O
최•
O
O
O
O
O
O
O
O
O
O
O
O
O
O
수』
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
최•
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
0
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
0
O
O
O
0
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
최•
O
O
O
O
규호三巨巨표즈흐E巨巨g巨亶亘:
騎프 형 영
O
O
O
O
O
O
O
O
최•
O
O
O
O
O
O
O
O
O
O
0
m =
0 그 O
O
O
O
O
O
O
O
O
O
m
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
m
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
m
O
O
O
O
O
O
O
O
O
O
O
O
O
O
m
0
0
m
m
수』
최•
m
O
O
O
최•
O
O
수』
O
O
O
O
O
O
O
O
최•
수』
O
O
O
O
O
O
O
O
m
O
O
O
0
O
최•
O
O
O
O
O
m
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
최•
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
최•
O
0
O
O
O
O
O
O
O
O
m
O
0
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
0
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
m
O
O
O
O
O
O
O
O
O
O
1,
O
O
O
O
최•
O
O
O
O
O
O
O
O
O
O
O
최•
O
O
O
O
O
O
O
O
O
O
O
O
O
O
수』
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
최•
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
0
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
0
O
O
O
0
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
O
최•
O
O
O
O
규호三巨巨표즈흐E巨巨g巨亶亘:
騎프 형 영
O
O
O
O
O
O
O
O
최•
O
O
O
O
O
O
O
O
O
O
0
m =
0 그

Graph of PE extraction from memory

The result of this phase is two extracted files—one will be the injector, and the other will be the Keylogger.

File extract
Entry Point :
File Offset :
Linker Info :
tile Siié:
0000F5EE
0000D9EE
8.00
0001220%
00
EP Section :
First Bytes :
Subsystem :
FF 2500 20 40
Windovvs GUI
00004209
32 bit- Library
RES/OVL : O / 22 %
MS Visual ce / aasic.NET VB 2005 -DLL -EPToken : 00000000 , overli
Lamer Info - Help Hint nu•pack info
aig sec. 01 , [I*EXE PE found], Warning : NETRES 36.22KE,tr File extract
Entry Point :
File Offset :
Linker Info :
tile Siié:
0000F5EE
0000D9EE
8.00
0001220%
00
EP Section :
First Bytes :
Subsystem :
FF 2500 20 40
Windovvs GUI
00004209
32 bit- Library
RES/OVL : O / 22 %
MS Visual ce / aasic.NET VB 2005 -DLL -EPToken : 00000000 , overli
Lamer Info - Help Hint nu•pack info
aig sec. 01 , [I*EXE PE found], Warning : NETRES 36.22KE,tr

Extracted Injector 

extract2 Properties
Туре of Те
0esc6ption
Sze оп disk
[евк Fomms 800ter
С  [ JseB
04 КВ
Desktop extract2 Properties
Туре of Те
0esc6ption
Sze оп disk
[евк Fomms 800ter
С  [ JseB
04 КВ
Desktop

Extracted Keylogger

 

I compared both files, and they’re entirely different, in size, in structure—the only common factor is that both are .NET binaries.

Binary comparison 

To highlight the difference between the injector dropped on disk (Right) and the one extracted from memory (Left), we can compare the extended content. We can observe how the memory-extracted injector includes imports related to injection that the disk version doesn’t (such as ZwUnmapViewOfSection, VirtualAllocEx, WriteProcessMemory, etc.).

Extracted and dropped injector comparison 

indicators (imports > flag)<br />
virustctal (error)<br />
dos header (64 bytes)<br />
dos stub (64 bytes)<br />
rich-header (n/a)<br />
file-header (Intel-386)<br />
optional-header (GUI)<br />
directories (6)<br />
sections (3)<br />
libraries (mscoree.dll)<br />
innpcru (flag)<br />
NE-callback (n/a)<br />
.NET (stream)<br />
resources (2)<br />
strings (596)<br />
debug (Feb.2012)<br />
manifest (n/a)<br />
version (nvxdsync.exe)<br />
certificate (n/a)<br />
Overlay (n/a)<br />
imports (163)<br />
Memo Stream<br />
AesMana ed<br />
CryptoConfig<br />
CryptoStream<br />
CryptoStreamMode<br />
DESCwptoServiceProvider<br />
HashAI arithm<br />
ICwptoTransform<br />
RSACwptoServiceProvider<br />
RSAParameters<br />
SHAI CryptoServiceProvider<br />
SHAI Mana ed<br />
SHA256Mana ed<br />
SymmetricAIgorithm<br />
ResourceMana er<br />
Re ist K<br />
Process<br />
Assembly8uiIder<br />
Assembly8uiIderAccess<br />
ILGenerator<br />
Label<br />
Loca18uiIder<br />
Method8uiIder<br />
Module8uiIder<br />
O Code<br />
O Codes<br />
namespace (21)<br />
System .10<br />
System. Security. Cryptograp…<br />
System. Security. Cryptograp…<br />
System. Security. Cryptograp…<br />
System.Security.Cryptcgrap…<br />
System. Security. Cryptograp…<br />
System. Security. Cryptograp…<br />
System. Security. Cryptograp…<br />
System.Security.Cryptcgrap…<br />
System. Security. Cryptograp…<br />
System. Security. Cryptograp…<br />
System. Security. Cryptograp…<br />
System.Security.Cryptcgrap…<br />
System. Security. Cryptograp…<br />
System. Security. Cryptograp…<br />
System. Resources<br />
Microsoft.Win32<br />
Microsoft.Win32<br />
System.Diagncstics<br />
System. Reflection. Emit<br />
System. Reflection. Emit<br />
System. Reflection. Emit<br />
System. Reflection. Emit<br />
System. Reflection. Emit<br />
System. Reflection. Emit<br />
System. Reflection. Emit<br />
System. Reflection. Emit<br />
System. Reflection. Emit<br />
flag (15)<br />
group (5)<br />
memory<br />
cryptography<br />
cryptography<br />
cryptography<br />
cryptography<br />
cryptography<br />
cryptography<br />
cryptography<br />
cryptography<br />
cryptography<br />
cryptography<br />
cryptography<br />
cryptography<br />
cryptography<br />
cryptography<br />
resource<br />
registry<br />
registry<br />
execution<br />
execution<br />
execution<br />
execution<br />
execution<br />
execution<br />
execution<br />
execution<br />
execution<br />
execution<br />
desktopextract<br />
indicators (file > embedded)<br />
virustctal (error)<br />
dos header (64 bytes)<br />
dos stub (64 bytes)<br />
rich-header (n/a)<br />
file-header (Intel-386)<br />
optional-header (GUI)<br />
directories (5)<br />
sections (file)<br />
libraries (p/invoke)<br />
innpcru (flag)<br />
expc.u a)<br />
„—O NE-callback (n/a)<br />
.NET 02050727)<br />
resources L)<br />
strings (1382)<br />
debug (Feb.2012)<br />
manifest (n/a)<br />
version (n/a)<br />
certificate (n/a)<br />
overlay (signature > unknown)<br />
imports (269)<br />
GetThreadContext<br />
WriteProcessMemo<br />
ReadProcessMemo<br />
VirtualProtectEx<br />
ZwUnma ViewOfSection<br />
SetFiIeAttributesA<br />
Createprocess<br />
SetThreadContext<br />
Processld<br />
FindResource<br />
SizeofResource<br />
LoadResource<br />
VirtualAIIocEx<br />
FileO en<br />
GetTem Path<br />
WriteAIIText<br />
WriteA118ytes<br />
CreateDirecto<br />
ResumeThread<br />
GetCurre” width=”624″ height=”187″ class=”lazyload”/><img data-lazyloaded=Extracted and dropped injector comparison

Here we can observe various functionalities while extracting the binaries, such as self-deletion. This is done to maintain evasion and avoid revealing its location, as it drops replicas of the original binary in various locations, as we saw earlier.

if (File. Exists(text))
Fi Ie . Copy (Proces s . . Mai nModuIe . Fi IeName ,
text) ; if (File. Exists(text))
Fi Ie . Copy (Proces s . . Mai nModuIe . Fi IeName ,
text) ;

 Self-deletion and self-copy of the original binary (Image 1)

Local Disk (C:) Users
AppData
Roaming
library
Name
Share with
New folder
Date modified
explorer.exe
Microsoft
Type
Application
Windows Templates
Size
151 KB Local Disk (C:) Users
AppData
Roaming
library
Name
Share with
New folder
Date modified
explorer.exe
Microsoft
Type
Application
Windows Templates
Size
151 KB

Self-deletion and self-copy of the original binary (Image 2)

if true . Tostring(), false)
Classl.Ccpiaza() if true . Tostring(), false)
Classl.Ccpiaza()

 Self-deletion and self-copy of the original binary (Image 3)

array
expression
(string[OxOOOOOOOA] array
expression
(string[OxOOOOOOOA]

Self-deletion and self-copy of the original binary (Image 4)

One of the dropped files, the smaller one, acts as the injector. When extracted from memory, it has more functionalities than the one seen on disk. This is because the injection tasks are carried out during runtime, but the written file is actually a portion of this, triggering the main binary located in the temporary path. 

It checks persistence and restarts the entire process, including injection. Therefore, it’s a part of the file without revealing all of its functionalities. I’ll show you how it performs injection using Process Hollowing.

Process Injection
target,
secur ity_F Iags,
secur Lty
_F lags2,
inher it,
f Iags ,
system, , ci
text 2, ,
startup_lnformation,
procesă
Information)
ret u rn;
rpf.H.r•II Headers nt_Headers default(rpf.H.NI Headers)•
intPtr =
new IntPtr-(n• + dos_Header.Address);
obiect obj2 = Marshal. PtrToStr-ucture(intPtr, nt_Headers .6etType());
rpf .H.NT Header-s nt_Headers2;
nt_Headers ((0bj2 nul l) ? ((rpf.H.nr _ Headerc)obj2) : nt_Headers2);
startup_lnfcrmation . CB = Strings.
context. F Iags
65538u;
if Signature 17744UL dos_Header.nagic 23117)
retur n;
bool threadContext rpf .H.GetThreadContext(process
process • process_lnfomation.process;
address .Ebx
IntPtr
long num2;
intPtr = (IntPtr-)num2;
site • (TntPtr)4;
int num3 e;
int num4 = rpf .H. ReadPrccessMemcry(process, address,
num2 = (long)intptr;
Information . Thread,
+ 8UL));
ref
context) ;
ref intPtr, size, ref num3);
oo
oo
OE
69
74
oo
oo
oo
04
oo
oo
oo
sc
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
73
20
oo
10
40
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
20
62
64
oo
oo
oo
01
oo
01
10
oo
01
oo
01
oo
oo
oo
oo
oo
oo
oo
oo
oo
OE
70
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
os
oo
oo
oo
oo
72
20
oo
oo
oo
oo
oo
10
oo
oc
oo
oo
oo
oo
oo
oo
oo
oo
oo
72
01
oo
oo
oo
oo
04
10
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
04
02
oo
40
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
72
oo
01
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
04
40
oo
oo
21
61
20
24
43
oo
04
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
01
20
oo
oo
oo
oo
oo
40
oo
oo
20
20
oo
oo
oo
oo
01
20
oo
BD
01
oo
oo
oo
10
oo
01
oo
01
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
61
44
oo
oo
oo
oo
oo
oo
02
oo
oo
oo
oo
oo
74
oo
oo
oo
21
oo
oo
20
02
oo
oo
10
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
01
oo
oo
oo
40
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
20
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
program canno
be run în DOS
. . text.
if (threadContext g e  rpf.H. (TntPtF)num2) OL)
uint num5 =
if ((uIong)num5 OUL)
process2 process_lnfor.ation. Process;
address2 =
( (ulong)num5));
Intet,-
size2 = .OptionaI .SHeaders));
Int?tr-
uint num6;
num3 • (int)num6;
rpf . H. WritePrccessMemcry(process2, address2, data, size2, out num3);
num6 = (uint)num3;
long num7 (long) (dos_Header.Address + 248);
int num8 • e;
int numg = Headers.FiIe.Sections - 1);
fot- (int i =
num8; i numg; ÎH)
intPtr • + num7 + • 40));
rpf.H.Seczion HeadeProcess Injection
target,
secur ity_F Iags,
secur Lty
_F lags2,
inher it,
f Iags ,
system, , ci
text 2, ,
startup_lnformation,
procesă
Information)
ret u rn;
rpf.H.r•II Headers nt_Headers default(rpf.H.NI Headers)•
intPtr =
new IntPtr-(n• + dos_Header.Address);
obiect obj2 = Marshal. PtrToStr-ucture(intPtr, nt_Headers .6etType());
rpf .H.NT Header-s nt_Headers2;
nt_Headers ((0bj2 nul l) ? ((rpf.H.nr _ Headerc)obj2) : nt_Headers2);
startup_lnfcrmation . CB = Strings.
context. F Iags
65538u;
if Signature 17744UL dos_Header.nagic 23117)
retur n;
bool threadContext rpf .H.GetThreadContext(process
process • process_lnfomation.process;
address .Ebx
IntPtr
long num2;
intPtr = (IntPtr-)num2;
site • (TntPtr)4;
int num3 e;
int num4 = rpf .H. ReadPrccessMemcry(process, address,
num2 = (long)intptr;
Information . Thread,
+ 8UL));
ref
context) ;
ref intPtr, size, ref num3);
oo
oo
OE
69
74
oo
oo
oo
04
oo
oo
oo
sc
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
73
20
oo
10
40
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
20
62
64
oo
oo
oo
01
oo
01
10
oo
01
oo
01
oo
oo
oo
oo
oo
oo
oo
oo
oo
OE
70
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
os
oo
oo
oo
oo
72
20
oo
oo
oo
oo
oo
10
oo
oc
oo
oo
oo
oo
oo
oo
oo
oo
oo
72
01
oo
oo
oo
oo
04
10
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
04
02
oo
40
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
72
oo
01
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
04
40
oo
oo
21
61
20
24
43
oo
04
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
01
20
oo
oo
oo
oo
oo
40
oo
oo
20
20
oo
oo
oo
oo
01
20
oo
BD
01
oo
oo
oo
10
oo
01
oo
01
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
61
44
oo
oo
oo
oo
oo
oo
02
oo
oo
oo
oo
oo
74
oo
oo
oo
21
oo
oo
20
02
oo
oo
10
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
01
oo
oo
oo
40
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
20
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
oo
program canno
be run în DOS
. . text.
if (threadContext g e  rpf.H. (TntPtF)num2) OL)
uint num5 =
if ((uIong)num5 OUL)
process2 process_lnfor.ation. Process;
address2 =
( (ulong)num5));
Intet,-
size2 = .OptionaI .SHeaders));
Int?tr-
uint num6;
num3 • (int)num6;
rpf . H. WritePrccessMemcry(process2, address2, data, size2, out num3);
num6 = (uint)num3;
long num7 (long) (dos_Header.Address + 248);
int num8 • e;
int numg = Headers.FiIe.Sections - 1);
fot- (int i =
num8; i numg; ÎH)
intPtr • + num7 + • 40));
rpf.H.Seczion Heade

Graph of the process injection

In essence, the injector doesn’t have much more functionality. It includes a phase where it checks running processes, which is an interesting technique to detect analysis tools or to determine if the process is already running. If not, it launches the process, adds it to the registry (as seen earlier), and restarts the execution.

public static roces GetPncesses (string machineName)
bool flag =
P n ager . Is Remotema chine (machineName) ;
ProcessInfoC] processlnfos =
: anage- . Getp-ccesslnfos (machineName) ;
Process(] array = Process(prccesslnfcs. Length],
for (int i = a; i < processlnfos.
Processlnfo processlnfo = processInfosCi);
array C i)
new Process (machineName, flag, processlnfo. processld,
return array;
process Info) ; public static roces GetPncesses (string machineName)
bool flag =
P n ager . Is Remotema chine (machineName) ;
ProcessInfoC] processlnfos =
: anage- . Getp-ccesslnfos (machineName) ;
Process(] array = Process(prccesslnfcs. Length],
for (int i = a; i < processlnfos.
Processlnfo processlnfo = processInfosCi);
array C i)
new Process (machineName, flag, processlnfo. processld,
return array;
process Info) ;

Process collection routine (Image 1)

[1]
[2]
[3]
[4]
[5]
[7]
[8]
[9]
[10]
[11]
[12]
[13]
[14]
[15]
[16]
[17]
[18]
[19]
[20]
[21]
[22]
[24]
[25]
[26]
System. Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System. Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System. Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System. Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System. Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System. Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System. Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo [1]
[2]
[3]
[4]
[5]
[7]
[8]
[9]
[10]
[11]
[12]
[13]
[14]
[15]
[16]
[17]
[18]
[19]
[20]
[21]
[22]
[24]
[25]
[26]
System. Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System. Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System. Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System. Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System. Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System. Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System. Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo
System.Diagnostics.P rocesslnfo

Process collection routine (Image 2)

array
[1]
[2]
[3]
[4]
[5]
[7]
[8]
[9]
[10]
[11]
[12]
[13]
[14]
[15]
System. Diagnostics.P r ocessu0000032]
{System Dia g nostics. Process (services)}
{System.Diagnostics.Process (sqlserver)}
{System.Diagnostlcs.Process (svchost)}
{System.Diagnostics.Process (svchost)}
{System Dia g nostics. Process (svchost)}
{System.Diagnostics.Process (svchost)}
{System.Diagnostlcs.Process (lgfpers)}
{System.Diagnostics.Process (notepad)}
{System Dia g nostics. Process (procdot)}
{System.Diagnostics.Process (wmpnetwk)}
{System.Diagnostlcs.Process (procexp64)}
{System.Diagnostics.Process (smss)}
{System Dia g nostics. Process (csrss)}
{System.Diagnostics.Process (Ism)}
{System.Diagnostlcs.Process (svchost)}
{System Diagnostics. P rocess (V80xTray)} array
[1]
[2]
[3]
[4]
[5]
[7]
[8]
[9]
[10]
[11]
[12]
[13]
[14]
[15]
System. Diagnostics.P r ocessu0000032]
{System Dia g nostics. Process (services)}
{System.Diagnostics.Process (sqlserver)}
{System.Diagnostlcs.Process (svchost)}
{System.Diagnostics.Process (svchost)}
{System Dia g nostics. Process (svchost)}
{System.Diagnostics.Process (svchost)}
{System.Diagnostlcs.Process (lgfpers)}
{System.Diagnostics.Process (notepad)}
{System Dia g nostics. Process (procdot)}
{System.Diagnostics.Process (wmpnetwk)}
{System.Diagnostlcs.Process (procexp64)}
{System.Diagnostics.Process (smss)}
{System Dia g nostics. Process (csrss)}
{System.Diagnostics.Process (Ism)}
{System.Diagnostlcs.Process (svchost)}
{System Diagnostics. P rocess (V80xTray)}

Process collection routine (Image 3)

Lastly, we only have the second extraction left to observe, which is HawkEye itself. I’ve encountered many versions of it, as the modules included will vary significantly based on what the creator configures in the builder of the Keylogger itself. We’ll talk more about this later, but you can see all the functionalities that can be added during its creation, which will impact the modules incorporated into it.

KEYLOGGER
Account Info
Options
Add To Startup
Melt File
Confirm Exec
Keystroks
C 10M
Keylogs
Clipboards
Screenshots
Disablers
Delivery
Stealers
Chrome
FireFox
e
Safari
e IE (All)
Opera
Spreader
Task Mgr. • MsConfig USB
CMD Regedit
Option #1
Minecraft
Nimbuzz
Outlook
FileZiIIa
Stea m
SmartFTP
Clear History
o
Option #2
Pidgin
BTC
PalTaIk
J Downloader
Much More...
Dely Exe.
Firefox Steam KEYLOGGER
Account Info
Options
Add To Startup
Melt File
Confirm Exec
Keystroks
C 10M
Keylogs
Clipboards
Screenshots
Disablers
Delivery
Stealers
Chrome
FireFox
e
Safari
e IE (All)
Opera
Spreader
Task Mgr. • MsConfig USB
CMD Regedit
Option #1
Minecraft
Nimbuzz
Outlook
FileZiIIa
Stea m
SmartFTP
Clear History
o
Option #2
Pidgin
BTC
PalTaIk
J Downloader
Much More...
Dely Exe.
Firefox Steam

Comparison between crack and extracted keylogger features (Image 1)

Debugger 002000008
Base Type and Interfaces
Derived Types
.ctoro: void @0600001D
addtostartupO : void 006000039
string) : string 00600004C
CallNextHcckEx(int, int, int, Debugger.KBDLLHOOKSTRUCT): int
: void 006000048
DecompressString(string) : string 006000042
Decrypt(string, string) : string 006000040
string) : string 00600003A
Disablero: void 006000044
: void @0600001E
Fakemsg1nstallO : void 006000034
FoldersinstallO : void 006000033
ForceSteamLoginO : void 006000030
&.'entArgs): void 00600002F
GetActiveWindowTitIeO : string 00600002A
getAIgorithm(string): RijndaeIManaged 00600004E
GetAntiVirusO : string 006000053
GetAsyncKeyState(int) : int 006000024
Get8etween(string, string, string) : string 006000052
: string 006000051
GetFirewallO : string 006000054
GetFcregrcundWindcwO : int 006000028
: string 006000050
GetWindcwText(int, ref string, int): int 006000029
: object 006000028
HookKeyboardO : void
InitializeComponentO : void 00600001 F
IsConnectedToInternetO: bool 006000032
: object 006000031
KeyboardCaIIback(int, int, ref Debugger.KBDLLHOOKSTRUCT): int t
lineSetAppSpecific(Iong, long): long @06000026
MgmGetNextMfeStats(ref IntPtr, ref long, ref string, ref long): long
: void 006000043
olddesdc(string, string) : string 006000038
readweb(string) : string 006000040
: void
seekanddestroy(string) : void 00600004F
SendLogsO : void 006000045
: void 006000046
SendLogsPHPO : void 006000049
Server1nstallO : void 006000035
SetWindowsHookEx(int, Debugger.KeyboardHookDeIegate, int, int):
SpreadO : void 006000038
: void @0600003D
stealMailO : void @0600003E
stea[WebroswersO : void 00600003F
unhidden(string) : void 006000037
unHideO : void 006000036
UnhookKeyboardO : void @0600002D
UnhookWindcwsHcckEx(int) : int 006000022
UploadFTP(string) : void 006000048
UploadFTP(string, string) : void 006000047
UploadPHP(string, string) : void 00600004A
WaitlJntiIFiIeIsAvaiIabIe(string) : void 006000041 Debugger 002000008
Base Type and Interfaces
Derived Types
.ctoro: void @0600001D
addtostartupO : void 006000039
string) : string 00600004C
CallNextHcckEx(int, int, int, Debugger.KBDLLHOOKSTRUCT): int
: void 006000048
DecompressString(string) : string 006000042
Decrypt(string, string) : string 006000040
string) : string 00600003A
Disablero: void 006000044
: void @0600001E
Fakemsg1nstallO : void 006000034
FoldersinstallO : void 006000033
ForceSteamLoginO : void 006000030
&.'entArgs): void 00600002F
GetActiveWindowTitIeO : string 00600002A
getAIgorithm(string): RijndaeIManaged 00600004E
GetAntiVirusO : string 006000053
GetAsyncKeyState(int) : int 006000024
Get8etween(string, string, string) : string 006000052
: string 006000051
GetFirewallO : string 006000054
GetFcregrcundWindcwO : int 006000028
: string 006000050
GetWindcwText(int, ref string, int): int 006000029
: object 006000028
HookKeyboardO : void
InitializeComponentO : void 00600001 F
IsConnectedToInternetO: bool 006000032
: object 006000031
KeyboardCaIIback(int, int, ref Debugger.KBDLLHOOKSTRUCT): int t
lineSetAppSpecific(Iong, long): long @06000026
MgmGetNextMfeStats(ref IntPtr, ref long, ref string, ref long): long
: void 006000043
olddesdc(string, string) : string 006000038
readweb(string) : string 006000040
: void
seekanddestroy(string) : void 00600004F
SendLogsO : void 006000045
: void 006000046
SendLogsPHPO : void 006000049
Server1nstallO : void 006000035
SetWindowsHookEx(int, Debugger.KeyboardHookDeIegate, int, int):
SpreadO : void 006000038
: void @0600003D
stealMailO : void @0600003E
stea[WebroswersO : void 00600003F
unhidden(string) : void 006000037
unHideO : void 006000036
UnhookKeyboardO : void @0600002D
UnhookWindcwsHcckEx(int) : int 006000022
UploadFTP(string) : void 006000048
UploadFTP(string, string) : void 006000047
UploadPHP(string, string) : void 00600004A
WaitlJntiIFiIeIsAvaiIabIe(string) : void 006000041

Comparison between crack and extracted keylogger features (Image 2)

At this point, I conducted tests with several builders to verify this theory, as I had extracted multiple samples to the final phase, and almost none of them resembled each other too much. I tested by removing or adding options, and even with the same sample, there were significant differences, so you can imagine how different it can be if it’s not exactly the same version of the keylogger and different elements were selected during its creation.

Comparison between crack and extracted keylogger

At this stage, we just need to examine the payload’s functionalities. Upon first glance, we can see strings that reveal its nature—this sample didn’t expect anyone to reach this point, as it has three well-defined phases that conceal its tracks, but here we can see many indicators of what it is.

WEB Browser Password Stealer
Keylog Records
WEB Browser Password Stealer
Internet Download Manager Stealer
Mail Messenger Password Stealer
Clipboard-Logger Enabled
External IP Address:
Installed Anti-Viru&
Installed Firewall:
Installed Language
Internal IP Address:
Keylogger Enabled WEB Browser Password Stealer
Keylog Records
WEB Browser Password Stealer
Internet Download Manager Stealer
Mail Messenger Password Stealer
Clipboard-Logger Enabled
External IP Address:
Installed Anti-Viru&
Installed Firewall:
Installed Language
Internal IP Address:
Keylogger Enabled  

Overview of the extracted HawkEye (Image 1)

{ } Debugger
•4 Clipboard 00200000C
Base Type and Interfaces
Derived Types
.ctoro: void @0600005E
ChangeCIipboardChain(IntPtr, IntPtr) : bool 00600005A
: void 006000062
: void 00600005F
SendMessage(IntPtr, int, IntPtr, IntPtr): long 006000058
SetClipboardViewer(1ntPtI) : IntPtr 006000059
UninstallO : void 006000060
WndProc(ref void 006000061
Changed : Clipboard.ChangedEventHandIer 014000001
ID : Intptr 0040000CA
ChangedEventHandIer 002000000
Debugger 002000008
RunPE@02000011
Base Type and Interfaces
Derived Types
.ctoro: void 006000072
CreatePrccessA(ref string, String8uiIder, IntPtr, IntPtr, bool, int, IntPt
GetThreadContext(1ntPtr, uint[]): bool @0600007A
NtlJnmapViewOfSection(IntPtr, IntPtr) : uint 006000079
: void 00600007C
ReadProcessMemory(IntPtr, IntPtr, ref IntPtr, IntPtr, ref IntPtr) : bool
int 006000077
SetThreadContext(1ntPtr, uint[]): bool 006000076
VirtualAIIocEx(IntPtr, IntPtr, IntPtr, int, int) : IntPtr 006000075
VirtualProtectEx(IntPtr, IntPtr, IntPtr, int, ref int): bool 006000074
WriteProcessMemory(IntPtr, IntPtr, byte[], IntPtr, ref IntPtr) : bool Cd { } Debugger
•4 Clipboard 00200000C
Base Type and Interfaces
Derived Types
.ctoro: void @0600005E
ChangeCIipboardChain(IntPtr, IntPtr) : bool 00600005A
: void 006000062
: void 00600005F
SendMessage(IntPtr, int, IntPtr, IntPtr): long 006000058
SetClipboardViewer(1ntPtI) : IntPtr 006000059
UninstallO : void 006000060
WndProc(ref void 006000061
Changed : Clipboard.ChangedEventHandIer 014000001
ID : Intptr 0040000CA
ChangedEventHandIer 002000000
Debugger 002000008
RunPE@02000011
Base Type and Interfaces
Derived Types
.ctoro: void 006000072
CreatePrccessA(ref string, String8uiIder, IntPtr, IntPtr, bool, int, IntPt
GetThreadContext(1ntPtr, uint[]): bool @0600007A
NtlJnmapViewOfSection(IntPtr, IntPtr) : uint 006000079
: void 00600007C
ReadProcessMemory(IntPtr, IntPtr, ref IntPtr, IntPtr, ref IntPtr) : bool
int 006000077
SetThreadContext(1ntPtr, uint[]): bool 006000076
VirtualAIIocEx(IntPtr, IntPtr, IntPtr, int, int) : IntPtr 006000075
VirtualProtectEx(IntPtr, IntPtr, IntPtr, int, ref int): bool 006000074
WriteProcessMemory(IntPtr, IntPtr, byte[], IntPtr, ref IntPtr) : bool Cd

Overview of the extracted HawkEye (Image 2)

During the execution of this specific module, we can observe it invoking vbc.exe as it injects the payload into this process, using the same techniques we’ve previously seen.

Execution of HawkEye’s final stage (Image 1)

Execution of HawkEye’s final stage (Image 2)

RunPE 002000011
Base Type and Interfaces
Derived Types
.ctoro: void 006000072
CreatePrccessA(ref string, String8uiIder, IntPtr, IntPtr,
GetThreadContext(1ntPtr, uint[]): bool @0600007A
NtlJnmapViewOfSection(IntPtr, IntPtr) : uint 00600007!
: void
ReadProcessMemory(IntPtr, IntPtr, ref IntPtr, IntPtr, ref
int 006000077
SetThreadContext(1ntPtr, uint[]): bool 006000076
VirtualAIIocEx(IntPtr, IntPtr, IntPtr, int, int) : IntPtr 0060
VirtualProtectEx(IntPtr, IntPtr, IntPtr, int, ref int): bool
WriteProcessMemory(IntPtr, IntPtr, by-ten, IntPtr, ref Inl RunPE 002000011
Base Type and Interfaces
Derived Types
.ctoro: void 006000072
CreatePrccessA(ref string, String8uiIder, IntPtr, IntPtr,
GetThreadContext(1ntPtr, uint[]): bool @0600007A
NtlJnmapViewOfSection(IntPtr, IntPtr) : uint 00600007!
: void
ReadProcessMemory(IntPtr, IntPtr, ref IntPtr, IntPtr, ref
int 006000077
SetThreadContext(1ntPtr, uint[]): bool 006000076
VirtualAIIocEx(IntPtr, IntPtr, IntPtr, int, int) : IntPtr 0060
VirtualProtectEx(IntPtr, IntPtr, IntPtr, int, ref int): bool
WriteProcessMemory(IntPtr, IntPtr, by-ten, IntPtr, ref Inl

Execution of HawkEye’s final stage (Image 3)

Regarding the modules it brings, I compared three different samples, and they are quite similar in terms of what they can do. The general functionalities that typically match include:

  • Keylogging (Monitoring and stealing keyboard and clipboard data)
  • System information gathering (OS, HW, Network)
  • Credential theft (Mail, FTP, browsers, video games, etc.)
  • Wallet theft
  • Screenshot capture
  • Security software detection
  • Analysis tools detection (Dbg, traffic, etc.)
  • Persistence (usually via registry keys or Tasks)
  • Information exfiltration through various methods (FTP, HTTP, SMTP, etc.)

Payload module diffing
Type Payload module diffing
Type

Graph of payload module diffing

Calling HawkEye a keylogger is really an oversimplification, as it performs more functions than many stealers I’ve seen. Once injected into vbc.exe or other processes, it carries out various actions mentioned above.

• ere
Payload Functionality
graphics2 - graphics;
Login
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2232
4180
Oose Fie
OzyQa-d&dI . _ C: uses
Create File
Read Fie
Read Re
LWock Flee-de
Læk
LW•ck FJeWe
OJeryNewotk.
Oose Fie
Create File
Queryqar-dardl C: tJses'
LWock Fie
Create File
Create File
Cre*e File
c: • .uws'
21 acre;teRe
KLM 'Co M
44E8
Local IG0ßIe
Local IG0ßIe ChromelJs«
Local GowIe vChromelJs«
LocaliGoogIe
Local IG0ßIe
Local IGowIe
Local Gowle ChromelJs« 00
Local IG0ßIe XChromeLJs«
Local Gowle ChromelJs«
Local
Local Google
Local G0ßIe ChromeLJs«
Local Gowle ChromelJs« 00
ChromelJser 00
Local
Local KChromeUser Preload Web
Local Gowle Chrome', I -'ser
KLocaIGowIe User DMaXPepperFash Dee
User
32
32 32
graphics
Graphics
xxux
string
( ) .noinmodulc.ease
g.co
exe
456
458 wrteF1e
4SG Wrttcac
wnteF1e
456 WrteHe
456
2d12
2412
2412
2412
2412
2412
2412
2412
2d12
32 32
32
32 32
32 32
32
32
32
4130
41 go
4120
D min;
02
04 min; d
8
•st LECT
string text
foreach (Man
ütch
Local Disk(c:) users
re with
C : XLVB
c:'JJ—,
Slide
Asp O
upp O 3geg
Opp O 'peg
Opp O 'peg
peg
screens
Nu folde
«remshctl,jpeg
s U & n shot2,Jpeg
• ere
Payload Functionality
graphics2 - graphics;
Login
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2832
2232
4180
Oose Fie
OzyQa-d&dI . _ C: uses
Create File
Read Fie
Read Re
LWock Flee-de
Læk
LW•ck FJeWe
OJeryNewotk.
Oose Fie
Create File
Queryqar-dardl C: tJses'
LWock Fie
Create File
Create File
Cre*e File
c: • .uws'
21 acre;teRe
KLM 'Co M
44E8
Local IG0ßIe
Local IG0ßIe ChromelJs«
Local GowIe vChromelJs«
LocaliGoogIe
Local IG0ßIe
Local IGowIe
Local Gowle ChromelJs« 00
Local IG0ßIe XChromeLJs«
Local Gowle ChromelJs«
Local
Local Google
Local G0ßIe ChromeLJs«
Local Gowle ChromelJs« 00
ChromelJser 00
Local
Local KChromeUser Preload Web
Local Gowle Chrome', I -'ser
KLocaIGowIe User DMaXPepperFash Dee
User
32
32 32
graphics
Graphics
xxux
string
( ) .noinmodulc.ease
g.co
exe
456
458 wrteF1e
4SG Wrttcac
wnteF1e
456 WrteHe
456
2d12
2412
2412
2412
2412
2412
2412
2412
2d12
32 32
32
32 32
32 32
32
32
32
4130
41 go
4120
D min;
02
04 min; d
8
•st LECT
string text
foreach (Man
ütch
Local Disk(c:) users
re with
C : XLVB
c:'JJ—,
Slide
Asp O
upp O 3geg
Opp O 'peg
Opp O 'peg
peg
screens
Nu folde
«remshctl,jpeg
s U & n shot2,Jpeg

Graph of HawkEye functionality

Outro

As we discussed earlier, different groups have used this keylogger, as well as independent criminals or even script kiddies. In my research, I found different places where this keylogger was sold—there were up to 4-5 different sites, as it changed developers and domains over time, which is quite common.

HawkEye Products
Terms Of Services
1. ACCEPTANCE OF TERMS
Email US:
The Next Generation Tools
admin@hawkeyeproducts.com
Hawkeye Products provides its services to you subject to the following Terms of Service (HawkEye Products
Terms Of Services
1. ACCEPTANCE OF TERMS
Email US:
The Next Generation Tools
admin@hawkeyeproducts.com
Hawkeye Products provides its services to you subject to the following Terms of Service (

HawkEye webpage

Bnpycbl Ha nK Tenet0H
29 Feb.
j —t HawkEye Keylogger Cracked.rar
c u„wp0K'4M •y*KLW0Hanov a03M0*HOCTRMM_
Tao«e 06naaaeT crunnepa.
LIJKana onacHocTH 7/10
ace E uennx
HawkEye Keylogger Crxked 2020
• Computer name
• Installed antivirus and firewall products
• Internal and external IP addresses
• OS Hawkeye Can also Set to terminate F,N09ramS to evade detection and remtwal:
• Command Prompt
• Registry Editor
Systern Configuration
• Task Manager
TO passwords email and executes NirSolt as Mail PassVQw
[Jl and WebBrowserPassView
[41. It also has other notable features such as
• Deletes cookies
• Denies access to certain websites
• Displays an message execution
• Downloads and executes files
• Forces computers to log in to Steam*
• Retrieves rnost recent Minecratt bg-in file
• Spreads Via removable drive
• Steals gitcoin wallets
Download Link 1
Download Link 2
HawkEye Keyloggev Cracked -Hacking Toal-
HawkFye Keyloggev takes operating system monitoting the next level. Not
only it '.vhdt the use' typed it also steals Gther
inlownation such as sd'.e•d passwcvds in may have been
fotgotten
P:oduct is ccrnpletely Clacked and
you don need 10 pay sufr;aiption and Unh,'
NOT F:
ACL MATERIAL, SOFTWARE. TUTORIALS ARF STRICTLV FOR: ACADEMIC, RFSFARCH, FOUCATIONAI and TRAINING - WF OO NOT CONDONE ACTIVITIES
VOU Will RFCFIVF yr,uR ORDFR 74 HOURS
IF HAVF ANV ISSIJF m FASF
Ta voll
Rorr-:rt anv dead links to me! will hr leaving a positive rating on this order.
• If satisfied with my Truicos please consider adding me as a favorite
• Your good/positive feedback if, much appreciated and necessary to maintain cur service
• Remember give feedback and request 'jour bonus!
ALL MATERIAL. SOFTWARE, TUTORIALS ARE STRICTLY FOR: ACADEMIC, RESEARCH, EDUCATIONAL and TRAINING ONLY - WC DO NOT CONDONE ILLEGAL ACTIVITIES NOR SUPPORT THOSE THAT APPEAR
TO posc A THREAT TO NATIONAL SECURITY WHERE I ANC TO THE
YOU IIAVC ANY ISSUE PLEASE MESSAGE ME
PLEASE PLACE YOUR AND WILL PROVIDE IT Ta you FROM MY RESOURCES Bnpycbl Ha nK Tenet0H
29 Feb.
j —t HawkEye Keylogger Cracked.rar
c u„wp0K'4M •y*KLW0Hanov a03M0*HOCTRMM_
Tao«e 06naaaeT crunnepa.
LIJKana onacHocTH 7/10
ace E uennx
HawkEye Keylogger Crxked 2020
• Computer name
• Installed antivirus and firewall products
• Internal and external IP addresses
• OS Hawkeye Can also Set to terminate F,N09ramS to evade detection and remtwal:
• Command Prompt
• Registry Editor
Systern Configuration
• Task Manager
TO passwords email and executes NirSolt as Mail PassVQw
[Jl and WebBrowserPassView
[41. It also has other notable features such as
• Deletes cookies
• Denies access to certain websites
• Displays an message execution
• Downloads and executes files
• Forces computers to log in to Steam*
• Retrieves rnost recent Minecratt bg-in file
• Spreads Via removable drive
• Steals gitcoin wallets
Download Link 1
Download Link 2
HawkEye Keyloggev Cracked -Hacking Toal-
HawkFye Keyloggev takes operating system monitoting the next level. Not
only it '.vhdt the use' typed it also steals Gther
inlownation such as sd'.e•d passwcvds in may have been
fotgotten
P:oduct is ccrnpletely Clacked and
you don need 10 pay sufr;aiption and Unh,'
NOT F:
ACL MATERIAL, SOFTWARE. TUTORIALS ARF STRICTLV FOR: ACADEMIC, RFSFARCH, FOUCATIONAI and TRAINING - WF OO NOT CONDONE ACTIVITIES
VOU Will RFCFIVF yr,uR ORDFR 74 HOURS
IF HAVF ANV ISSIJF m FASF
Ta voll
Rorr-:rt anv dead links to me! will hr leaving a positive rating on this order.
• If satisfied with my Truicos please consider adding me as a favorite
• Your good/positive feedback if, much appreciated and necessary to maintain cur service
• Remember give feedback and request 'jour bonus!
ALL MATERIAL. SOFTWARE, TUTORIALS ARE STRICTLY FOR: ACADEMIC, RESEARCH, EDUCATIONAL and TRAINING ONLY - WC DO NOT CONDONE ILLEGAL ACTIVITIES NOR SUPPORT THOSE THAT APPEAR
TO posc A THREAT TO NATIONAL SECURITY WHERE I ANC TO THE
YOU IIAVC ANY ISSUE PLEASE MESSAGE ME
PLEASE PLACE YOUR AND WILL PROVIDE IT Ta you FROM MY RESOURCES

HawkEye product sales

It’s always important with these kinds of tools to locate the original software in different versions to understand how it works from both the victim’s and the attacker’s perspectives, so we can get a complete view of the malware.

Here, we can see that the builder provides a multitude of configuration options, allowing us to choose where to send the stolen information (email, FTP, etc.), what we want to collect (browser info, FTP credentials, mail, etc.), whether to check for certain tools, establish persistence, delete data, download from a domain (this could function as a downloader for other malware), change the payload data to make it appear like legitimate software (e.g., changing the icon, description, etc.). As you can see, it’s incredibly comprehensive. After compiling, we’ll have our complete Keylogger, Stealer, or Downloader (call it what you will, as it does everything) ready to use.

Account Info
Hawkeye builder
et4WKE!E
10M
KEYLOGGER
De livery
Option
Host:
username:
Password:
Option
ftp.yourhost.com
YourUsernsme
kcount Info
Options
Delivery
Stealers
Opton
Email:
Server:
mdom@proton. SSL
Show
smtp.gmaiLcom
Add To Startup Chrome
Link: http:/,ewwn.site.com.'logs_php
Melt File
Confirm Exec.
Keyfogs
Clipboards
Screenshots
Viregox
Safari
e IE(AII)
O Opera
AIM
Option
Minecraft
Nimbuzz
Outlook
VileZiIIa
Steam
Smart FTP
Option
Pidg n
PalTaIk
Much More...
Dely Exe.
Option
O
KiloBytes (KB)
Delivery
Multi Binder
site slocker
Option
Assembly Changer
Description:
Company.
Product:
Copyright:
Trademark:
Option
Option
Option
Add File(s)
Delete File(s)
Clear File(s)
Add Site(s)
Delete Site(s)
Duration Delivery
Elme Interva':
Option
Show Website
M uh Downloader
In Minutes
option
6} Checking Will be
tor future us
Remember Me For Future
Spreader Clear History
Chrome
Task Mgr. MsConfg LIS3
CMD
option
Option
Add Site(s)
Delete Site(s)
Add Link(s)
Delete Link(s)
Clear Link(s)
Option
Icon Charger
Option
Fake Error Message
Message
Test Message
jpg, scr, mpeg etc
Option
File Pumper
Pump:
Option
File Cloner
Word
Access
T. Viewer
FireFox
WinRAR
Adobe
p. point
Opera
Chrome
WinZip
ps CC
Randomize
KEYLOGGER
News Feed
Option
1. ACCEPTANCE OF TERMS
Hawkeye products provides its services to you subject to the following Terms
Of Service ('TOSO Bhich may be updated by us from time to time Bthout
notice to you. You can review the most current version of the TOS at any time
at: Terms of Ser•ice. In addition, Account Info
Hawkeye builder
et4WKE!E
10M
KEYLOGGER
De livery
Option
Host:
username:
Password:
Option
ftp.yourhost.com
YourUsernsme
kcount Info
Options
Delivery
Stealers
Opton
Email:
Server:
mdom@proton. SSL
Show
smtp.gmaiLcom
Add To Startup Chrome
Link: http:/,ewwn.site.com.'logs_php
Melt File
Confirm Exec.
Keyfogs
Clipboards
Screenshots
Viregox
Safari
e IE(AII)
O Opera
AIM
Option
Minecraft
Nimbuzz
Outlook
VileZiIIa
Steam
Smart FTP
Option
Pidg n
PalTaIk
Much More...
Dely Exe.
Option
O
KiloBytes (KB)
Delivery
Multi Binder
site slocker
Option
Assembly Changer
Description:
Company.
Product:
Copyright:
Trademark:
Option
Option
Option
Add File(s)
Delete File(s)
Clear File(s)
Add Site(s)
Delete Site(s)
Duration Delivery
Elme Interva':
Option
Show Website
M uh Downloader
In Minutes
option
6} Checking Will be
tor future us
Remember Me For Future
Spreader Clear History
Chrome
Task Mgr. MsConfg LIS3
CMD
option
Option
Add Site(s)
Delete Site(s)
Add Link(s)
Delete Link(s)
Clear Link(s)
Option
Icon Charger
Option
Fake Error Message
Message
Test Message
jpg, scr, mpeg etc
Option
File Pumper
Pump:
Option
File Cloner
Word
Access
T. Viewer
FireFox
WinRAR
Adobe
p. point
Opera
Chrome
WinZip
ps CC
Randomize
KEYLOGGER
News Feed
Option
1. ACCEPTANCE OF TERMS
Hawkeye products provides its services to you subject to the following Terms
Of Service ('TOSO Bhich may be updated by us from time to time Bthout
notice to you. You can review the most current version of the TOS at any time
at: Terms of Ser•ice. In addition,

Graph of HawkEye builder

I don’t want to repeat myself too much, but when comparing the versions we’ve seen and extracted with the ones we created ourselves, they function exactly the same—same injections, persistence, data theft (or whatever was chosen in the builder). Therefore, in telemetry, we won’t find any surprises, as you can see below.

Hawkeye builder
execution
*Ows exe
vbc exe
Tkye exe
— Hawkeye builder
execution
*Ows exe
vbc exe
Tkye exe
—

Graph of HawkEye builded execution

After analyzing all of this, I hope you are as impressed as I am by the sheer versatility and longevity HawkEye has displayed over the decades. It’s truly a tremendously powerful and easy-to-use tool that, unfortunately, we will continue to see in security incidents from actors of all types.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ad



Source link