
부팅 시 PatchGuard 및 Driver Signature Enforcement를 비활성화합니다.
EfiGuard는 부팅 시 Windows 부팅 관리자, 부트 로더, 커널을 패치하여 PatchGuard 및 DSE(Driver Signature Enforcement)를 비활성화하는 휴대용 x64 UEFI 부트킷입니다.
EfiGuard를 시험해보고 싶다면 사용법으로 건너뛰세요.
현재 Vista SP1부터 Windows 11까지 출시된 모든 EFI 호환 Windows x64 버전을 지원합니다.
사용하기 쉬움: 자동으로 Windows를 찾아 부팅하는 로더를 통해 USB 스틱 또는 Windows EFI 파티션에서 부팅할 수 있습니다. 드라이버는 UEFI 셸 또는 로더를 사용하여 수동으로 로드 및 구성할 수도 있습니다.
Zydis 디스어셈블러 라이브러리를 광범위하게 사용하여 빠른 런타임 명령어 디코딩을 통해 시그니처 매칭보다 더 강력한 분석을 지원하며, 시그니처 매칭은 새로운 OS 업데이트마다 변경이 필요한 경우가 많습니다.
수동적으로 작동: 드라이버는 Windows 부팅 관리자를 로드하거나 시작하지 않습니다. 대신 펌웨어 부팅 관리자가 부팅 선택 메뉴 또는 로더와 같은 EFI 애플리케이션을 통해 bootmgfw.efi를 로드할 때 반응합니다. 비 Windows OS가 부팅되면 드라이버는 자동으로 언로드됩니다.
bootmgfw.efi가 winload.efi 대신 bootmgr.efi를 시작할 때 4단계 패치를 지원합니다. 이는 WIM 파일을 로드하여 WinPE, Windows 설치 또는 Windows 복구 모드를 부팅할 때 발생합니다.
우아한 복구: 패치 실패 시 드라이버는 오류 정보를 표시하고 ESC를 눌러 계속 부팅하거나 재부팅하라는 메시지를 표시합니다. 최종 커널 패치 단계에서도 마찬가지입니다. 마지막 패치 단계는 ExitBootServices가 호출되기 전에 발생하기 때문입니다. 많은 UEFI Windows 부트킷은 OslArchTransferToKernel을 후킹하는데, 이 함수는 패턴 매칭으로 찾기 쉽지만 ExitBootServices 이후 보호 모드에서 실행됩니다. 즉, 문제가 발생했을 때 사용자에게 알릴 부트 서비스가 없습니다.

오류 정보가 포함된 시뮬레이션된 패치 실패
디버깅 가능: 커널 패치 단계에서 커널 디버거와 화면(버퍼링됨)으로 메시지를 출력할 수 있으며, 부트 관리자 및 부트 로더 패치 단계에서는 직렬 포트 또는 버퍼링되지 않은 화면으로 출력할 수 있습니다. 드라이버가 PDB 디버그 정보와 함께 컴파일된 경우, 가상 DXE 드라이버 베이스를 지정하고 일반 NT 드라이버처럼 디버깅하여 HAL 초기화 후 언제든지 디버그 심볼을 로드할 수 있습니다.
DSE 우회: 부팅 시 간단한 UPGDSED 스타일의 DSE 비활성화 또는 SetVariable() EFI 런타임 서비스 후크로 사용 가능합니다. 후자는 Windows에서 NtSetSystemEnvironmentValueEx를 사용하여 호출할 수 있는 임의의 커널 모드 읽기/쓰기 백도어 역할을 하며, g_CiEnabled/g_CiOptions를 원하는 값으로 설정할 수 있습니다. 이를 수행하는 데 사용할 수 있는 EfiDSEFix.exe라는 작은 DSEFix 스타일 애플리케이션이 제공됩니다. 또한 DSE를 활성화하고 PatchGuard만 비활성화하는 것도 가능합니다. 로더는 기본적으로 SetVariable 후크 방법을 사용합니다. 일부 안티치트 및 안티바이러스 프로그램이 치트나 악성코드와 셀프 서명 드라이버의 차이를 이해하지 못하고 UPGDSED 수정을 대상으로 삼기 때문입니다.
모든 단계에서 ImgpValidateImageHash 및 ImgpFilterValidationFailure를 패치하여 디스크 상의 수정된 커널 및 부트 로더를 지원합니다. ImgpFilterValidationFailure는 일부 위반 클래스를 TPM 또는 SI 로그 파일에 조용히 알릴 수 있습니다.
Windows 7에서 Secure Boot가 작동하도록 허용합니다(농담이 아닙니다!). Windows 7 자체는 Secure Boot를 지원하지 않으므로 이를 인식하지 못하거나 (공식적으로) CSM 없이 부팅하는 것조차 지원하지 않습니다. 이는 WHQL Secure Boot가 필요한 잠금 장치에서 Windows 7을 사용하려는 사람들에게 유용합니다. 작동 방법에 대한 위키 항목은 여기에 있습니다.

