웬디의 기묘한 이야기

글 작성자: WENDYS
반응형

https://wendys.tistory.com/23

이전에 소개해드린 코드를 이용한 방법은 관리자 권한을 가지고 있는 exe를 이용한 방법입니다.

 

[C/C++] DLL injection. 다른 Process에 내 DLL Load 하기

DLL Injection 기본적으로 내가 만든 Process에 DLL을 Load하는 방법은 간단합니다. 그냥 일반적으로 사용하면 되죠 하지만 다른 Process에 내가 원하는 기능을 동작하게 하고싶은 경우엔 어떻게 해야할까요?? 특..

wendys.tistory.com

 

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

 

AppInit DLLs and Secure Boot - Win32 apps

AppInit DLLs and Secure Boot In this article --> Starting in Windows 8, the AppInit_DLLs infrastructure is disabled when secure boot is enabled. About AppInit_DLLs The AppInit_DLLs infrastructure provides an easy way to hook system APIs by allowing custom

docs.microsoft.com

자세한 내용은 MSDN에서 확인할 수 있습니다.

반응형