2023 공부 로그🐰

악성코드 - PreLab2, Lab2 (DLL 인젝션, DLL 이젝션)

L_Chae 2023. 10. 5. 14:23

1. DLL 인젝션 (CreateRemoteThread() 함수와 LoadLibrary() 함수 이용)

(1) Windows 10 가상머신에 접속한 후, Visual Studio를 구동하여 InjectDll.cpp에 대응되는 InjectDll.exe 파일을 myhack.cpp에 대응되는 myhack.dll 파일을 생성한다. (빈 프로젝트, 유니코드 문자집합, Debug 모드에서 생성함)

 

Process Explorer의 Filter 기능을 이용하면 빠름 ~

(2) notepad.exe 실행 후 notepad.exe의 프로세스 IDProces Explore 프로그램 수행을 통해서 파악한다.

notepad의 PID : 4644(실행할 때마다 바뀜)

 

(3) DebugView를 실행한다.

 

+ InjectDll.cpp의 SetPrivilege 부분 주석처리하기!!

// PowerShell
.\InjectDll.exe 4644 myhack.dll

// cmd
cd (경로)
InjectDll.exe 5312 C:\Users\swu04\source\repos\myhack\Debug\myhack.dll

(4) Windows PowerShell상에서 InjectDll.exe를 실행 (실행 형식: InjectDll.exe notepad.exeID, myhack.dll) 한다. InjectDll. exe 파일과 myhack.dll 파일은 같은 폴더에 있어야 한다.
실행형식에서 myhack.dll의 완전한 경로를 설정해야 한다.

 

(5) DebugView 프로그램에서 myhack.dll이 성공적으로 주입되었다는 메시지를 확인한다.

 

cmd 관리자권한 켜서 하니까 이렇게 뭐가 뜨긴 한다..ㅎ

 

notepad클릭하고 확인해보면 보라색으로 myhack.dll이 인젝션되어 있는 것을 확인할 수 있다.!!

참고 : 23장 DLL 인젝션 : 네이버 블로그 (naver.com)


2. DLL 인젝션 (AppInit_DLLsLoadAppInit_DLLs 이용)

(1) Windows 10 가상머신에 접속한 후, Visual Studio를 구동하여 myhack2.cpp에 대응되는 myhack2.dll 파일을 생성한다. (빈 프로젝트, 유니코드 문자집합, Debug 모드에서 생성함)

 

Windows검색창에 regedit 검색하면 빠르다 ~

(2) 윈도우즈 관리 도구중에서 레지스트리 편집기를 실행하여 아래 경로로 이동한다.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows

 

더블클릭하면 값 편집 가능 ~

(3) AppInit_DLLs 항목의 값에 myhack2.dll의 완전한 경로를 입력한다.

(4) LoadAppInit_DLLs 항목의 값을 1로 변경한다.

레지스트리 값을 편집하게 되면 부팅해도 값이 남아있으므로 공격자가 많이 악용하는 방식임!!

 

myhack2.dll을 확인 가능함

(5) 윈도우즈를 재부팅한 후 user32.dll을 로딩한 모든 프로세스들에 myhack2.dll이 로딩 되었는지 Process Explorer를 통해서 확인한다.


3. DLL 이젝션 (FreeLibrary() 함수 이용)

 

(1) Windows 10 가상머신에 접속한 후, Visual Studio를 구동하여 EjectDll.cpp에 대응되는 EjectDll.exe 파일을 생성한다. (빈 프로젝트, 유니코드 문자집합, Debug 모드에서 생성함)

 

(2) notepad.exe 실행 후 notepad.exe의 프로세스 IDProces Explore 프로그램 수행을 통해서 파악한다.

 

(3) DebugView를 실행한다.

 

// PowerShell
.\InjectDll.exe 4644 myhack.dll

// cmd
cd (경로)
InjectDll.exe 5312 C:\Users\swu04\source\repos\myhack\Debug\myhack.dll

