Malware/malware analysis

[Qakbot ๋ถ„์„ (5)] C2 ํ†ต์‹  ๊ณผ์ •๊ณผ ํƒ์ง€ ํšŒํ”ผ ๋ฐ ์ง€์†์„ฑ ํ™•๋ณด

์œค์ •_ 2025. 2. 14. 14:58

Qakbot ์•…์„ฑ์ฝ”๋“œ ๋ถ„์„ ๋งˆ์ง€๋ง‰ ํฌ์ŠคํŒ…์ž…๋‹ˆ๋‹ค.

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์•…์„ฑ์ฝ”๋“œ๊ฐ€ C2 ํ†ต์‹ ํ•˜๋Š” ๊ณผ์ •๊ณผ ํƒ์ง€ ํšŒํ”ผ ๋ฐ ์ง€์†์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ถ„์„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ ํ•ด์‹œ(SHA256)๋Š” 73e4969db4253f9aeb2cbc7462376fb7e26cc4bb5bd23b82e2af0eaaf5ae66a8์ž…๋‹ˆ๋‹ค.

 

 

 

[๊ณต๊ฐœํ‚ค ๋ณตํ˜ธ]

๋ถ„์„ ์ค‘ ์•…์„ฑ์ฝ”๋“œ๊ฐ€ Crypto API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ์„œ๋ธŒ๋ฃจํ‹ด์ธ sub_100084AF์— ๋“ค์–ด๊ฐ€๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

sub_100084AF

 

sub_100084AF ์„œ๋ธŒ๋ฃจํ‹ด ๋‚ด๋ถ€์—์„œ ์•”ํ˜ธ ๊ด€๋ จ API๋“ค์„ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • CryptDecodeObjectEx
    • ์ฃผ์–ด์ง„ ์ธ์ฝ”๋”ฉ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ •๋œ ๊ตฌ์กฐ์ฒด ํ˜•์‹์œผ๋กœ ๋””์ฝ”๋”ฉํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

  • CryptDecodeObjectEx ํ•จ์ˆ˜ ๊ตฌ์กฐ
BOOL CryptDecodeObjectEx(
  DWORD		      dwCertEncodingType,	// ์ธ์ฝ”๋”ฉ ํƒ€์ž… ์ง€์ •
  LPCSTR	      lpszStructType,		// ๋””์ฝ”๋”ฉํ•  ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ์ฒด ํ˜•์‹ ์ง€์ •
  const BYTE	      *pbEncoded,		// (๋””์ฝ”๋”ฉํ• ) ์ธ์ฝ”๋”ฉ๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ
  DWORD		      dwEncodedSize,		// ์ธ์ฝ”๋”ฉ๋œ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ
  DWORD		      dwFlags,			// ๋””์ฝ”๋”ฉ ์ž‘์—… ๊ด€๋ จ ์ž‘์—… (ex. ๋ฉ”๋ชจ๋ฆฌ ์ž๋™ ํ• ๋‹น ์—ฌ๋ถ€, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์—ฌ๋ถ€ ๋“ฑ)
  PCRYPT_DECODE_PARA  pDecodePara,		// ๋””์ฝ”๋”ฉ ์ž‘์—…์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด
  void		      *pvStructInfo,		// ๋””์ฝ”๋”ฉ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๊ตฌ์กฐ์ฒด์˜ ํฌ์ธํ„ฐ
  DWORD		      *pdwStructInfo		// ๋ฐ˜ํ™˜๋  ๊ตฌ์กฐ์ฒด์˜ ํฌ๊ธฐ(๋ณ€์ˆ˜)์˜ ํฌ์ธํ„ฐ
);

 

  • CryptAcquireContext
    • ์•”ํ˜ธํ™” ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœ๋ฐ”์ด๋”(CSP)๋ฅผ ํš๋“ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

  • CryptAcquireContext ํ•จ์ˆ˜ ๊ตฌ์กฐ
BOOL CryptAcquireContext(
  HCRYPTPROV *phProv,             // ํ”„๋กœ๋ฐ”์ด๋” ํ•ธ๋“ค
  LPCSTR     pszContainer,        // ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„ (NULL์ด๋ฉด ๊ธฐ๋ณธ ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์šฉ)
  LPCSTR     pszProvider,         // ํ”„๋กœ๋ฐ”์ด๋” ์ด๋ฆ„ (NULL์ด๋ฉด ๊ธฐ๋ณธ ํ”„๋กœ๋ฐ”์ด๋” ์‚ฌ์šฉ)
  DWORD      dwProvType,          // ํ”„๋กœ๋ฐ”์ด๋” ์œ ํ˜•
  DWORD      dwFlags              // ํ”Œ๋ž˜๊ทธ
);

 

  • CryptImportPublicKeyInfo
    • ๊ณต๊ฐœ ํ‚ค ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ(import) ์‚ฌ์šฉ
    • ์ฃผ๋กœ X.509 ์ธ์ฆ์„œ์—์„œ ๊ณต๊ฐœ ํ‚ค๋ฅผ ์ถ”์ถœํ•˜์—ฌ ์ด๋ฅผ ์•”ํ˜ธํ™” ์ž‘์—…์— ์‚ฌ์šฉ

  • CryptImportPublicKeyInfo ํ•จ์ˆ˜ ๊ตฌ์กฐ
