DLL Injection 실습

[분석환경]
Windows 10 Pro 64bit

[분석도구]
PEiD, Stud_PE, BinText, PEView, OllyDbg

1. DLL(Dynamic Load Library)?

동적 연결 라이브러리의 약자이다. 한번 로딩된 DLL의 코드, 리소스는 Memory Mapping 기술로 여러 Process에서 공유, 업데이트 시 DLL 파일만 교체

실행 환경의 dll버전차이, 호출 함수의 위치(주소) 불확실 등의 이유로 사용한다.

     컴파일러 함수의 실제 주소가 저장될 위치만 준비 후 CALL

     PE 로더 준비한 위치에 실제 함수의 주소를 입력

     코딩할 때 실제 주소를 하드코딩하지 않음

 

DLL 사용 시 응용프로그램의 모듈화 - 쉬운 기능 업데이트, 재사용의 장점

중복코드 사용의 감소로 적은 리소스 사용의 장점이 존재한다.

 

2. DLL 호출 방법

  • 암시적 링크   
    • 프로세스가 시작될 때 dll을 가져온다.
    • 어떤 함수를 사용할지 호출의 구현이 필요하다.
    • 한 번 로드 후 프로세스 주소 공간에 남아 있다.
  • 명시적 링크
    • 프로세스가 실행 중일때 dll을 가져온다.
    • LoadLibrary, GetProcAddress, FreeLibrary ...

3. DLL Injection

  • 실행 중인 다른 프로세스에 특정 DLL을 강제로 삽입하는 것
  • = 다른 프로세스에게 LoadLibrary()를 스스로 호출하게 하는 것
  • DLL Loading과의 차이, 로딩 대상 프로세스가 자신 or 자신이 아닌 다른 프로세스
  •  

  • Injected DLL은 이미 로딩된 DLL과 같은 권한을 가진다.
  • 프로세스에 DLL이 로딩되면 자동으로 DllMain()함수를 실행한다.
  • DllMain()에 코드를 추가하여 원하는 동작을 수행한다.

DllMain()

이 포스트에서는 세 가지 방법으로 DLL Injection을 구현한다.

  1. 원격 스레드 생성(CreateRemoteThread())
  2. 레지스트리 이용(AppInit_DLLs)
  3. 메시지 후킹(SetWindowsHookEx())

후킹할 DLL 준비

DLL_PROCESS_ATTACH 이후 사용자 코드 삽입

DLL의 프로세스가 Attach 될 때 코드가 동작하도록 작성하였다.

main()

메모장(notepad.exe)가 실행 중일 때 pid를 찾아서 변수로할당하고, 후킹할 dll의 경로를 주어 injection이 동작하도록 한다.

tcsicmp 함수 이용해서 프로세스 이름을 통해 PID 찾아서 Injection 도 가능하다.

 

process_name_to_pid()

CreateToolhelp32Snapshot()

파라미터 - dwFlags(모든 프로세스 스냅), th32ProcessID(프로세스 ID 스냅)

성공 - 스냅샷의 핸들 반환

실패 - INVALID_HANDLE_VALUE

 

http://msdn.microsoft.com/en-us/library/ms686837(v=VS.85).aspx

DWORD dwFlags ::  =================
TH32CS_SNAPPROCESS 모든 프로세스를 스냅
TH32CS_INHERIT // 상속 가능한 핸들을 스냅
TH32CS_SNAPHEAPLIST //Heap 안에 있는 프로세스들을 스냅
TH32CS_SNAPMODULE // 프로세스 모듈정보를 스냅
TH32CS_SNAPTHREAD // 프로세스 스래드 스냅
TH32CS_SNAPALL // 시스템에 있는 모든 프로세스, 모듈스레드를 스냅

 

_tcsicmp() : 대소문자 구분 없이 문자열을 비교한다.

pid에 구한 Process ID를 할당한다.

 

dll_injection()

PID를 이용, 대상 프로세스의 Handle을 구한다.

아래쪽의 if 문은 할당받은 메모리에 경로를 쓴다.(C:\\myhack.dll)

dll_injection() 계속

LoadLibraryW()의 주소를 구한다. 

GetProcAddress()

notepad.exe에 로딩된 kernel32.dll 주소를 로딩하지 않는 이유?

 - Windows 주요 dll은 프로세스마다 같은 주소에 로드된다.

 - dll_inject_EX.exe와 notepad.exe의 LoadLibraryW()의 주소는 같다.

 - 이외에도 msvcrt.dll / user32.dll / gdi32.dll / kernel32.dll / shell32.dll /  등이 포함된다.

 - 핵심 dll 파일들이 자신만의 고유 주소에 로딩되는 것을 보장한다.

 - DLL Injection의 핵심 원리이다.

 

CreateRemoteThread()

lpStartAddress - LoadLibrary() 주소 전달

lpParameter - dll 경로 문자열(C:\\myhack.dll)주소

 

dll load - notepad.exe가 LoadLibraryW() 호출

dll Injection - CreateRemoteThread() - 다른 프로세스에게 스레드를 호출시켜줌

 

실행

Process Explorer에서 확인한 injection된 dll

 

메모장 프로세스에 dll injection 결과

AppInit_DLLs

레지스트리를 이용한 DLL Injection이다.

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows 경로의 값을 조작한다.

  1. AppInit_DLLs 항목에 인젝션할 DLL 경로 문자열을 입력한다.
  2. LoadAppInitDlls 항목의 값을 1로 변경한다.
  3. 재부팅

= 실행되는 모든 프로세스에 해당 DLL Injection

AppInit_DLLs 값

Review

실습에서는 메시지박스를 띄우는 코드를 작성했지만 Injection 후 악의적인 작업을 수행하는 코드를 수행하도록 하면 악성코드로 동작하게 할 수 있다. 실제로 현재 운영중인 시스템 다양한 곳에서 사용되고 있는 기법이다. 여러가지 기법을 소개했지만 CreateRemoteThread()를 사용하는 방법이 가장 일반적이다.

반응형

'Reversing' 카테고리의 다른 글

[Frida] Binary Hooking 2  (0) 2022.05.03
[Frida] Binary Hooking 1  (1) 2022.04.28
[Reversing] Windows 10 Anti-Reversing 기법 2  (0) 2020.12.10
[Reversing] Windows 10 Anti-Reversing 기법 1  (0) 2020.12.09
[Binary] PETya 랜섬웨어 분석  (0) 2020.11.27