티스토리 뷰

Reversing/Concept

[Reversing] DLL Injection

ch4njun 2020. 3. 5. 02:09
반응형
우선 이번 포스팅은 정신없을거라는 것을 미리 예고한다....

왜냐면 DLL Injection을 공부하는 과정에서 이것저것 순서없이 공부했고, 아직 더 공부하고싶은 DLL Injection 기법들이 많이 남아있기 때문이다.

 

DLL Injection 이란 ?

 DLL Injection이란 실행중인 Proecss 혹은 실행하고자 하는 Program에 기본적으로 Load되는 DLL을 제외한 내가 원하는 DLL을 추가(강제)로 삽입하는 기법을 말한다.

 

 DLL이 삽입되었다는 말은 내가 DLL을 만들 때 작성한 코드가 해당 Process에서 동작할 수 있다는 의미이고 프로그래머가 의도하지 않은 동작 혹은 추가적인 기능을 수행시킬 수 있다는 뜻이다. DLL이 Injection되어 해당 Process에 Load되는 순간 DLL 파일의 DllMain이 수행되기 때문이 내부적인 호출없이 위와같은 내용이 가능하다.

 

 

 

DLL Injection 을 왜 사용할까 ?

 Process에 삽입된 DLL 파일은 Process Memory에 대한 접근권한을 가지기 때문에 사용자가 원하는 모든 동작을 수행할 수 있다. 이런 부분을 이용해 버그패치, 기능추가 등등 다양한 곳에 이용할 수 있지만 물론 악의적인 용도(악성코드)로도 사용될 수 있다.

 

 

 

DLL Injection 은 어떻게할까 ?

1) AppInit_DLLs 레지스트리

  이 방법은 user32.dll 을 로드하는 모든 Process는 AppInit_DLLs 레지스트리에 명시된 DLL이 로드된다는 특징을 이용한 방법이다. 그러나 Windows 8 부터 Secure Boot 을 사용하게 되면서 AppInit_DLLs 레지스트리는 부팅시 잠금에 들어간다고 한다. 때문에 당연하게도 현재 사용중인 Windows 10에서는 사용할 수 없는 방법이다.

 

 

경로는 위와 같으며, 참고만 하고 넘어가자 !

추가로 적용을 하려면 반드시 재부팅과정을 거쳐야 한다.

 

 

2) CreateRemoteThread API

 CreateRemoteThread API는 API의 이름 그대로 다른 Process에 Thread를 생성해주는 API이다. 그러면 이걸 이용해서 어떻게 DLL Injection을 진행할까? 

 

 LoadLibraryA API는 DLL을 Load하는 API인데, 이 API를 호출해주는 Thread를 대상 Process에게 생성해 실행시키면 어떻게 될까? 당연히 해당 Process에는 내가 원하는 DLL이 Load될 것이고, DLL Injection에 성공하게 되는 것이다.

( LoadLibraryA API는 kernel32.dll에 있는데 Windows의 주요 DLL은 모든 Process에서 같은 주소에 Load되는 특징을 이용해 LoadLibraryA API의 주소를 그냥 대상 Process에서 실행시켜도 정상적인 동작이 가능하다.  )

 

 이 API를 이용해 DLL Injection을 수행하는 것은 정말 기초적인 방법이라고 생각한다. 그만큼 대중적이고 DLL Injection을 다루는 대부분의 '옛날' 자료들에서는 이 API를 소개한다.

 

 

https://ch4njun.tistory.com/139

 

[Reversing] Detours 을 이용한 Windows API 후킹 2 (Feat. CreateRemoteThread를 이용한 DLL Injection)

 

ch4njun.tistory.com

 

자세한 코드 및 내용은 위 포스팅에서 확인할 수 있다.

 

넘어가서 확인하기 귀찮다면 아래 순서도만 확인하고 넘어가자.

 

그러나 CreateRemoteThread API를 사용해 만든 DLL Injector는 Windows 7 64bit 부터 사용할 수 없다.

정확히는 x64 Process에 대해 사용할 수 없다. x86 Process에는 적용이 되는데, 이것도 최근 상용프로그램에서는 대부분 막혀있는지 적용이 되지 않는다.

 

[ CreateRemoteThread API로 만들어진 DLL Injector 다운로드 ]

 

InjectionDll.zip

 

drive.google.com

 

 

3) NtCreateThreadEx API

NtCreateThreadEx API는 CreateRemoteThread API의 내부에서 호출되는 API이다.

 