BOOL CryptImportPublicKeyInfo(
  DWORD          	 dwCertEncodingType,	// ์ธ์ฝ”๋”ฉ ํƒ€์ž…
  PCERT_PUBLIC_KEY_INFO  pki,			// ๊ณต๊ฐœ ํ‚ค ์ •๋ณด ๊ตฌ์กฐ์ฒด
  HCRYPTKEY   	  	 *phKey			// ๋ฐ˜ํ™˜๋  ๊ณต๊ฐœ ํ‚ค ํ•ธ๋“ค
);

 

  • CryptCreateHash
    • ํ•ด์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

  • CryptCreateHash ํ•จ์ˆ˜ ๊ตฌ์กฐ
BOOL CryptCreateHash(
  HCRYPTPROV *phProv,      // ํ”„๋กœ๋ฐ”์ด๋” ํ•ธ๋“ค
  ALG_ID      Algid,       // ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹๋ณ„์ž
  HCRYPTKEY   hKey,        // (์„ ํƒ ์‚ฌํ•ญ) ์•”ํ˜ธํ™” ํ‚ค (์ผ๋ถ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋งŒ ํ•„์š”)
  DWORD       dwFlags,     // ํ”Œ๋ž˜๊ทธ (์˜ˆ: CryptCreateHash ๋™์ž‘ ์ œ์–ด)
  HCRYPTHASH  *phHash      // ํ•ด์‹œ ๊ฐ์ฒด ํ•ธ๋“ค (์ถœ๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ)
);

 

  • CryptHashData
    • ํ•ด์‹œ ๊ฐ์ฒด์— ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ํ•ด์‹œ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

  • CryptHashData ํ•จ์ˆ˜ ๊ตฌ์กฐ
BOOL CryptHashData(
  HCRYPTHASH  hHash,        // ํ•ด์‹œ ๊ฐ์ฒด ํ•ธ๋“ค
  const BYTE  *pbData,      // ํ•ด์‹ฑํ•  ๋ฐ์ดํ„ฐ
  DWORD       dwDataLen,    // ๋ฐ์ดํ„ฐ ๊ธธ์ด
  DWORD       dwFlags       // ํ”Œ๋ž˜๊ทธ
);

 

  • CryptVerifySignatureA
    • ๋””์ง€ํ„ธ ์„œ๋ช… ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

  • CryptVerifySignatureA ํ•จ์ˆ˜ ๊ตฌ์กฐ
BOOL CryptVerifySignatureA(
  PCCERT_CONTEXT    pCertContext,    // ์„œ๋ช…์ž ์ธ์ฆ์„œ์˜ ์ปจํ…์ŠคํŠธ
  const BYTE        *pbSignature,    // ๋””์ง€ํ„ธ ์„œ๋ช…
  DWORD             dwSigLen,        // ์„œ๋ช…์˜ ๊ธธ์ด
  const BYTE        *pbData,         // ์„œ๋ช… ๊ฒ€์ฆ ๋Œ€์ƒ ๋ฐ์ดํ„ฐ
  DWORD             dwDataLen,       // ๊ฒ€์ฆ ๋Œ€์ƒ ๋ฐ์ดํ„ฐ์˜ ๊ธธ์ด
  LPCSTR            szProvider       // (์„ ํƒ ์‚ฌํ•ญ) ํ”„๋กœ๋ฐ”์ด๋” ์ด๋ฆ„
);

 

 

sub_100084AF ์„œ๋ธŒ๋ฃจํ‹ด์€ Crypto API๋ฅผ ์ด์šฉํ•˜์—ฌ C2 ํ†ต์‹ ๊ณผ ๊ด€๋ จ๋œ ๊ณต๊ฐœ ํ‚ค๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  36๋ฒˆ์งธ ์ค„์—์„œ๋Š” ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด๋“ค์„ XOR ์—ฐ์‚ฐํ•ฉ๋‹ˆ๋‹ค. XOR ์—ฐ์‚ฐ๋˜๋Š” ์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ mw_encrypted_string_1๋Š” .data ์„น์…˜์— ์ €์žฅ๋˜์–ด ์žˆ๊ณ , ํ‚ค mw_encrypted_string_2๋Š” .rdata ์„น์…˜์— ์ €์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ 1, 2

 

 

