StackZero
  • Homepage
  • Cryptography and Privacy
  • Ethical Hacking
  • Reverse Engineering
  • Contacts
  • About Me
No Result
View All Result
StackZero
No Result
View All Result

How To Do Process Enumeration: An Alternative Way

March 4, 2024
in Reverse Engineering
0 0
How To Do Process Enumeration: An Alternative Way
0
SHARES
207
VIEWS
Share on FacebookShare on Twitter

Process enumeration is a technique used by malware to identify and analyze running processes in a system and in this article we are going to see an alternative one.
It’s a critical step for malware that aims to inject its code into legitimate processes, thereby avoiding detection.
This technique allows malware to blend with normal system operations, making it difficult for security software and analysts to identify the threat.

Malware developers often employ different enumeration methods as a way to camouflage their malicious code.
However, cybersecurity experts are aware of this tactic and look for signs of such activities. Knowing this, malware developers are constantly seeking new and more sophisticated methods of process enumeration to stay ahead of security measures.

The concept of alternative process enumeration is not entirely new, but it evolves with advancements in malware technology. I found a nice approach to this method in a micro paper from VX Underground. It represents a refined way for malware to perform process enumeration, making it even more challenging for analysts to detect.

For malware analysts, understanding these methods is crucial. It helps them develop better strategies and tools to identify and counteract such tactics. So the message of the article is that as malware analysts, we need to stay informed about the latest developments in malware techniques.

Table of Contents

Toggle
  • Understanding Process Enumeration in Malware Analysis
  • The EnumWindows and EnumDesktopWindows API
  • The EnumWindowsProcesses Callback
  • Delineating Differences: Micropaper vs. Article Approach
  • The Callback: Exploring the Core Function
  • The Main: Setting the Stage for Process Enumeration
  • Conclusion

Understanding Process Enumeration in Malware Analysis

Process enumeration in malware refers to a method where the malware scans and identifies active processes on a host system. This technique serves two primary purposes:

  • First, it helps the malware find a suitable process to inject its malicious code into. This is crucial for the malware to integrate seamlessly into the system without being easily detected (you can see how enumeration is used in our dedicated articles: DLL Injection and Process Injection).
  • Second, it assists the malware in determining an environment that allows it to operate undetected. Here, the malware assesses the system to find the most conducive conditions for its survival and functioning. For example, it can try to check for the presence of a debugger software.

At its heart, process enumeration is about being stealthy and efficient. Malware developers design their programs to carry out this task in a way that’s both unnoticeable and uses minimal resources. This stealth is achieved through the malware querying the operating system for a list of running processes, and then selecting the most suitable ones for code injection. The selection is based on criteria such as the process’s privileges, its stability, and the extent of monitoring by security software.

The knowledge of each variant enables malware analysts to devise more effective strategies for detecting and neutralizing threats. By identifying the patterns and techniques used in process enumeration, they can pinpoint potential vulnerabilities and fortify their systems against such intrusions.

Furthermore, this understanding is instrumental in developing advanced security protocols and tools. These tools are designed to closely monitor process behaviours, detecting anomalies that could indicate attempts at process enumeration. Staying ahead in recognizing these tactics equips malware analysts to better protect systems and data against cyber threats.

The EnumWindows and EnumDesktopWindows API

  • EnumWindows: API is designed to enumerate all top-level windows on the screen. This function works by passing every top-level window handle to an application-defined callback function. This is particularly useful for malware that needs to identify active applications, gather window titles for potential target processes, or even find a specific application’s window to carry out UI-based attacks.
  • EnumDesktopWindows is more specific in its scope. This API enumerates all top-level windows associated with a particular desktop – typically the one that is currently active. It’s crucial for malware that targets specific user environments or applications running within a particular desktop context. For example, if malware is designed to operate or inject code in a corporate environment, it could be used EnumDesktopWindows to identify and target applications commonly used in such settings.

From a malware analyst’s perspective, monitoring the usage of these APIs can be a key indicator of suspicious activity. Malware may use these functions to scout for potential injection targets or gather information about the user’s environment. Thus, security tools and analysts often keep a close watch on the invocation of these APIs, as their misuse can be a red flag indicating potential malicious activity. By understanding how EnumWindows and EnumDesktopWindows are utilized, malware analysts can better anticipate and mitigate tactics employed by malware, enhancing overall system security.

The EnumWindowsProcesses Callback

Both the functions we presented need a callback as an argument: EnumWindowsProc.

The EnumWindowsProc callback function is a crucial component when working with the EnumWindows or EnumDesktopWindows functions. It acts as a direct inspector of each top-level window presented by these APIs.

Let’s break down its structure and purpose. As the documentation suggests, this is the syntax:

BOOL CALLBACK EnumWindowsProc(
  _In_ HWND   hwnd,
  _In_ LPARAM lParam
);
  • The hwnd parameter here is a handle for each top-level window that the function evaluates. It’s the unique identifier for windows in the system.
  • The lParam parameter, on the other hand, is an application-defined value. It’s used by the function for additional context or information as needed during the window examination process.

