상세 컨텐츠

본문 제목

012 DLL Injection

본문

I. Hooking

       : 정보를 엿보고 조작하는 행위

       i. Message Hooking

Windows Message Flow from ReverseCore

             : Event가 발생할 때 OS에서 보내는 메세지를 엿보거나 가로채는 것

       ii. SetWindowsHookEx()

             > hook procedure : 운영 체제가 호출해주는 콜백 함수, 메세지 훅을 걸 때 DLL 내부에 존재

             > hMod : 메세지 훅을 걸 때 DLL의 Instance Handle

            → 이 함수를 이용하여 훅을 설치하면, 프로세스에서 해당 메세지가 발생했을 때 운영 체제가 해당 DLL 파일을 해당 프로세스에 강제 Injection하고 등록된 hook procedure을 호출

       ii. 악성 Key Logger

             : 키보드 입력을 빼돌려 정보를 유출시키는 방법

 

II. DLL Injection

       : 실행 중인 다른 프로세스에 특정 DLL 파일을 강제로 삽입하는 것, 다른 프로세스에게 LoadLibrary() API를 스스로 호출하도록 명령하여 사용자가 원하는 DLL을 로딩하는 것

       : 강제 삽입된 DLL의 DllMain() 함수는 해당 프로세스 메모리에 대한 접근 권한을 가짐

      → 기능 개선 및 버그 패치, 메시지 후킹, API 후킹, 타 프로그램 관리 응용 프로그램, 악성 코드 등

       i. CreateRemoteThread()

             : 원격 스레드 생성

             > 대상 프로세스 핸들 구하기

                  hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)

                  : OpenProcess() API를 이용하여 PROCESS_ALL_ACCESS 권한의 프로세스 핸들 획득(프로그램 실행 파라미터로 넘어온 dwPID값 사용)

                  → 프로세스 핸들을 이용하여 해당 프로세스 제어 가능

             > 대상 프로세스 메모리에 인젝션할 DLL 경로 써주기

                  pRemoteBuf = VirtualAllocEx(hProcess, NULL, dwBufSize, MEM_COMMIT, PAGE_READWRITE);

                   : VirtualAllocEx() API를 이용하여 상대방 프로세스에 DLL 파일 경로 문자열 길이(Terminating NULL 포함)만큼 버퍼 할당

                  WriteProcessMemory(hProcess, pRemoteBuf, (LPVOID)szDllName, dwBufSize, NULL);

                   : 앞에서 할당받은 버퍼 주소(pRemoteBuf)에 WriteProcessMemory() API를 이용하여 DLL 경로 문자열 써주기, WriteProcessMemory() API 역시 hProcess 핸들이 가리키는 상대방 프로세스의 메모리 공간에 쓰는 것

                   상대방 프로세스 메모리 공간에 인젝션할 DLL 파일 경로 써줌

             > LoadLibraryW() API 주소 구하기

                  hMod = GetModuleHandle("kernel32.dll");

                  pThreadproc = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod, “LoadLibraryW");

                   : 프로세스에 로딩된 dll의 LoadLibraryW() API 시작 주소 얻음

             > 대상 프로세스에 원격 스레드(Remote Thread)를 실행

                  hThread = CreateRemoteThread(hProcess, NULL, 0, pThreadProc, pRemoteBuf, 0, NULL);

                  pThreadProc = 프로세스 메모리 내의 LoadLibraryW( ) 주소

                  pRemoteBuf = 프로세스 메모리 내의 dll 문자열 주소

                  : Windows에서 프로세스가 LoadLibraryW() API 호출 명령하게 하는 API를 제공하지 않기 때문에, 다른 프로세스에게 스레드를 실행시켜주는 함수인 CreateRemoteThread() API 사용

 

       ii. Applnit_DLLs

             : Applnit_DLLs 항목에 인젝션을 원하는 DLL 경로 문자열을 쓰고 LoadApplint_DLLs 항목의 값을 1로 변경한 후 재부팅

              실행되는 모든 프로세스에 해당 DLL 인젝션

 

       iii. SetWindowsHookEx()

             : 메세지 훅 설치하여 OS에서 hook procedure을 담고있는 DLL을 프로세스에게 강제로 인젝션

 

II. PE Patch를 이용한 DLL Loading

       i. DLL Loading

             : 대상 프로그램의 실행 파일을 직접 수정하여 DLL을 강제로 로딩, 일종의 Crack

 

III. Code Injection(Thread Injection)

: 상대방 프로세스에 독립 실행 코드를 삽입한 후 실행하는 기법

: 일반적으로 CreateRemoteThread() API를 이용하여 원격 스레드 형태로 실행

: 대상 프로세스에 Thread Procedure 형식의 코드와 스레드의 파라미터 형식의 데이터 전달

: 메모리를 적게 차지, 흔적이 적음, Code Injector 프로그램만 필요, 규모가 작고 간단한 일 수행

'Reversing > Project - 악성 코드, 진실의 방으로' 카테고리의 다른 글

014 Debugger  (0) 2020.09.27
013 API Hooking  (0) 2020.09.26
011 Anti Debugging  (0) 2020.09.25
010 고급 리버싱  (0) 2020.09.25
009 Packer  (0) 2020.09.20

관련글 더보기