์ด ์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ Python ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ณตํ˜ธํ™”ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. (Alexandre Borges์˜ "Malware Analysis Series(MAS) – Article 2" ์ฐธ์กฐ)

import pefile
import binascii
from Crypto.IO import PEM

data_seg_start = ''
rdata_seg_start = ''

# Decrypter routine used to decode the stored data.
def simple_decrypter(data_string, data_key):
	decoded = ''

	for i in range(0, len(data_string)):
		decoded += chr((data_string[i]) ^ (data_key[i % len(data_key)]))
	return (binascii.b2a_hex(decoded.encode('latin-1')))

# Routine responsible for extracting encoded bytes from .data section.
def extract_data(filename):
	pe = pefile.PE(filename)
	for section in pe.sections:
		if '.data' in section.Name.decode(encoding='utf-8').rstrip('x00'):
			return (section.get_data(section.VirtualAddress, section.SizeOfRawData))

# Routine responsible for extracting encoded bytes from .rdata section
def extract_rdata(filename):
	pe2 = pefile.PE(filename)
	for section2 in pe2.sections:
		if 'rdata' in section2.Name.decode(encoding='utf-8').rstrip('x00'):
			return (section2.get_data((section2.VirtualAddress + 0x168), section2.SizeOfRawData))

# This routine calculates the offset from start of the section until the address of the data.
def calc_offsets(x_seg_start, x_start):
	data_offset = hex(int(x_start, 16) - int(x_seg_start, 16))
	return data_offset


def main():
	data_2 = b''
	rdata_2 = b''

	# Defines start of each section (.data and .rdata section) and encrypted data (data and key).
	data_seg_start = '0x1001D000'
	rdata_seg_start = '0x10018168'
	data_start = '0x1001E528'
	rdata_start = '0x1001B868'

	# Calculates offset of data and key related to the start of each respective section.
	data_rel = calc_offsets(data_seg_start, data_start)
	rdata_rel = calc_offsets(rdata_seg_start, rdata_start)

	# Defines a varialbe to hold the sample's path
	filename = r"C:\Users\user\Desktop\mas2_sample_unpack\rundll32_047A0000_from_VirtualProtect.bin"

	# Call extract routine to fetch all necessary bytes from .data and .rdata section.
	data_1 = extract_data(filename)
	rdata_1 = extract_rdata(filename)

	# Looking for the end of data and key bytes.
	d_off = 0x0
	rd_off = 0x0
	if (b'\x00\x00' in data_1[int(data_rel, 16):]):
		d_off = (data_1[int(data_rel, 16):]).index(b'\x00\x00')
	if (b'\x00\x00' in rdata_1[int(rdata_rel, 16):]):
		rd_off = (rdata_1[int(rdata_rel, 16):]).index(b'\x00\x00')

	# Collects encrypted data and key.
	data_2 = data_1[int(data_rel, 16):int(data_rel, 16) + d_off]
	rdata_2 = rdata_1[int(rdata_rel, 16):int(rdata_rel, 16) + d_off]

	# Calls function responsible for decoding the encrypted data.
	decoded_data = simple_decrypter(data_2, rdata_2)

	# Format the extracted data as a public key in PEM Format.
	marker = "RSA PUBLIC KEY"
	pem_key = PEM.encode(decoded_data, marker, passphrase=None, randfunc=None)
	print(pem_key)


if __name__ == '__main__':
	main()

 

 

RSA ๊ณต๊ฐœ ํ‚ค๊ฐ€ ์ž˜ ๋ณตํ˜ธํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ณตํ˜ธํ™”๋œ ๊ณต๊ฐœ ํ‚ค

 

 

 

[C2 ํ†ต์‹  ์ค€๋น„]

๋˜ ๋‹ค๋ฅธ ์„œ๋ธŒ๋ฃจํ‹ด sub_1000D9B1์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

sub_1000D9B1

 