(4) Windows PowerShell상에서 InjectDll.exe를 실행 (실행 형식: InjectDll.exe notepad.exeID, myhack.dll) 한다.
실행형식에서 myhack.dll의 완전한 경로를 설정해야 한다.

 

(5) Process Explore상에서 notepad.exe 프로그램에 myhack.dll이 로딩되어 있는 것을 확인한다.

 

보라색으로 강조되어 있던 myhack.dll이 사라지는 것을 확인할 수 있었음

(6) EjectDll.exe를 실행하여 notepad.exe 프로그램에서 myhack.dll이 이젝되는 것을 Process Explorer를 통해서 확인한다.


유니코드와 멀티바이트 형식의 차이 <<조사해서 넣어두기

유니코드 : wchar_t (2byte)

멀티바이트 : char (영문, 한글 각각 1byte, 2byte)

 

>> tchar << 유니코드와 멀티바이트 둘 다 지원함  ex) _tprintf, _tmain ... 처럼 앞에 t가 붙으면 일반적으로 둘다 지원함

 

예시)

(L"index.html") -> unicode

("index.html") -> multi byte

 

injectDll.cpp 파일 함수들 자세히 살펴보기(주석 위주로..)

https://m.blog.naver.com/ilikebigmac/221470036755

 

MEM_RESERVE와 MEM_COMMIT 옵션
MEM_RESERVE : 예약
MEM_COMMIT : 실제로 할당

 

WriteProcessMemory() : 할당 받은 메모리에 myhack.dll 경로를 작성
LoadLibraryA() : kernel32.dll 안에 정의되어 있음. LoadLibrary의 주소를 구하기 위해서는 GetModuleHandle을 통해 hMod라는 이름으로 Access하고 GetProcAddress로 LoadLibrary의 주소를 가져옴. 이는 pThreadProc에 저장됨
LPTHREAD_START_ROUTINE를 캐스팅 한 이유 : ??? 스레드를 실행하려고.. 엥?

LoadLibraryW() -> LoadLibrary의 유니코드 버전,,

이게 뭔 말이지

 

CreateRemoteThread() : 스레드를 실행할 때 사용하는 함수. notepad.exe안에서 스레드를 실행하는 역할을 했음

pRemoteBuf : 파라미터 중 하나, 로드하고자 하는 DLL 정보가 들어 있음

 

 

실제로 쓴 것 : InjectDll.exe -> kernel32.dll -> LoadLibraryW 주소

원하는것 : notepad.exe -> kernel32.dll -> LoadLibraryW 주소

근데 문제가 없엇음 왜?? : kernel32.dll은 운영체제가 제공해주는 dll이기 때문에 InjectDll이 되었던 notepad가 되었건 거의 모든 프로세스들에 할당되어 있음 

뭐....뭐라는거임?

예를 들어 맨 처음으로 실행된 A 프로세스에 kernel32.dll이 할당되어 있다고 치면 거기서 주소만 참조하는 방식으로 사용하기 떄문에 문제가 발생하지 않음 : kernel32.dll을 거의 모든 프로세스들이 사용하는데 그때마다 할당하기엔 효율적이지 않으니까 하나에 놓고 주소만 참조하는 식인듯!!! 암튼 그래서 둘이 동일한 주소를 참조함

그래서 문제가 발생하지 않고 동일한 loadLibrary()가 호출됨

 

프로시저 / 포인터 / 캐스팅 ... 머드라...

사이즈가 같으면 강제 캐스팅해도 오류 발생 안함 : 악성코드 제작자들이 많이 사용하는 기법

 


myhack.dll

DLL_PROCESS_ATTACH :
    CreateThread() 프로세스의 정의내용 실행

 

g_hMod가 NULL일 경우 현재 뭐... 뭐시기 된 프로세스의 uid?를 가져옴

그ㅡㅡㅡㅡ래서 노트패드를 가져옴

 

_tcsrchr() : strrchr()의 unicode, multi byte 둘 다 허용하는 함수

 

#gragma comment(lib, "urlmon.lib") : 해당 라이브러리를 사용해서 url 파일을 다운  받겠다~

 

 

Zollida...