CreateRemoteThread API가 사용되지 않으면서 x64 Process에 대해서 사용하기 위해 위 NtCreateThreadEx API를 사용할 수 있다. 이 경우 Windows 7 64bit 환경에서 모든 Process에 성공적으로 DLL Injection이 수행되는 것을 확인했다. 그러나, Windows 10 64bit 환경에서는 x64 Process에 대해 DLL Injection이 제대로 수행되지 않는다.

              ( 특이하게 Windows 10 64bit 환경에서 x32 Process에 대해 DLL Injection은 제대로 수행된다. )

 

아래 DLL Injector들은 ReverseCore님이 만들어 제공해주는 Injector들이다.

 

[ NtCreateThreadEx API로 만들어진 DLL Injector 다운로드 (x86) ]

 

InjDll32.exe

 

drive.google.com

[ NtCreateThreadEx API로 만들어진 DLL Injector 다운로드 (x64) ]

 

InjDll64.exe

 

drive.google.com

 

 

4) RtlCreateUserThread API

RtlCreateUserThread API는 내부적으로 NtCreateThreadEx API를 호출한다.

 

RtlCreateUserThread API를 사용한 DLL Injector는 현재 Windows 10 64bit 환경에서 대부분의 Process에 DLL Injection이 정상적으로 수행되는 것을 확인했다.

 

그러나 안되는 프로그램도 몇몇 존재한다. 이거는 보안정책이 들어가 있을 확률이 높다.

또한 Microsoft 사에서 만든 프로그램의 경우 System32에 DLL을 넣고 진행해야 정상적으로 DLL Injection이 진행되었다. 경로에 따라 Load되는 DLL을 처리할지 처리하지 않을지 결정하는 것 같다.

 

 

AdvancedOpenProcess 함수는 SeDebugPrivilege를 사용하여 모든 프로세스에 대한 핸들을 구하고 원하는 PID에 대한 핸들을 반환하는 함수이다.

 

위 과정은 아래 두 개의 함수로 구성된다.

 

위 과정을 통해 내가 전달한 PID에 대한 Process Handle을 반환한다.

 

https://support.microsoft.com/ko-kr/help/131065/how-to-obtain-a-handle-to-any-process-with-sedebugprivilege

 

https://support.microsoft.com/ko-kr/help/131065/how-to-obtain-a-handle-to-any-process-with-sedebugprivilege

쿠키가 사용되고 있지 않습니다. 쿠키를 사용하고 페이지를 새로 고치세요.

support.microsoft.com

자세한 과정은 Microsoft에서 제공하는 것을 참고해보자. 

사실 여기도 코드만 띨렁 있긴하다..ㅋ

 

OpenProcess API는 위와 같은 AdvancedOpenProcess 함수로 대체되어 사용된다.

 

이후에 VirtualAllocEx API와 WriteProcessMemory API는 기존과 동일하게 진행되고, 기존에 사용하던 CreateRemoteThread API 대신 내가 구현한 RtlCreateUserThread 함수를 호출한다. 이 함수는 원래 존재하는 API이며 내부에서 그 API를 호출한다.

 

함수의 내용은 아래와 같다.

 

이 내용은 헤더파일에 작성되는 내용이며 RtlCreateUserThread API에 대한 typedef를 반드시 작성해야 한다. 그렇게 해야 LoadLibraryW API를 통해 RtlCreateUserThread API의 주소를 불러왔을 때 형변환 과정을 거친 후에 정상적으로 사용할 수 있다.

 

 

 

실행 과정은 주욱 보면 이해가 될 것이다.

사용되는 API만 달라졌을 뿐 기본적으로 진행되는 흐름은 기존과 비슷하다.

 

[ RtlUserCreateThread API를 이용한 DLL Injector 다운로드 ]

 

dll-injector.zip

 

drive.google.com

[ RtlUserCreateThread API를 이용한 DLL Injector GUI 프로그램 다운로드 (x86) ]

 

SimpleInjector32.exe

 

drive.google.com

[ RtlUserCreateThread API를 이용한 DLL Injector GUI 프로그램 다운로드 (x64) ]

 

SimpleInjector64.exe

 

drive.google.com

 

 

5) Reflective DLL Injection

이 기법은 공부하고 추가로 포스팅하겠다 !! ( 여기에 하든, 추가로 하든.. )

 

 


 

 


위에서 설명한 모든 DLL Injection 방법의 코드 및 실행파일의 사용법은 해보면 안다.
단 주의할 점은 cmd를 반드시 관리자 권한모드로 실행해야 한다는 점이다.

 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함