ํ•ด๋‹น ์„œ๋ธŒ๋ฃจํ‹ด ๋‚ด๋ถ€์—์„œ mw_w_decode_string_table_1 ์„œ๋ธŒ๋ฃจํ‹ด์„ ํ†ตํ•ด ๋ณตํ˜ธํ™”ํ•˜๋Š” ๋ฌธ์ž์—ด์ด ์žˆ์Šต๋‹ˆ๋‹ค. ‘SELECT * FROM Win32_OperatingSystem’๊ณผ ‘ROOT\CIMv2’ ๊ฐ™์ด WMI์™€ ๊ด€๋ จ๋œ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

 

  • WMI (Windows Management Instrumentation)
    • Microsoft Windows ์šด์˜์ฒด์ œ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ด€๋ฆฌ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ
    • ์‹œ์Šคํ…œ ๊ด€๋ฆฌ ๋ฐ ์ •๋ณด ์ˆ˜์ง‘, ๋ชจ๋‹ˆํ„ฐ๋ง, ์ œ์–ด ๋“ฑ์„ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ
    • ์‹œ์Šคํ…œ ํ•˜๋“œ์›จ์–ด, ์†Œํ”„ํŠธ์›จ์–ด, ๋„คํŠธ์›Œํฌ, ํ”„๋กœ์„ธ์Šค ๋ฐ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ ์ž์›์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž๋‚˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์›๊ฒฉ์ง€์—์„œ ์‹œ์Šคํ…œ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›

 

 

๋‹ค๋ฅธ ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด 12๋ฒˆ์งธ ์ค„์˜ mw_COM_IWbemLocator (sub_1000D6D0) ์„œ๋ธŒ๋ฃจํ‹ด์„ ๋ถ„์„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

mw_COM_IWbemLocator

 

 

12๋ฒˆ์งธ ์ค„์— rclsid์™€ riid๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

 

  • RCLSID(Reference to Class Identifier): CLSID๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํฌ์ธํ„ฐ
    • CLSID(Class Identifier): COM ๊ฐ์ฒด์˜ ํด๋ž˜์Šค๋ฅผ ์‹๋ณ„ํ•˜๋Š” GUID(Globally Unique Identifier)

  • RIID(Reference to Interface Identifier): IID๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํฌ์ธํ„ฐ
    • IID(Interface Identifier ID): COM ๊ฐ์ฒด์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‹๋ณ„ํ•˜๋Š” GUID

 

 

๋ฐœ๊ฒฌํ•œ ID ์ •๋ณด๋Š” ํด๋ž˜์Šค ID: 4590F811-1D3A-11D0-891F-00AA004B2E24, ์ธํ„ฐํŽ˜์ด์Šค ID: DC12A687-737F-11CF-884D-00AA004B2E24์ž…๋‹ˆ๋‹ค.

ํด๋ž˜์Šค ID๋Š” Microsoft Management Console (MMC) ActiveX Control๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Microsoft Management Console (MMC) ActiveX Control
    • Microsoft Management Console (MMC): Windows์—์„œ ์‹œ์Šคํ…œ ๊ด€๋ฆฌ ๋ฐ ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ
    • ActiveX Control:  ์›น ๋ธŒ๋ผ์šฐ์ €๋‚˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋‹ค์–‘ํ•œ ๋™์  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์ปดํฌ๋„ŒํŠธ
      • MMC ๊ธฐ๋ฐ˜์˜ ๊ด€๋ฆฌ ๋„๊ตฌ์™€ ๊ด€๋ จ๋œ ์›น ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณต
      • ์‹œ์Šคํ…œ ๊ด€๋ฆฌ ๋˜๋Š” ์›๊ฒฉ ๊ด€๋ฆฌ์™€ ๊ด€๋ จ๋œ ์ž‘์—…์—์„œ ์‚ฌ์šฉ

 

๋˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ID๋Š” IWbemLocator ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • IWbemLocator
    • WMI์—์„œ ์‚ฌ์šฉ๋˜๋Š” COM ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์‹œ์Šคํ…œ ๊ด€๋ฆฌ, ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์ž๋™ํ™”๋ฅผ ์œ„ํ•œ API
    • ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด WMI ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์—ฐ๊ฒฐํ•˜๊ณ  WMI ์„œ๋น„์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›

 

 

์ด ์ •๋ณด๋ฅผ ํ† ๋Œ€๋กœ ppv์™€ ptr_buffer ํƒ€์ž…์„ ๋ฐ”๊ฟ” ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜์ • ํ›„์˜ mw_COM_IWbemLocator

 

14๋ฒˆ์งธ ์ค„์— ConnectServer ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ConnectServer
    • WMI ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์—ฐ๊ฒฐํ•˜๊ณ , ์—ฐ๊ฒฐ๋œ IWbemServices ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ˜ํ™˜
    • ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด WMI ์„œ๋น„์Šค ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜์—ฌ WMI ์ž‘์—…์„ ์ˆ˜ํ–‰

  • ConnectServer ํ•จ์ˆ˜ ๊ตฌ์กฐ
