
DLLMain이 유일한 방법일 때를 위한 도구
DLLMain이 유일한 방법일 때를 위한
LdrLockLiberator는 DllMain 또는 잠금이 존재할 수 있는 다른 곳에서 코드를 실행할 때 Loader Lock을 벗어나거나 우회하기 위한 기법 모음입니다. 이는 "Perfect DLL Hijacking" 문서와 함께 공개되었습니다. 우리는 여러분께 라이브러리 로더의 잠금을 해제하고 (여러분 자신의 컴퓨터에서) 로더로 원하는 대로 할 수 있는 열쇠를 제공합니다!
이 기법들은 가능한 한 범용적이고, 깨끗하며, 100% 안전하도록 설계되었습니다. 메모리 보호나 포인터를 수정하지 않고도 작동하도록 설계되었습니다. 이는 최신 익스플로잇 완화 조치와의 호환성을 유지하는 데 중요합니다. 공식적으로 지원되는 유일한 아키텍처는 x86-64입니다(32비트는 거의 사라졌습니다).
DllMain이 Windows에서 그렇게 문제가 많은 반면 Unix 계열 운영 체제는 여기서 어려움을 겪지 않는 아키텍처적 이유를 알고 싶으신가요? 부디, 맘껏 읽어보세요!
말 그대로입니다. Loader Lock을 잠금 해제하고, 로더 이벤트를 설정하고, LdrpWorkInProgress를 뒤집습니다. 최상의 안정성을 위해 RUN_PAYLOAD_DIRECTLY_FROM_DLLMAIN을 정의하지 않은 상태로 유지하는 것이 좋습니다.
프로덕션 코드에서 이 기법을 사용하지 마십시오. 이는 순전한 호기심과 하나도 빠짐없이 파헤치고자 하는 의지의 부산물로 만들어졌습니다. 이 코드로 무엇을 하든 그 책임은 당신에게 있습니다.
우리는 DLL 코드에서 프로그램이 종료될 때 Loader Lock을 벗어나기 위해 일반적으로 EXE에서 사용하는 CRT atexit를 사용합니다. 동적 로드(LoadLibrary 사용)의 경우 LdrAddRefDll을 사용하여 라이브러리를 고정(LDR_ADDREF_DLL_PIN)함으로써 이후의 FreeLibrary가 메모리에서 우리 DLL을 제거하지 못하게 하여 100% 안전하게 만듭니다.
곧 공개 예정!
제공된 샘플은 C:\Program Files\Windows Defender\Offline\OfflineScannerShell.exe의 MpClient.dll을 하이재킹합니다. 다른 DLL 및 프로그램 조합에 쉽게 적용할 수 있도록 소스 코드 주석에 지침이 제공되어 있습니다(주로 정적 로드의 경우 익스포트만 업데이트하면 됩니다)!
개념 증명으로 기본 페이로드로 ShellExecute를 실행합니다. 그러나 원하는 대로 무엇이든 실행하도록 만들 수 있습니다!
이 프로젝트의 루트에 있는 LdrLockLiberator.c는 Visual Studio 2022에서 컴파일되도록 테스트되었습니다.
솔루션 탐색기 창에서 현재 Visual Studio 프로젝트를 선택한 다음 메뉴 표시줄에서 프로젝트 > 속성으로 이동하여 NTDLL에 연결합니다. 상단의 구성 드롭다운 메뉴에서 모든 구성 및 모든 플랫폼을 선택합니다. 이제 링커 > 입력으로 이동한 다음 추가 종속성에 ntdll.lib를 추가합니다.
C:\Windows\System32\msvcrt.dll)에 대한 링크를 공식적으로 지원하는 마지막 공개 WDK입니다.5edc723b50ea28a070cad361dd0927df402b7a861a036bbcf11d27ebba77657dKitSetup.exe를 실행합니다.LdrLockLiberatorWDK로 이동합니다(cd 사용).build를 실행합니다.완료! DLL이 빌드되어 사용할 준비가 되었습니다!
WDK의 대안으로 MinGW로 컴파일해도 아마 작동할 것입니다.
MIT License - Copyright (C) 2023-2024 Elliot Killick [email protected]