미친해커

[Reversing] Trampoline(Inline) Hooking x64 Step 0 본문

Reversing/Hooking

[Reversing] Trampoline(Inline) Hooking x64 Step 0

미친해커 2022. 5. 3. 12:47
반응형

해당 글을 읽기 전에 리버싱 또는 후킹에 대한 기본적이 지식이 없으신 분들이라면 아래 글을 모두 숙지 후에 와주세요.

 

[Reversing] Trampoline(Inline) Hooking x86 Step 0

Trampoline Hooking Trampoline Hooking 이란 타겟 API의 상위 n바이트를 jmp 어셈블리로 패치하여 후킹하는 기법을 말한다. Trampoline Hooking은 x86과 x64에서의 기술 구현 방법이 미세하게 다르다. 그렇기 때..

crazyhacker.tistory.com

Trampoline Hooking

Trampoline Hooking 이란 타겟 API의 상위 n바이트를 jmp 어셈블리로 패치하여 후킹하는 기법을 말한다.

Trampoline Hooking은 x86과 x64에서의 기술 구현 방법이 미세하게 다르다. 그렇기 때문에 위 설명에서 n바이트라고 하였다.

How to Trampoline Hooking from x64 system

x64 시스템에서의 후킹 방법은 다음과 같다.

타겟 API의 상위 12바이트를 mov and jmp 어셈블리로 패치하여 후킹한다. 여기서 12바이트인 이유는 x64 시스템은 주소체계가 8바이트이기 때문에 기존의 x86의 후킹 방식으로는 4바이트 이상의 범위에 있는 주소로는 점프하지 못한다는 단점이 존재한다.

예를 들어 8바이트 주소 체계에서 계산한 상대 주소가 4바이트를 초과한다면 기존의 5바이트를 이용한 jmp 어셈블리로는 타겟 주소까지 이동할 수 없는 일이 생기게 된다. 그렇기 때문에 x64 시스템에서 안정적으로 후킹을 하기 위해서는 8바이트 주소로 점프할 수 있는 레지스터를 사용한 간접 점프(Indirect jump)를 이용한다면 된다.

How to Trampoline Hooking using Indirect Jump from x64 system

위에서 말했던 것처럼 12바이트를 이용한 mov and jmp 어셈블리 패치를 이용하면 된다. x64 시스템으로 넘어옴에 따라 레지스터도 기존 4바이트에서 8바이트로 드러났음을 알 수 있다. 이를 이용해 레지스터를 이용한 간접 점프를 활용해 x64 시스템에서 안정적인 후킹을 진행할 수 있다. x64 시스템에서의 후킹 방법은 다음과 같다.

x86 시스템과 다르게 바로 해당 주소로 점프하지 않고 레지스터에 주소를 넣은 후에 점프를 시도한다. (rax 레지스터를 사용하는 이유는 시스템에서 rax 레지스터의 값은 언제든 변경될 수 있기 때문에 중요한 값을 저장하지 않고 해당 값을 보존해 주지 않아도 되기 때문이다.) 또한 점프할 주소까지의 상대거리를 구하지 않아도 된다는 장점이 존재한다. 다만 후킹하는 코드가 2배 이상 늘어났다...

마무리

이번 포스팅에서 x64 시스템의 후킹 방법에 대해서 간단하게 알아봤으며 x86 시스템의 후킹 방법을 채용할 수 없는 이유 또한 설명했다.

반응형
Comments