HRESULT ConnectServer(
    const BSTR        strNetworkResource,   // ๋„คํŠธ์›Œํฌ ๋ฆฌ์†Œ์Šค
    const BSTR        strUser,              // ์‚ฌ์šฉ์ž ์ด๋ฆ„
    const BSTR        strPassword,          // ๋น„๋ฐ€๋ฒˆํ˜ธ
    const BSTR        strLocale,            // ์ง€์—ญ ์„ค์ •
    long              lSecurityFlags,       // ๋ณด์•ˆ ํ”Œ๋ž˜๊ทธ
    const BSTR        strAuthority,         // ์ธ์ฆ ์ •๋ณด
    IWbemContext*     pCtx,                 // WMI ์ปจํ…์ŠคํŠธ
    IWbemServices**   ppServices            // ์—ฐ๊ฒฐ๋œ WMI ์„œ๋น„์Šค ๊ฐ์ฒด ๋ฐ˜ํ™˜
);

 

IWbemLocator ์ธํ„ฐํŽ˜์ด์Šค๋Š” IWbemLocator::ConnectServer ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด WMI ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์—ฐ๊ฒฐ์„ ์ƒ์„ฑํ•˜๊ณ , ๋ฐ˜ํ™˜๋˜๋Š” IWbemServices๋ฅผ ํ†ตํ•ด WMI ์ฟผ๋ฆฌ๋‚˜ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฒ˜์Œ์— ๋ณธ 'ROOT\CIMv2’ ๋ฌธ์ž์—ด์€ ConnectServer์˜ ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ strNetworkResource๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋˜๋Š”๋ฐ, ํ•ด๋‹น ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” WMI ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๊ฐ์ฒด ๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•˜๋Š” ๋„คํŠธ์›Œํฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

 

mw_COM_IWbemLocator์˜ ๋ž˜ํผ ํ•จ์ˆ˜์ธ sub_1000DCE9 (mw_w_COM_IWbemLocator) ์„œ๋ธŒ๋ฃจํ‹ด์„ ๋“ค์–ด๊ฐ€๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

IWbemLocator์ธ ๊ฒƒ์„ ํŒŒ์•…ํ–ˆ์œผ๋‹ˆ ๋ณ€์ˆ˜ ํƒ€์ž…๊ณผ ์ด๋ฆ„์„ ๊ทธ์— ๋งž๊ฒŒ ๋ฐ”๊ฟ”์ค˜์„œ ๊ฐ€๋…์„ฑ์„ ๋†’์—ฌ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

mw_w_COM_IWbemLocator (1)

 

49๋ฒˆ์งธ ์ค„์˜ mw_COM_IWbemLocator ํ•จ์ˆ˜ ๊ฒฐ๊ณผ ํƒ€์ž…์€ IWbemServices *์ด๋ฏ€๋กœ result ๋ณ€์ˆ˜ ํƒ€์ž…์„ IWbemServices *์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ 80๋ฒˆ์งธ ์ค„์˜ v7 ๋ณ€์ˆ˜ ํƒ€์ž…์„ IWbemServices **๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ์˜ 82๋ฒˆ์งธ ์ค„์—์„œ IWbemServices::ExecQuery๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ExecQuery
    • WMI์— ๋Œ€ํ•ด ์งˆ์˜ํ•˜์—ฌ ๊ทธ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๋ฉ”์„œ๋“œ

  • ExecQuery ํ•จ์ˆ˜ ๊ตฌ์กฐ
HRESULT ExecQuery(
  const BSTR       strQueryLanguage,	// ์ฟผ๋ฆฌ ์–ธ์–ด๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฌธ์ž์—ด
  const BSTR       strQuery,		// ์‹คํ–‰ํ•  ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด
  long             lFlags,		// ์ฟผ๋ฆฌ ์‹คํ–‰์— ๋Œ€ํ•œ ํ”Œ๋ž˜๊ทธ
  IWbemContext    *pCtx,		// IWbemContext ๊ฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ
  IWbemObjectSet  **ppResults		// ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์„ IWbemObjectSet์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ
);

 

76๋ฒˆ์งธ ์ค„์—์„œ ๋ฌธ์ž์—ด ๋ณตํ˜ธํ™” ๋ฃจํ‹ด์„ ํ†ตํ•ด 'WQL' ๋ฌธ์ž์—ด์ด ๋ณตํ˜ธํ™”๋˜์—ˆ๋Š”๋ฐ ์ด๋Š” WMI์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ฟผ๋ฆฌ ์–ธ์–ด๋กœ, ExecQuery์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ง€์ •๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

mw_w_COM_IWbemLocator (2)

 

