4-1공부/리버스엔지니어링

[기말고사] 12. DLL & DLL Injection

KGW2027 2023. 6. 18. 05:07
728x90
반응형

 C에서 DLL을 만드는 방법은 /dll /out:<dllname>.dll 를 컴파일 과정에 추가로 입력하는 것이다.
이 때, DLL을 실행하면 C 코드 내의 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)라는 함수가 자동으로 실행된다. 또한,
 C코드에서 명시적으로 DLL을 불러오고 해제하려면 LoadLibrary와 FreeLibrary 함수를 사용하면 된다. (windows.h)

 이 떄, LoadLibrary로 DLL을 로드하고, GetProcAddress를 이용해 함수 포인터를 얻어 실행하는 방법Explicit Linking이라고 한다. 이것에 반대되는 방법도 존재하는데, 바로 Implicit Linking이다. include문과 같이 #pragma comment (lib, "Lib Path")를 입력하면 컴파일 과정에서 DLL을 로드하고, 존재하는 함수를 GetProcAddress와 같은 함수 포인터를 구하는 함수 없이 사용할 수 있게 된다.

 

 DLL Injection이란, 실행 프로그램에 내가 만든 DLL을 작동시키도록 집어넣어서 원하는 동작을 추가하는 것이다. 이것은 게임에서 플러그인/모드를 개발하는 방식이 될 수도 있고, 어떤 프로그램에 키보드 입력을 인식하는 프로그램을 넣어 정보 유출에 사용될 수도 있다.

 DLL Injection을 수행하는 한 방법은, DLL Injection을 수행할 프로세스를 찾은 뒤, 프로세스의 가상 메모리에 접속, DLL의 정보를 프로세스가 참조하는 메모리 위치에 작성한다. 그리고 해당 프로세스에서 스레드를 실행하여 DLL이 작동하도록 만드는 것이다.
 1. 실행중인 프로세스를 전수탐색하여 원하는 프로세스를 찾는다. (OpenProcess)
 2. 목표 프로세스에 추가적인 가상 메모리 공간을 할당한다. (VirtualAllocEx)
 3. DLL의 주소 정보를 2에서 할당한 공간에 입력한다. (WriteProcessMemory)
 4. Kernel32.dll의 LoadLibrary 함수의 포인터를 탐색한다. (GetModuleHandle, GetProcAddress)
 5. 목표 프로세스에서 LoadLibrary의 인수를 2의 주소로 하여 원격 실행한다. (CreateRemoteThread)
 6. (선택) 작업을 완료한 후, 같은 방식으로 FreeLibrary를 수행한다.
※ CreateRemoteThread(1의 결과, NULL, 0, 4의 결과, 2의 결과, 0, NULL)

 또 다른 방법은 PE를 조작하여 프로그램 실행부터 DLL을 로드하도록 할 수 있다. 이 방식은 Permanent Injection이다.
IAT는 rdata 세션에 위치하는데, rdata 전체 데이터를 복사하여 PE 파일 끝에 추가한다. 그리고 오프셋과 크기를 수정해서 rdata의 범위를 넓힌다. 이후, IAT도 복사해서 rdata의 빈 공간에 넣고, IAT 끝에 ILT, DLL주소, IAT의 총 12바이트를 입력한다. 마지막으로 읽기,쓰기와 같은 권한까지 추가해주면 된다.
 1. rdata를 전체 복사하여 PE 파일 끝부분에 추가하고 세션 헤더에서 오프셋을 수정, 사이즈도 기존보다 크게 수정한다.
 2. IAT를 전체 복사하여 rdata의 끝부분에 추가된 여유 공간에 붙여놓는다. 이 때, 옵션 헤더의 IAT에 대한 오프셋, 크기도 수정한다.
 3. Image Import Descriptor 형태에 맞게 IAT 끝쪽에 Name, ILT, IAT 정보를 입력한다.
 4. 프로그램 실행 권한을 위해 다른 DLL을 로드할 때 쓰는 Firstchunk 값 등을 복사하여 사용한다.

728x90
반응형

'4-1공부 > 리버스엔지니어링' 카테고리의 다른 글

[기말고사] 10-11. PE & IAT  (1) 2023.06.18
[기말고사] 9. 호출 규약  (0) 2023.06.18
[기말고사] 7. 제어문  (0) 2023.06.18
[중간고사] asm1  (0) 2023.04.16