The function’s return value is straightforward yet critical.

  • If EnumWindowsProc returns TRUE, it indicates the continuation of the enumeration process, signalling the function to keep inspecting further windows.
  • If it returns FALSE, the enumeration stops. This could either mean that the function has found a window of interest or that it has completed its task.

Before this function can be put to use, it needs to be registered. This registration process involves passing the function’s address to either EnumWindows or EnumDesktopWindows. This step is essential for the function to operate within the Windows environment.

In essence, EnumWindowsProc serves as a functional tool within Windows programming, enabling developers to specify how each top-level window should be processed. Whether for identifying potential process injection targets or other application-specific purposes, this function provides a structured and efficient way to examine windows in the operating system.

Delineating Differences: Micropaper vs. Article Approach

The original micro paper and our expanded article exhibit key differences in approach, particularly in the context of ‘alternative process injection’. Primarily, the micropaper utilizes the GetProcessImageFilenameW function within its code. This function needs parsing to compare with a target process name and extract only the filename, a crucial step for identifying a specific process. In contrast, our article shifts the focus to spotting a particular process more directly.

Furthermore, the original micropaper doesn’t detail how to obtain the process handle from the callback function. Our article aims to bridge this gap. It will illustrate how to effectively use the lParam parameter within the callback function. This involves passing the name of the process and storing the handle for later retrieval in the main body of the code.
This added explanation is vital for understanding the complete mechanism of process enumeration and handle retrieval, offering a more comprehensive guide to those delving into the intricacies of alternative process injection techniques.

The Callback: Exploring the Core Function

In this part of our discussion on ‘alternative process injection’, we’re diving into the heart of the callback function, specifically how it identifies and returns the handle to a desired process. The function, EnumWindowsProc, is defined as follows:

BOOL CALLBACK EnumWindowsProc(IN HWND hwnd, IN LPARAM lParam ) {

	DWORD dwPID;
	TCHAR wcName[MAX_NAME_SIZE];
	HMODULE hModule;
	DWORD dwCbNeeded;
	ProcessInfo* targetProcessInfo = (ProcessInfo*)(lParam);
	
	if(GetWindowThreadProcessId(hwnd, &dwPID))
	{

		HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwPID);
		
			if (hProcess != NULL)
			{
				if (EnumProcessModules(hProcess, &hModule, sizeof(hModule), &dwCbNeeded))
				{
					GetModuleBaseName(hProcess, hModule, wcName, sizeof(wcName)/sizeof(TCHAR));
					if(_tcsicmp(wcName, targetProcessInfo->target) == 0)
					{
						targetProcessInfo->hProcess = hProcess;
						return FALSE;
					}


				}
				else {
					CloseHandle(hProcess);
				}
			
		}
			else {
				_tprintf(_T("Error in OpenProcess: %d\n"), GetLastError());
			}
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

Inside this function, our primary goal is to locate a specific process and then capture its handle. We start by defining variables like dwPID for the process ID, wcName for the process name, and hModule, which will be used in the module enumeration.

The real action begins with GetWindowThreadProcessId. This function retrieves the process ID associated with the window handle hwnd. If this succeeds, we proceed to open the process for query and reading. This is where OpenProcess comes into play.

Once we have access to the process, EnumProcessModules helps us get the first module of the process, essentially giving us a snapshot of the process’s executable. We then use GetModuleBaseName to get the name of this module (or the process).

The critical comparison happens next. We check if the retrieved process name matches our target process, defined in targetProcessInfo->target. If it’s a match, we store the process handle in targetProcessInfo->hProcess and return FALSE to stop the enumeration.

If we don’t find a match, or if there’s an error in opening the process (for example we cannot open processes that are running with higher privileges than our program), we continue the enumeration by returning TRUE. This makes the function keep looking through other windows until it finds the target process or runs out of windows to check.

In essence, this callback function is a systematic way to iterate through processes, pinpoint the desired one, and retrieve its handle, which is a critical step in the process of alternative process injection.

The Main: Setting the Stage for Process Enumeration

Now, let’s walk through the main function, which sets the stage for our exploration of ‘alternative process injection’. The main function in our code looks like this:

int main()
{


	ProcessInfo targetProcessInfo = { NULL, _T("notepad.exe") };
	_tprintf(_T("Initial process handle: %p, process name: %ws\n"), targetProcessInfo.hProcess, targetProcessInfo.target);

	EnumWindows(EnumWindowsProc, (LPARAM)&targetProcessInfo);

	if (targetProcessInfo.hProcess != NULL) {
		_tprintf(_T("Found process handle: %p, process name: %ws\n"), targetProcessInfo.hProcess, targetProcessInfo.target);
		CloseHandle(targetProcessInfo.hProcess); // Close the handle when done
	}
	else {
		_tprintf(_T("Process not found\n"));
	}

	return 0;

}

Here’s what’s happening in simple terms. First, we create a ProcessInfo structure named targetProcessInfo. This structure is crucial as it holds the handle (initially NULL) and the name of the process we’re looking for, in this case, notepad.exe.

We then print the initial state of targetProcessInfo, showing that at this point, we don’t have a handle for our target process yet.

The critical function call here is EnumWindows(EnumWindowsProc, (LPARAM)&targetProcessInfo);. This line is where we invoke the enumeration of windows. We pass in our EnumWindowsProc function and a pointer to targetProcessInfo as arguments. Essentially, we’re starting our search for the notepad.exe process among all the top-level windows.

After EnumWindows completes its run, we check if targetProcessInfo.hProcess is no longer NULL. If it’s not, it means we successfully found our target process, and we print the obtained process handle. This is a key moment, as it confirms the successful identification and handling of the target process.

Finally, if we find the process, we responsibly close the handle using CloseHandle(targetProcessInfo.hProcess). It’s important to close handles when we’re done with them to avoid resource leaks. If we didn’t find the process, we simply printed a message stating that the process was not found.

In conclusion, the main function in this scenario is responsible for initiating the process enumeration and handling the outcome, whether that’s successfully finding the target process or not finding it. This function essentially sets the entire process enumeration operation in motion.

Conclusion

So far, we have explored the process enumeration in Windows programming, particularly focusing on the EnumWindowsProc callback function within the EnumWindows API. We’ve demonstrated how this function navigates through each top-level window to identify a specific process returning its handle.
By dissecting the callback and main functions, we unveil tools from the attacker’s arsenal, enabling you as a defender to anticipate and counter malicious tactics effectively.

Understanding these mechanisms is vital for anyone in cybersecurity, whether enhancing security protocols, developing robust software, or simply staying ahead in the tech game.
We hope this article has expanded your understanding of malware developers’ minds.
Don’t miss out on the latest developments by following our blog and social media. Join our community of cybersecurity enthusiasts committed to staying ahead in understanding and countering contemporary cyber threats.

Tags: application securitycybersecuritymalwaremalware analysismalware evasionreverse engineering
Previous Post

How To Do DLL Injection: An In-Depth Cybersecurity Example

Next Post

Malware Obfuscation Techniques: All That You Need To Know

Next Post
Malware Obfuscation Techniques: All That You Need To Know

Malware Obfuscation Techniques: All That You Need To Know

You might also like

Cryptographic functions

Cryptographic Hash Functions in Python: Secure Your Data Easily

November 3, 2024
Malware Obfuscation Techniques: All That You Need To Know

Malware Obfuscation Techniques: All That You Need To Know

March 25, 2024
How To Do Process Enumeration: An Alternative Way

How To Do Process Enumeration: An Alternative Way

March 4, 2024
How To Do DLL Injection: An In-Depth Cybersecurity Example

How To Do DLL Injection: An In-Depth Cybersecurity Example

February 8, 2024
Process Injection By Example: The Complete Guide

Process Injection By Example: The Complete Guide

January 24, 2024
How To Build Your Own: Python String Analysis for Malware Insights

How To Build Your Own: Python String Analysis for Malware Insights

November 10, 2023

StackZero

StackZero is a specialized technical blog dedicated to the realm of cybersecurity. It primarily provides insightful articles and comprehensive tutorials designed to educate readers on developing security tools. The blog encompasses a broad spectrum of subjects, starting from the foundational principles of cryptography and extending to more sophisticated areas such as exploitation and reverse engineering. This makes StackZero an invaluable resource for both beginners and professionals in the field of cybersecurity.
The blog covers a wide range of topics, from the basics of cryptography to the more advanced topics of exploitation and reverse engineering.

Tags

application security blind sqli blind sql injection bruteforce c cesar cipher command injection cryptography ctf cybersecurity debugging dom-based xss dvwa ethical-hacking ethical hacking exploitation file inclusion gdb hacking injection javascript malware malware analysis malware evasion network-security pentesting lab picoctf pico ctf python reflected xss reverse engineering sql sqli sql injection static analysis stored xss substitution substitution cipher vulnerable application web application security web exploitation web security windows windows api xss
  • About Me
  • Contacts
  • HomePage
  • Opt-out preferences
  • Privacy Policy
  • Terms and Conditions

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
Manage Cookie Consent
To provide the best experiences, we use technologies like cookies to store and/or access device information. Consenting to these technologies will allow us to process data such as browsing behavior or unique IDs on this site. Not consenting or withdrawing consent, may adversely affect certain features and functions.
Functional Always active
The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
Preferences
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
Statistics
The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.
Manage options Manage services Manage {vendor_count} vendors Read more about these purposes
View preferences
{title} {title} {title}
No Result
View All Result
  • Homepage
  • Cryptography and Privacy
  • Ethical Hacking
  • Reverse Engineering
  • Contacts
  • About Me