82๋ฒˆ์งธ ์ค„์—์„œ ๋ณด์ด๋“ฏ์ด ExecQuery์˜ ๋ฐ˜ํ™˜๊ฐ’ ppEum์€ IEumWbemClassObject **ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ppEum์€ ์ด๋ฏธ ์ฐธ์กฐ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ppEum์™€ ํ•จ๊ป˜ 84๋ฒˆ์งธ ์ค„ v9 ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„  IEumWbemClassObject *์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด 91๋ฒˆ์งธ ์ค„์— IEumWbemClassObject::Next ๋ฉ”์†Œ๋“œ๊ฐ€ ์ž˜ ๋ณด์ž…๋‹ˆ๋‹ค.

  • Next
    • IWbemObjectSet์˜ ๊ฒฐ๊ณผ ๊ฐ์ฒด ์ง‘ํ•ฉ์—์„œ ๋‹ค์Œ ๊ฐ์ฒด๋กœ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉ

  • Next ํ•จ์ˆ˜ ๊ตฌ์กฐ
HRESULT Next(
    long		lTimeout,                // ๋Œ€๊ธฐ ์‹œ๊ฐ„ (๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„, 0์ด๋ฉด ์ฆ‰์‹œ ๋ฐ˜ํ™˜)
    long 		lNumObjectsRequested,    // ์š”์ฒญํ•  ๊ฐ์ฒด์˜ ์ˆ˜
    IWbemClassObject	**ppObjects,		 // ๋ฐ˜ํ™˜๋  ๊ฐ์ฒด๋“ค์˜ ๋ฐฐ์—ด
    long 		*plNumObjectsReturned    // ์‹ค์ œ ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด ์ˆ˜
);

 

Next๋„ ๋น„์Šทํ•˜๊ฒŒ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜์ธ v38์˜ ํƒ€์ž…์ด IWbemClassObject **์ด์ง€๋งŒ ์ฐธ์กฐ๊ฐ€ ์กด์žฌํ•˜๋ฏ€๋กœ, IWbemClassObject *์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด 99๋ฒˆ์งธ ์ค„์— IWbemClassObject::GetNames์™€ 106๋ฒˆ์งธ ์ค„์— Release ๋ฉ”์„œ๋“œ๊ฐ€ ๋ณด์ž…๋‹ˆ๋‹ค.

  • GetNames
    • WMI ํด๋ž˜์Šค์˜ ์†์„ฑ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ ์‚ฌ์šฉ
    • GetNames ๋ฉ”์„œ๋“œ๋Š” ๊ฐ ์†์„ฑ์— ๋Œ€ํ•ด IWbemClassObject::Get ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ
      • GetNames ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์†์„ฑ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ค๊ณ , Get ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ ์†์„ฑ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ด

  • GetNames ํ•จ์ˆ˜ ๊ตฌ์กฐ
HRESULT GetNames(
    BSTR	  strQualifierType,	// ์ž๊ฒฉ ์œ ํ˜• (๋ณดํ†ต NULL์„ ์‚ฌ์šฉ)
    long	  lFlags,		// ํ”Œ๋ž˜๊ทธ (๊ธฐ๋ณธ๊ฐ’ 0)
    IWbemContext  *pCtx,		// ์ฟผ๋ฆฌ ์ปจํ…์ŠคํŠธ (๊ธฐ๋ณธ๊ฐ’ NULL)
    SAFEARRAY	  **pNames		// ์†์„ฑ ์ด๋ฆ„์ด ์ €์žฅ๋  SAFEARRAY ๋ฐฐ์—ด
);

 

  • Release 
    • COM ๊ฐ์ฒด์˜ ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ
    • COM ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋จ

 

 

 

[๊ธฐํƒ€ ํ–‰์œ„ ๋ถ„์„]

โ—‹ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์„ค์ •

sub_1000A23A (mw_RC4_Reg)

sub_1000A23A (mw_RC4_Reg) ์„œ๋ธŒ๋ฃจํ‹ด ๋‚ด๋ถ€๋ฅผ ๋ณด๋‹ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๊ด€๋ จ API๋“ค์ด ๋ณด์ด๊ณ , ์ด์ „ ํฌ์ŠคํŒ…์—์„œ ๋ถ„์„ํ–ˆ๋˜ SHA1 ๋ฐ RC4 ๊ด€๋ จ ์„œ๋ธŒ๋ฃจํ‹ด๋“ค์ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ํ•ญ๋ชฉ์„ ์•”๋ณตํ˜ธํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋˜‘๊ฐ™์€ ์•”๋ณตํ˜ธํ™” ๋ฐฉ์‹(key → SHA1 → RC4)์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

โ—‹  Defender ํƒ์ง€ ํšŒํ”ผ

sub_10004C5A