WinObjEx64 - Secure Boot가 활성화된 Windows 7
SetVariable 후크를 g_CiOptions에 쓰는 데 사용하면 SECURE_KERNEL_ERROR 버그체크가 발생합니다.EfiGuard를 사용하는 두 가지 방법이 있습니다: 로더 애플리케이션을 부팅하면 드라이버를 로드하고 Windows를 시작합니다. 또는 드라이버를 UEFI 드라이버 항목으로 설치하여 펌웨어가 자동으로 로드하도록 하는 것입니다.
드라이버 설치는 멀티 부팅과 같은 일부 고급 구성에서 선호될 수 있지만, 로더가 사용하기 가장 쉽고 모든 구성에서 잘 작동해야 합니다. 두 방법의 가장 중요한 차이점은 아래 표를 참조하십시오. 확실하지 않은 경우 로더 애플리케이션을 선택하십시오.
| 위치 | 설치 | 건너뛰기 가능? | 부팅되는 OS | |
|---|---|---|---|---|
| UEFI 드라이버 항목 | ESP에 있어야 함 | UEFI 셸을 통해 | ❌ | 이전과 동일 |
| 로더 | 아무 곳이나 | 필요 없음 | ✔️ |
로더와 UEFI 드라이버 항목 비교
EFI/Boot/Loader.efi의 이름을 bootx64.efi로 바꿉니다.X:를 가정하면, 두 파일의 경로는 이제 X:/EFI/Boot/{bootx64|EfiGuardDxe}.efi여야 합니다.SetVariable 후크(기본값)로 부팅한 경우, 부팅 후 관리자 명령 프롬프트에서 EfiDSEFix.exe -d를 실행하여 DSE를 비활성화하거나 EfiDSEFix.exe를 실행하여 전체 옵션 목록을 확인하십시오.로더에 별도의 드라이브를 사용할 필요가 없습니다. 가능하다면 Windows가 이미 설치된 ESP에 EfiGuard를 설치할 수 있습니다. 그러나 로더에 대한 UEFI 부팅 항목을 추가해야 하므로 다소 복잡합니다.
이렇게 하려면 mountvol X: /S를 사용하여 ESP를 X:에 마운트하고 위 단계를 따르되 로더의 이름을 바꾸지 말고 두 파일을 X:/EFI/Boot에 복사하십시오. 그런 다음 UEFI 셸에서 bcfg boot addp 0 Loader.efi "EfiGuard"를 사용하거나 efibootmgr(Linux), EasyUEFI(Windows) 등을 사용하여 수동으로 UEFI 부팅 항목을 추가해야 합니다.
mountvol X: /S를 사용하여 ESP를 X:에 마운트합니다.EfiGuardDxe.efi를 X:/EFI/Boot/EfiGuardDxe.efi로 복사합니다.bcfg driver add 0 EfiGuardDxe.efi "EfiGuardDxe"SetVariable 후크(기본값)로 부팅한 경우, 부팅 후 관리자 명령 프롬프트에서 EfiDSEFix.exe -d를 실행하여 DSE를 비활성화하거나 EfiDSEFix.exe를 실행하여 전체 옵션 목록을 확인하십시오.참고: 펌웨어에 따라 3단계에서 "add" 대신 "addp"를 사용해야 할 수도 있습니다. VirtualBox는 이를 필요로 하는 것으로 알려져 있으며, 일부 마더보드 펌웨어도 마찬가지일 수 있습니다.
참고: 매우 오래되었거나 비준수하는 펌웨어는 이 설치 방법을 전혀 지원하지 않을 수 있습니다. 이러한 시스템에서는 로더를 사용하는 것 외에는 선택의 여지가 없습니다.
EfiGuard를 빌드하려면 EDK2가 필요합니다. EDK2가 설치되어 있지 않으면 먼저 EDK2 시작하기의 단계를 따르십시오. EDK2 빌드 시스템은 설정이 상당히 복잡하기 때문입니다. 이 섹션에서는 WORKSPACE 환경 변수가 가리키는 workspace 디렉토리가 있고 workspace/edk2에 EDK2 사본이 체크아웃되어 있다고 가정합니다. 지원되는 컴파일러는 MSVC, Clang, GCC 및 ICC입니다.
workspace/edk2/EfiGuardPkg에 클론합니다.build -a X64 -t VS2019 -p EfiGuardPkg/EfiGuardPkg.dsc -b RELEASE를 실행하되, VS2019를 자신의 툴체인으로 대체합니다.그러면 workspace/Build/EfiGuard/RELEASE_VS2019/X64에 EfiGuardDxe.efi 및 Loader.efi가 생성됩니다.
EfiDSEFix를 빌드하려면 Visual Studio가 필요합니다.
EfiGuard.sln을 열고 솔루션을 빌드합니다.출력 바이너리 EfiDSEFix.exe는 Application/EfiDSEFix/bin에 있습니다.
Visual Studio 솔루션에는 VisualUefi와 함께 사용할 수 있는 EfiGuardDxe.efi 및 Loader.efi 프로젝트도 포함되어 있지만, 추가 코드 없이는 링크되지 않기 때문에 기본적으로 빌드되지 않으며 빌드 출력이 EDK2에서 생성된 것보다 열등합니다(더 큼). Loader.efi는 VisualUefi에 UefiBootManagerLib가 없어 전혀 링크되지 않습니다. 따라서 이러한 프로젝트 파일은 개발 보조용으로만 의미가 있으며 EFI 파일은 여전히 EDK2로 컴파일해야 합니다. 이 목적을 위해 VisualUefi를 설정하려면 저장소를 workspace/VisualUefi에 클론하고 EfiGuard.sln을 엽니다.
EfiGuard는 UEFI 부트킷이지만 처음부터 그렇게 시작된 것은 아닙니다. EfiGuard는 원래 NT에서 실행되는 온-디스크 패터(UPGDSED와 유사)로서, PDB 심볼과 버전별 시그니처를 사용하는 대신 디스어셈블러 기반 접근 방식의 실행 가능성을 테스트하기 위해 고안되었습니다. PatchNtoskrnl.c는 여전히 이 원래 설계와 매우 유사합니다. 이 접근 방식이 성공적임이 입증되어 1년 이상의 Windows 업데이트 동안 코드 수정이 필요 없게 된 후에야 UEFI가 기능과 사용 편의성을 더욱 향상시키는 방법으로 등장했습니다.
부트킷 접근 방식이 제공하는 이점 중 일부는 다음과 같습니다:
bcdedit을 사용하여 부트 구성 저장소를 수정할 필요가 없습니다.ImgpValidateImageHash를 패치할 필요가 없습니다(선택적으로 수행되지만).db 저장소에 추가할 수 있는 경우 Secure Boot를 활성화할 수 있습니다.부트킷으로서 EfiGuard의 초기 구현체는 dude719의 UEFI-Bootkit을 최신 Windows 10 버전에서 작동시키려는 시도였습니다. UEFI-Bootkit이 구식이 되어 최신 버전에서 더 이상 작동하지 않았기 때문입니다(UPGDSED와 마찬가지로 종종 버전에 민감한 패턴 스캔으로 인해 발생). 결국 작동하게는 했지만, 위에서 언급한 대로 OslArchTransferToKernel을 후킹하는 선택 때문에 결과에 만족하지 못했습니다. 이 함수는 보호 모드에서 그리고 ExitBootServices가 호출된 후에 실행됩니다. 이 외에도 Windows 10의 일부 버전만 패치할 수 있다는 점에 만족하지 않았습니다. 지금까지 출시된 모든 EFI 호환 Windows x64 버전에서 부트킷이 작동하기를 원했습니다. 이 때문에 다음 목표로 부트킷을 처음부터 다시 작성했습니다:
최종 EfiGuard 부트 흐름의 큰 그림 개요는 위 다이어그램에 나와 있습니다. 개별 구성 요소별 후크 및 패치는 소스 파일의 EfiGuardDxe/PatchXxx.c를 참조하십시오. 드라이버 초기화/언로드 및 EFI 부트 및 런타임 서비스 후크는 EfiGuardDxe.c를 참조하십시오.
EfiGuard는 GPLv3에 따라 라이선스가 부여됩니다. EfiGuardDxe/Zydis 서브모듈의 파일은 MIT 라이선스에 따라 라이선스가 부여됩니다.
| Windows |