본문 바로가기

리버싱!

detours를 이용한 hooking

설치

visual studio 개발자 명령 프롬프트를 열어 실행하거나 해당 링크에서 다운받아준다.

git clone https://github.com/Microsoft/Detours.git

해당 경로로 이동한뒤 makefile이 있는곳에서 nmake를 사용한다. 

기본적으로 32비트 버전을 지원하는데 64비트를 하고싶으면

SET DETOURS_TARGET_PROCESSOR=X64
nmake

다음과 같이 환경변수를 설정후에 nmake를 사용하면된다.

 

 

// dllmain.cpp : DLL 애플리케이션의 진입점을 정의합니다.
#include "pch.h"
#include "C:\Users\USER\Desktop\Detours-master\include\detours.h"
#include<iostream>
#include<WinUser.h>
#pragma comment(lib,"C:\\Users\\USER\\Desktop\\Detours-master\\lib.X86\\detours.lib")
using namespace std;

static HDC(WINAPI* realGetDC)(HWND hWnd)=GetDC;
extern "C" __declspec(dllexport) HDC WINAPI myGetDC(
    HWND hWnd) {
    MessageBoxA(NULL, "hooking test", "test", MB_OK);
    return realGetDC(hWnd);
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        DetourRestoreAfterWith();
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourAttach(&(PVOID&)realGetDC, myGetDC);
        DetourTransactionCommit();
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourDetach(&(PVOID&)realGetDC, myGetDC);
        DetourTransactionCommit();
        break;
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

GetDC를 후킹하는 소스이고 컴파일로 dll파일을 만들어준다.

 프로그램에 dll 연결
 setdll.exe /d:[DLL] [Target EXE]
프로그램에 dll 해제
 setdll.exe /r [Target EXE]

setdll은 Detours-master\bin.X86\에 있다.

 

 

detours전

detours후

 

내가만든 GetDC의 모습

 

진짜 GetDC에 내가만든 GetDC로 가는 코드가 생긴모습

첫번째 jmp는 일단 detours table로 점프하는것 같다.

realGetDC로가는 어셈블리코드

realGetDC의 어셈블리 코드

이해 하는데 이 사진이 도움될것같다. cmd창 명령어로 프로그램이 실행될때 자동으로 dll이 로드되도록 추가해주고 프로그램 실행시 dll이 로드되면서 내가만든 함수로 가게 만들도록 jmp문을 실제 함수주소 앞부분에 추가해준다. 그후 내가 만든 함수로 점프해 내가 원하는 후킹동작을 하게되고 원본함수에 동일한 값을 넘겨주면서 return값을 받아 나가준다.

 

이점을 이용하면 실제 함수는 그대로 두고 실행 함수 전 후로 더 다양하고 효과적인 조작이 가능하다.

실제 함수에 전달되는 인자조작, 종료후 리턴값 조작 등에 더불어 트램펄린 함수가 실행되고 마지막에 실제함수를 동작하기에 후킹의 안정성 또한 높다.

 

https://nameng.tistory.com/147

 

x64 Hooking 공부(메모장을 통한)

// dllmain.cpp : DLL 애플리케이션의 진입점을 정의합니다. #include "pch.h" #include #include #pragma pack(push,1)//구조체 데이터 정렬크기를 1바이트로 정렬, 구조체 변수간에 공간이 있을수있기에 1바이트..

nameng.tistory.com

이전에 했던 후킹도 역시 트램폴린을 이용한 후킹이였다. 이것과 다른점은 dll을 직접 넣어줘야한다는점, 실제 주소의 앞부분을 구조체를 이용해 공간을 만들고 memcpy를 통해 값을 덮어써서 바꿔야하는 점이다. 확실히 MS에서 만든 detours api이고 지금은 무료로 풀렸지만 비싼가격의 툴이였으니 매우 유용할것같다.