์ดˆ๊ธฐ ํ‚ค๋Š” sub_10004C5A ์„œ๋ธŒ๋ฃจํ‹ด์—์„œ ํ”ผํ•ด์ž์˜ ์ปดํ“จํ„ฐ ์ด๋ฆ„, ๊ณ„์ •, ๋ณผ๋ฅจ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ SHA1 ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ฌธ์ž์—ด "SOFTWARE\Microsoft\Microsoft Antimalware\Exclusions\Paths"์„ ๋ณตํ˜ธํ™”ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์•„ ์•…์„ฑ์ฝ”๋“œ ์ž์‹ ์„ Windows Defender์—์„œ ์˜ˆ์™ธ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

โ—‹ ์–ธ์–ด(๊ตญ๊ฐ€) ์ •๋ณด ์ˆ˜์ง‘

sub_10002E98 (mw_GetKeyBoardLayoutList)

sub_10002E98 (mw_GetKeyBoardLayoutList) ์„œ๋ธŒ๋ฃจํ‹ด์—๋Š” GetKeyBoardLayoutList API๋ฅผ ํ†ตํ•ด ํ‚ค๋ณด๋“œ ๋ ˆ์ด์•„์›ƒ์„ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • GetKeyboardLayoutList
    • ํ˜„์žฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํ‚ค๋ณด๋“œ ๋ ˆ์ด์•„์›ƒ์„ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜

 

ํ‚ค๋ณด๋“œ ๋ ˆ์ด์•„์›ƒ์„ ํ™•์ธํ•˜์—ฌ 24-28๋ฒˆ์งธ ์ค„์˜ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ํ”ผํ•ด PC์˜ ์–ธ์–ด ์„ค์ •์„ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•…์„ฑ์ฝ”๋“œ ๊ฐœ๋ฐœ์ž๋Š” v6 ๋ฐฐ์—ด์— ๊ตญ๊ฐ€ ๋ชฉ๋ก์„ ๋ฏธ๋ฆฌ ์ง€์ •ํ•ด๋‘๊ณ , ํ•ด๋‹น ๊ตญ๊ฐ€์˜ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž๋ผ๋ฉด ์•…์„ฑ ํ–‰์œ„๋ฅผ ์ง„ํ–‰ํ•˜๋„๋ก ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ ๊ตฌ์†Œ๋ จ ๊ตญ๊ฐ€๋“ค๊ณผ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

LCID ๊ตญ๊ฐ€ ์–ธ์–ด
0x4019 ๋Ÿฌ์‹œ์•„ (Russia) ๋Ÿฌ์‹œ์•„์–ด
0x4023 ๋ฒจ๋ผ๋ฃจ์Šค (Belarus) ๋ฒจ๋ผ๋ฃจ์Šค์–ด
0x403F ์šฐํฌ๋ผ์ด๋‚˜ (Ukraine) ์šฐํฌ๋ผ์ด๋‚˜์–ด
0x402C ์นด์žํ์Šคํƒ„ (Kazakhstan) ์นด์žํ์–ด
0x402B ์•„์ œ๋ฅด๋ฐ”์ด์ž” (Azerbaijan) ์•„์ œ๋ฅด๋ฐ”์ด์ž”์–ด
0x4037 ํƒ€์ง€ํ‚ค์Šคํƒ„ (Tajikistan) ํƒ€์ง€ํฌ์–ด
0x4043 ์šฐ์ฆˆ๋ฒ ํ‚ค์Šคํƒ„ (Uzbekistan) ์šฐ์ฆˆ๋ฒก์–ด
0x4028 ๋ชฝ๊ณจ (Mongolia) ๋ชฝ๊ณจ์–ด
0x4042 ์˜๊ตญ (United Kingdom) ์˜์–ด
0x4022 ๊ทธ๋ฃจ์ง€์•ผ (Georgia) ๊ทธ๋ฃจ์ง€์•ผ์–ด
0x401A ์•„๋ฅด๋ฉ”๋‹ˆ์•„ (Armenia) ์•„๋ฅด๋ฉ”๋‹ˆ์•„์–ด
0x4040 ์กฐ์ง€์•„ (Georgia) ์กฐ์ง€์•„์–ด

 

 

โ—‹ Avast ํƒ์ง€ ํšŒํ”ผ ๋ฐ ์ง€์†์„ฑ ํ™•๋ณด

sub_10004FB9 (1)

