[분석환경]
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()에 코드를 추가하여 원하는 동작을 수행한다.
이 포스트에서는 세 가지 방법으로 DLL Injection을 구현한다.
- 원격 스레드 생성(CreateRemoteThread())
- 레지스트리 이용(AppInit_DLLs)
- 메시지 후킹(SetWindowsHookEx())
후킹할 DLL 준비
DLL의 프로세스가 Attach 될 때 코드가 동작하도록 작성하였다.
메모장(notepad.exe)가 실행 중일 때 pid를 찾아서 변수로할당하고, 후킹할 dll의 경로를 주어 injection이 동작하도록 한다.
tcsicmp 함수 이용해서 프로세스 이름을 통해 PID 찾아서 Injection 도 가능하다.
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를 할당한다.
PID를 이용, 대상 프로세스의 Handle을 구한다.
아래쪽의 if 문은 할당받은 메모리에 경로를 쓴다.(C:\\myhack.dll)
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() - 다른 프로세스에게 스레드를 호출시켜줌
실행
AppInit_DLLs
레지스트리를 이용한 DLL Injection이다.
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows 경로의 값을 조작한다.
- AppInit_DLLs 항목에 인젝션할 DLL 경로 문자열을 입력한다.
- LoadAppInitDlls 항목의 값을 1로 변경한다.
- 재부팅
= 실행되는 모든 프로세스에 해당 DLL Injection
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 |