-->

DLL 인젝션을 통한 지뢰찾기 코드 후킹 (Code Hooking) 구현

저번 포스팅에서 CreateRemoteThread를 통해 지뢰찾기.exe에 메시지창을 띄우는 스레드를 실행시키는 DLL을 인젝션해보았다. 이번에는 DLL에 메시지창을 띄우는 스레드를 실행시키는 코드 대신에 특정 코드를 후킹하는 Code Hooking 코드를 넣어보려 한다. 사실 코드 후킹이라는 단어를 썼는데 코드 패치라고도 볼 수 있을 것 같다.

 

- 빌드 : VisualStudio 2015

- 환경 : Windows10 x64 / Windows7 x32

 

 

타겟 코드 (함수 호출 코드) 선정

먼저 어떤 함수를 호출하는 코드를 후킹할지를 정해야하기 때문에 간단히 지뢰찾기.exe를 분석할 필요가 있다. 사실 '코드 후킹 = 꼭 함수 호출 코드 부분 후킹'을 의미하는 것은 아니고 다양한데 난 함수 호출 코드 부분을 패치해보기로 했다. 어쨌든 그런데 pdb 파일이 계속 다운이 안돼서 약간의 노가다를 통해 클릭 시 실행되는 함수와 폭탄을 클릭했을 때 게임종료를 위해 게임 전체 결과를 보여주기 직전에 실행되는 함수를 찾았다. 

 

 

 

따라서, 클릭 시 실행되는 sub_100140C 함수를 호출하는 코드 (0x1001FB1)를 게임 종료 직전에 실행되는 sub_1002F80 호출로 변경해 게임 시작 시 바로 게임이 종료되도록 코드 후킹을 해보겠다. 

 

 

 

후킹 코드 구성

참고로 sub_1002F80는 인자로 0xA를 받기 때문에 push 0xA도 같이 넣어주어야 하고 남는 바이트는 0x90(nop)으로 채워준다. ( 총 8바이트 : [FF 75 14 E8 56 F4 FF FF] -> [6A 0A 90 E8 CA 0F 00 00] )

 

 

 

페이지 권한 확인

코드 후킹을 하려면 코드를 패치해야하기 때문에 해당 주소 영역에 WRITE 권한이 있어야 한다. 그런데 아마 대부분 코드 페이지에 WRITE 권한은 없을 것 같다. 확인해보니 PAGE_EXECUTE_READ 권한이므로 WRITE 권한을 주어야한다.

 

 

 

코드 후킹을 수행하는 DLL 코드

DLL 코드는 아래와 같다. export 함수를 제공하는 것이 목적이 아니기 때문에 export 정의는 안해주어도 된다. DllMain에서는 DLL이 로딩될 시 CreateThread로 CodeHooking 스레드를 실행시킨다. CodeHooking은 먼저 코드 후킹이 필요한 8바이트에 대해 페이지 권한을 PAGE_READWRITE으로 변경하고나서 한바이트씩 코드를 변경하게 된다.

 

#include "stdio.h"
#include "windows.h"

DWORD WINAPI CodeHooking(LPVOID lParam)
{
	LPVOID TargetAddr = (LPVOID)0x1001FAE;
	DWORD OldProtect = 0;

	// 0x1001FAE 부터 8바이트 -> 권한 PAGE_READWRITE
	VirtualProtect(TargetAddr, 8, PAGE_READWRITE, &OldProtect);

	// [FF 75 14 E8 56 F4 FF FF] -> [6A 0A 90 E8 CA 0F 00 00]
	*((LPBYTE)TargetAddr + 0) = 0x6A;
	*((LPBYTE)TargetAddr + 1) = 0x0A;
	*((LPBYTE)TargetAddr + 2) = 0x90;
	*((LPBYTE)TargetAddr + 3) = 0xE8;
	*((LPBYTE)TargetAddr + 4) = 0xCA;
	*((LPBYTE)TargetAddr + 5) = 0x0F;
	*((LPBYTE)TargetAddr + 6) = 0x00;
	*((LPBYTE)TargetAddr + 7) = 0x00;

	return 0;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
	HANDLE hThread = NULL;
	switch (fdwReason)
	{
		case DLL_PROCESS_ATTACH:
			hThread = CreateThread(NULL, 0, CodeHooking, NULL, 0, NULL);
			CloseHandle(hThread);
	}
	return TRUE;
}


 

DLL 인젝션 코드

DLL 인젝션 코드는 아래 포스팅에서 제작한 코드와 동일한 코드를 사용했다. 인젝션 관련 내용은 아래 포스팅을 참고하길 바란다.

 


CreateRemoteThread를 사용한 DLL 인젝션 구현

 

CreateRemoteThread를 사용한 DLL 인젝션 구현

간단한 32bit exe인 '지뢰찾기.exe'에 스레드 내에서 메시지창을 실행시키는 DLL을 제작해 인젝션하는 인젝터를 제작해보려 한다. 지뢰찾기.exe를 사용한 특별한 이유는 없고 32bit 프로그램이라면 어떤것이든 (아..

liveyourit.tistory.com

 

 

DLL 인젝션을 사용한 코드 후킹 결과

클릭 시 실행되는 sub_100140C 함수 호출 부분 코드를 폭탄을 보여주는 함수로 후킹했기 때문에 리셋을 수행하는 스마일 버튼을 클릭해도 모든 폭탄을 보여주게 된다. 

 

 

 

아니면, (사실 코드 후킹과 API 후킹이 딱 분류되는 개념은 아니지만...) 후킹할 WinAPI 함수를 정하고 핸들을 얻은 후 GetProcAddress로 함수 주소를 얻고 중간 코드 후킹이 아닌 API의 EP 코드를 변경하는 방식으로 API 후킹 (API Hooking)을 진행할 수도 있을 것이다. 클릭핸들러 내부에서 호출되는 WinAPI를 후킹하면, 클릭시 모든 지뢰가 표시되고 게임이 끝나는 것이 아니라 지뢰가 표시된 채로 게임을 진행할 수 있게 된다.

 

API 후킹과 관련해선 아래 포스팅을 확인하길 바란다.

 


관련포스팅

DLL 인젝션을 통한 지뢰찾기 API 후킹 (Hooking) 구현

 

DLL 인젝션을 통한 지뢰찾기 API 후킹 (Hooking) 구현

저번 포스팅에서는 지뢰찾기에서 클릭시 발생하는 이벤트핸들러 호출 부분 코드를 후킹해서 모든 지뢰가 표시되는 함수 실행이 되도록 해보았다. 이번에는 클릭 이벤트 핸들러 중간에 호출하는 win32u.dll의 NtUse..

liveyourit.tistory.com

 

댓글

Designed by JB FACTORY