sub_10004FB9 ์„œ๋ธŒ๋ฃจํ‹ด์—์„œ๋Š” ๋ฌธ์ž์—ด ๋ณตํ˜ธ ๋ฃจํ‹ด์„ ํ†ตํ•ด aswhooka.dll, aswhokkx.dll ๋ฌธ์ž์—ด์„ ๋ณตํ˜ธํ™”ํ•œ ํ›„, ํ•ด๋‹น DLL๋“ค์— ๋Œ€ํ•ด ํ•ธ๋“ค์„ ์–ป๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น DLL๋“ค์€ ๋ณด์•ˆ ์†Œํ”„ํŠธ์›จ์–ด Avast์™€ ๊ด€๋ จ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ธ๋“ค์„ ์–ป์–ด ๋ณด์•ˆ ํ”„๋กœ๊ทธ๋žจ์˜ ํƒ์ง€ ํšŒํ”ผ, ๋น„ํ™œ์„ฑํ™” ๋ฐ ์ œ์–ด ๋“ฑ์˜ ํ–‰์œ„๋ฅผ ํ•  ๊ฒƒ์œผ๋กœ ์ถ”์ธก๋ฉ๋‹ˆ๋‹ค.

 

sub_10004FB9 (2)

๋˜ํ•œ ์ž‘์—… ์Šค์ผ€์ค„ ์„ค์ •๊ณผ ๊ด€๋ จ๋œ "C:\Windows\system32\schtasks.exe” /Create /RU "NT AUTHORITY\SYSTEM" /tn <random name> /tr <program path> /SC ONCE /Z /ST <(start)hour:min> /ET <(terminate)hour:min>, regsvr32.exe -s ๋ฌธ์ž์—ด์„ ๋ณตํ˜ธํ™”ํ•˜๊ณ , 152๋ฒˆ์งธ ์ค„์—์„œ mw_CreateProcess (sub_1000AAC1)๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์Šค์ผ€์ค„ ๋ช…๋ น์„ ํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ง€์†์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๋ถ€๋ถ„๋„ ํ™•์ธํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” mw_CreateProcess ์„œ๋ธŒ๋ฃจํ‹ด์ž…๋‹ˆ๋‹ค.

mw_CreateProcess (sub_1000AAC1)

 

  • CreateProcessW
    • ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑ
    • ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ„์ „
      • CreateProcess: ANSI ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ„์ „

  • CreateProcessW ํ•จ์ˆ˜ ๊ตฌ์กฐ
BOOL CreateProcessW(
  LPCWSTR                lpApplicationName,      // ์‹คํ–‰ํ•  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ๋กœ (์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž์—ด)
  LPWSTR                 lpCommandLine,          // ์‹คํ–‰ํ•  ๋ช…๋ น ์ค„ (์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž์—ด)
  LPSECURITY_ATTRIBUTES  lpProcessAttributes,    // ํ”„๋กœ์„ธ์Šค ๋ณด์•ˆ ์†์„ฑ (NULL์ด๋ฉด ๊ธฐ๋ณธ๊ฐ’)
  LPSECURITY_ATTRIBUTES  lpThreadAttributes,     // ์Šค๋ ˆ๋“œ ๋ณด์•ˆ ์†์„ฑ (NULL์ด๋ฉด ๊ธฐ๋ณธ๊ฐ’)
  BOOL                   bInheritHandles,        // ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ํ•ธ๋“ค ์ƒ์† ์—ฌ๋ถ€ (TRUE/FALSE)
  DWORD                  dwCreationFlags,        // ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ ํ”Œ๋ž˜๊ทธ (์˜ˆ: CREATE_NEW_CONSOLE)
  LPVOID                 lpEnvironment,          // ์ƒˆ ํ”„๋กœ์„ธ์Šค์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ (NULL์ด๋ฉด ๋ถ€๋ชจ ํ™˜๊ฒฝ ์‚ฌ์šฉ)
  LPCWSTR                lpCurrentDirectory,     // ์ƒˆ ํ”„๋กœ์„ธ์Šค์˜ ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ (NULL์ด๋ฉด ๋ถ€๋ชจ ๋””๋ ‰ํ„ฐ๋ฆฌ ์‚ฌ์šฉ)
  LPSTARTUPINFO          lpStartupInfo,          // ์ƒˆ ํ”„๋กœ์„ธ์Šค์˜ ์‹œ์ž‘ ์ •๋ณด (์ฐฝ ๋ชจ์–‘ ๋“ฑ ์„ค์ •)
  LPPROCESS_INFORMATION  lpProcessInformation    // ์ƒˆ ํ”„๋กœ์„ธ์Šค์˜ ์ •๋ณด (ํ•ธ๋“ค, ํ”„๋กœ์„ธ์Šค ID ๋“ฑ ๋ฐ˜ํ™˜)
);

 

 

 

 

 

Ref. "Malware Analysis Series(MAS) – Article 2", Alexandre Borges