[Hooking] dll injection을 이용하여 다른 프로세스에 dll 로드하기
이전에 소개해드린 코드를 이용한 방법은 관리자 권한을 가지고 있는 exe를 이용한 방법입니다.
Hooking의 기술 다른 프로세스에 내가만든 DLL 로드하기
기술 개발을 하다보면 다양한 편법과 정석 기술이 있는데, 이 중 후킹 기술은 다양한 편법의 집합체라고 볼 수 있습니다. 그렇기 때문에 예측하지 못한 다양한 문제를 가지고 있으며, 시스템의 문제 분석 시 가장 먼저 외부 모듈을 의심하게 됩니다.
DLL Injection에도 다양한 기법이 존재하며 그중 가장 간편하게 할 수 있는 방법을 소개해드리겠습니다.
해당 방법은 악성코드에서도 자주 이용되는 방법이 기 때문에 보안 옵션과 함께 사용하는 것을 권장합니다.
Registry AppInit_DLLs
이것은 user32.dll의 특별한 기능을 이용하여 DLL Injection을 하는 방법입니다.
user32.dll은 자신이 로드되는 시점에 AppInit_DLLs에 등록된 DLL을 자동으로 Load해주기때문에 불특정 프로세스에 DLL Injection이 가능하게 됩니다.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
해당 레지스트리의 AppInit_DLLs의 기본값은 아무 값도 없으며 LoadAppInit_DLLs는 0이 기본값입니다.
NVIDIA S/W를 설치하게 되면 등록되는 경우가 있습니다. 해당 값은 복수로 입력이 가능하기 때문에 기존에 값이 있다면 기존 값을 유지한 채 추가 등록을 해야 합니다.
위의 레지스트리에서 핵심 값을 정리하자면 아래 세 개 정도입니다.
registry | description | value |
AppInit_DLLs | 자동으로 Injection 될 DLL 목록 | C:\system32\my_dll.dll ... |
LoadAppInit_DLLs | 기능의 사용 여부 |
0 : 사용하지 않음 (기본값) 1 : 사용함 |
RequireSignedAppInit_DLLs | code sign이 적용된 DLL만 로드할건지 보안 여부 |
0 : 모든 DLL 로드 (기본값) 1 : code sign이 적용된 DLL만 로드 |
AppInit_DLLs에 등록된 DLL목록은 어느 시점에 어떻게 로드가 될까?
AppInit_DLLs에 등록된 DLL들은 User32.dll이 프로세스로 로드될 때 DLL_PROCESS_ATTACH시점에 LoadLibrary()를 이용하여 호출이 됩니다. 즉, User32.dll를 사용하는 모든 Application에 AppInit_DLLs에 등록된 DLL이 로드되는 것입니다.
하지만 위의 표에서 본 것처럼 기본값은 사용하지 않음이며, 보안 옵션도 해제된 상태입니다. 그리고 공용 레지스트리 공간이기 때문에 내가 Enable을 해놓더라도 다른 누군가가 다시 Disable을 할 수 있기 때문에 주의하여 사용을 해야 합니다.
64bit Windows에서 32bit, 64bit DLL Load 하기
WIndows x64 기준으로 설명드리겠습니다.
레지스트리에 보면 등록된 DLL을 자동으로 로드한다고 했으니 시스템에 맞는 x64 dll을 생성하여 등록을 했을 겁니다.
그런데 x86 Application에 x64 dll이 로드될 수 있을까요?? 당연히 안되기 때문에 x86으로 동작하는 Application에는 Injection이 되어있지 않게 됩니다.
여기서 생각해볼 수 있는 점은 그렇다면 x64 System에서는 x86 dll, x64 dll이 모두 필요하구나입니다.
여기서 Windows는 x86으로 동작하는 Application을 위해 WOW64라는 시스템을 적용하여 레지스트리에도 그 정보를 별도로 나누어 적용되어있게 됩니다.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\Windows
위의 레지스트리는 독립적인 공간이기 때문에 각각 설정하여 x86, x64가 모두 동작할 수 있도록 해주면 됩니다.
RequireSignedAppInit_DLLs
테스트 목적이 아닌 경우 해당 값이 0으로 있을 필요는 없습니다.
개발이 되어 배포되는 모든 exe, dll, sys에는 code sign이 되어있어야 합니다. 이 부분은 예외 없이 당연한 것으로 MS에서 제공되는 모든 exe, dll, sys에는 파일 속성 -> 디지털 서명으로 Microsoft Windows의 서명이 들어가 있는 것을 확인할 수 있습니다. 당연히 회사에서 배포되는 응용프로그램, SDK에도 마찬가지이고요
그리고 윈도우 Vista 버전부터는 서명이 되어있지 않은 sys driver는 64bit OS에서는 로드조차 되지 않도록 적용이 되었습니다.
AppInit_DLLs 문제점 WIndows Secure Boot
한가지 문제가 있습니다. 아니..2가지.. 3가지..
Windows 8 버전부터는 Secure Booting이 활성화 되게되면 AppInit_DLLs의 값이 비활성화 된다고 합니다.
그리고...
AppInit_DLLs 메커니즘은 시스템 교착 상태 및 성능 문제로 이어질 수 있으므로 합법적인 응용 프로그램에는 권장되지 않습니다.... 네.. MS에서 권장되는 방법은 아니네요!
- The AppInit_DLLs mechanism is not a recommended approach for legitimate applications because it can lead to system deadlocks and performance problems.
- The AppInit_DLLs mechanism is disabled by default when secure boot is enabled.
- Using AppInit_DLLs in a Windows 8 desktop app is a Windows desktop app certification failure.
https://docs.microsoft.com/ko-kr/windows/win32/dlls/secure-boot-and-appinit-dlls?redirectedfrom=MSDN
자세한 내용은 MSDN에서 확인할 수 있습니다.
'⌨ DEVELOPMENT > WIndows Hooking' 카테고리의 다른 글
[C++] 최고의 API Hooking Library MS Detours. (1) | 2019.12.07 |
---|---|
[C/C++] 키보드 메시지 후킹을 이용한 키로거 만들기 (6) | 2019.07.27 |
[C/C++] 윈도우 마우스 후킹으로 제스처 인식 프로그램 만들기 (마무리) (2) | 2019.07.25 |
[C/C++] 윈도우 마우스 후킹으로 제스처 인식 프로그램 만들기 (마우스 이동 방향 및 각도 구하기) (0) | 2019.07.23 |
[C/C++] 윈도우 마우스 후킹으로 제스처 인식 프로그램 만들기 (마우스 이동거리 계산하기) (2) | 2019.07.23 |
[C/C++] 윈도우 메시지 후킹 마우스를 지배하는자 (windows mouse message hooking) (1) | 2019.07.21 |
[C/C++] 윈도우 후킹을 하기 전에 알아야 할 DLL Main에서 하면 안되는 5가지 작업 (2) | 2019.07.16 |
[C/C++] 윈도우 메시지 가로채기 기법 (windows message hooking) (0) | 2019.07.14 |
댓글
이 글 공유하기
다른 글
-
[C++] 최고의 API Hooking Library MS Detours.
[C++] 최고의 API Hooking Library MS Detours.
2019.12.07 -
[C/C++] 키보드 메시지 후킹을 이용한 키로거 만들기
[C/C++] 키보드 메시지 후킹을 이용한 키로거 만들기
2019.07.27 -
[C/C++] 윈도우 마우스 후킹으로 제스처 인식 프로그램 만들기 (마무리)
[C/C++] 윈도우 마우스 후킹으로 제스처 인식 프로그램 만들기 (마무리)
2019.07.25 -
[C/C++] 윈도우 마우스 후킹으로 제스처 인식 프로그램 만들기 (마우스 이동 방향 및 각도 구하기)
[C/C++] 윈도우 마우스 후킹으로 제스처 인식 프로그램 만들기 (마우스 이동 방향 및 각도 구하기)
2019.07.23