
아이콘을 사용하여 탐색기 프로세스에 DLL 주입
이것은 Windows의 아이콘 변경 대화 상자를 사용하는 Windows Explorer DLL 인젝션 기술입니다.
사용자를 속여 악성 DLL을 탐색기 프로세스에 로드하게 할 수 있습니다:
https://github.com/0xda568/IconJector/assets/61665703/06428402-764c-4279-b762-1d01082552c8
또한, 다른 프로세스에서 DLL을 탐색기로 주입하는 데에도 사용될 수 있습니다:
https://github.com/0xda568/IconJector/assets/61665703/bbf53775-ad8d-422b-b186-663ff5074976
DLL은 코드를 포함하는 것 외에도 아이콘과 같은 리소스를 저장하는 데 사용됩니다. 데모에서 기본 아이콘이 shell32.dll에 저장되어 있는 것을 볼 수 있습니다:

실제로 최신 Windows 버전에서는 shell32.dll.mui에 저장되지만, 여전히 shell32.dll로 표시됩니다
탐색기 프로세스가 대화 상자에서 DLL에 저장된 모든 아이콘을 표시할 수 있으려면, DLL을 파싱할 수 있도록 메모리에 로드해야 합니다.
또한, Windows의 DLL은 선택적인 DllMain 함수를 정의할 수 있는데, 이 함수는 LoadLibrary 및 FreeLibrary 함수를 사용하여 DLL이 로드되거나 언로드될 때 호출됩니다.
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved ) // reserved
{
// Perform actions based on the reason for calling.
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
// Initialize once for each new process.
// Return FALSE to fail DLL load.
break;
case DLL_THREAD_ATTACH:
// Do thread-specific initialization.
break;
case DLL_THREAD_DETACH:
// Do thread-specific cleanup.
break;
case DLL_PROCESS_DETACH:
if (lpvReserved != nullptr)
{
break; // do not do cleanup if process termination scenario
}
// Perform any necessary cleanup.
break;
}
return TRUE; // Successful DLL_PROCESS_ATTACH.
}
즉, DllMain 함수가 있는 DLL이 탐색기에 의해 로드되면 DllMain 함수에 정의된 코드가 탐색기의 메모리에서 실행됩니다.
그리고 이것이 바로 여기서 수행되는 작업입니다. 추가로, DLL은 아이콘으로 위장되고 있습니다:
"아이콘"은 실제로 Resource Hacker를 사용하여 추가된 아이콘 리소스로 계산기 앱을 여는 .ico 확장자를 가진 단순한 DLL 파일입니다. (아이콘은 Visual Studio에서도 추가할 수 있습니다)
폴더 보기에서 아이콘 표시에는 몇 가지 이상 징후가 있습니다. 저는 두 가지 다른 Windows 10 버전(최신 버전과 이전 버전)과 Windows 11에서 이 기능을 테스트했습니다.
두 Windows 10 버전 모두에서 확장자가 .ico로 변경되었을 때 DLL 내부에 저장된 아이콘이 표시되지 않았습니다.

하지만 최신 Windows 10 버전에서는 사진 앱에서 "아이콘"을 열려고 시도할 때까지는 작동했습니다. 그 이후로는 이를 재현할 수 없었습니다.

Windows 11에서는 위장된 DLL이 탐색기 보기에서 일반 아이콘처럼 표시되었습니다. 그러나 사진 앱에서 열면 오류가 표시됩니다.
https://github.com/0xda568/IconJector/assets/61665703/748c1012-1d2c-47dd-915f-860ffc6d1b05
사용자를 속여 DLL을 수동으로 로드하게 하는 것 외에도, 공격자는 이 기술을 사용하여 DLL 파일을 탐색기 프로세스에 프로그래밍 방식으로 주입할 수도 있습니다:
먼저 임시 디렉터리에 폴더가 생성되고, SHObjectProperties를 사용하여 폴더의 속성이 열립니다. 시스템 언어와 무관하게 창의 핸들을 얻기 위해, 열려 있는 모든 창에서 고유한 폴더 이름을 확인하는 콜백 함수와 함께 EnumWindows가 사용됩니다.

속성 페이지를 통해 아이콘 변경 대화 상자가 호출되며, 해당 핸들도 EnumWindows로 얻습니다. 마지막으로 아이콘 경로가 DLL로 변경되고(이 경우 .ico 확장자를 가짐), 확인 버튼을 누르면 탐색기가 DLL을 로드하게 됩니다.
이것은 일반적인 DLL 인젝션 API를 사용하지 않기 때문에 탐색기 프로세스에 DLL을 주입하는 매우 은밀한 방법입니다. 다만 두 개의 짧은 팝업이 표시되기는 하지만 그리 거슬리지는 않습니다. 따라서 위협 행위자가 정상적인 탐색기 프로세스를 통해 코드를 실행하거나 UMD 루트킷을 로드하기 위한 AV 우회 기술로 사용될 수 있습니다.
또한 .ico 파일로 위장한 DLL을 유포하는 것은 흥미로운 공격 벡터가 될 수 있습니다.
올바른 창 핸들을 얻기 위해 Visual Studio와 함께 설치되는 도구인 Spy++를 사용했습니다.

아름다운 폴더 아이콘을 제공한 Microsoft의 Bill G.에게 감사드립니다!
아름다운 인젝션 아이콘을 제공한 인터넷의 익명의 분에게도 감사드립니다!