Inline hooking
인라인 후킹은 타겟 함수의 실제 코드에 직접 패치를 넣어, 코드 흐름을 다른 함수 또는 분석 코드로 우회시키는 기법입니다.
EDR이 프로그램을 인라인 후킹하여 조건에 따라 분기하는 과정을 실습하기 위해 다음 깃허브로부터 파일을 빌드합니다.
SylantStrike를 빌드하면 SylantStrike.dll과 SylantStlikeInject.exe가 생성되고 ChoiSG 깃허브의 C# 파일을 저장한 뒤 빌드하면 exe 파일이 생성됩니다.
후킹을 하지 않은 상태로 maldev.exe를 실행한 뒤, Windbg에서 Attach to process를 통해 디버깅을 하면 NtProtectVirtualMemory 어셈블리 코드가 아래와 같이 확인됩니다.

이번엔 SylantStrikeInject.exe를 사용하여 maldev.exe를 인라인후킹한 뒤 maldev.exe를 실행합니다.

NtProtectVirtualMemory 함수를 어셈블리어로 확인하면 인라인 후킹이 되어 즉시 00007ffb09f80fd6 주소의 디토어 함수의 진입점으로 점프하는 것이 확인됩니다.

점프하도록 설정된 주소의 어셈블리 코드를 확인하면 00007ffb09f80fdc 포인터로 점프하고, 해당 포인터가 가리키는 주소에서는 00007ffa8c3f1168 주소를 가리킵니다.

마지막으로 00007ffa8c3f1168 주소의 어셈블리 코드를 uf(unassemble function)로 확인합니다.
해당 코드는 디토어 함수 내에서 eax가 40h와 같다면 EDR에서 탐지하여 메시지 박스를 띄우고, 같지 않다면 원래 코드 실행 흐름(트램펄린)을 호출합니다.
1번 영역이 EDR에서 프로그램 내 NtProtectVirtualMemory 함수 실행을 탐지하여 띄우는 분기이고 2번 영역이 원래 NtProtectVirtualMemory 함수 실행 흐름을 호출하는 코드입니다.

실제로 트램펄린이 어떻게 동작하는지 확인하기 위해선 2번 영역의 흐름을 따라갈 수 있는데, 코드 상에서는 00007ffa8c403440 주소의 8바이트 주소만큼을 호출하고 있습니다.

8바이트 주소의 어셈블리 코드를 확인하면 후킹 전의 기존 NtProtectVirtualMemory 함수 코드가 나타납니다. 이러한 이유는 트램펄린은 기존의 코드 흐름을 따라가도록 설계되어야 하기 때문입니다.
이어서 jmp qword ptr [00007ffb09f80fce] 주소를 따라가면 기존의 NtProtectVirtualMemory 함수의 나머지 부분이 확인됩니다.

References
Last updated
