본문으로 바로가기

API 후킹 - API 코드 패치 동작 원리

category [ IT ]/리버싱 2015. 11. 29. 21:16

5바이트 코드 패치

실제 API 코드 시작 5바이트 값을 JMP XXXXXXXX 명령어로 패치

후킹된 API가 호출되면 JMP XXXXXXXX 명령어가 실행되어 후킹 함수로 제어가 넘어옴


예시

프로세스에서 원래 DLL의 API가 호출되면 JMP XXXXXXXX으로 패치된 코드에 의해 주입된 DLL로 점프

주입된 DLL의 Unhook()으로 인해 원래 DLL의 API는 복원

주입된 DLL의 CALL에 의해 원래 DLL의 API가 정상 실행 

원래 DLL의 정상 실행 후 주입된 DLL로 리턴

주입된 DLL의 Hook()으로 인해 원래 DLL은 다시 후킹된 상태

주입된 DLL이 종료 되면서 원래 프로세스로 리턴


5바이트 패치는 프로세스의 다른 스레드에서 어떤 함수를 read하고 있을 때 코드 패치를 시도하면 에러가 발생할 수 있는 문제점 존재


7바이트 코드 패치 (핫 패치)

API 시작코드의 위쪽 5바이트 를 E9 XXXXXXXX로 변경 후 API 시작코드 2바이트를 EB F9(JMA 바로 윗칸)로 변경

시작코드가 바로 위로 점프하는 것이므로 API가 호출되면 바로 위의 점프 코드가 실행 (2단 점프)

장점 : 언훅/훅 과정이 필요 없음 

(리턴시 시작코드 바로 밑으로 리턴되기 때문에 언훅/훅 과정이 필요 없음, API코드가 패치된 상태에서도 원본 API를 완벽하게 실행 가능)

단점 : 위의 수정한 7바이트 여유가 없는 API가 존재 

(Ntdll.dll에서 제공하는 API들처럼 코드 크기가 작을 때는 원본 API를 사용자 메모리 영역에 백업해두고 원본 API 시작부분은 5바이트 코드 패치 기법을 사용. 후킹 함수 내부에서 원본 API를 호출하면 백업해둔 API코드를 호출하여 간단하고 안정적인 API 후킹 가능)



'[ IT ] > 리버싱' 카테고리의 다른 글

hInstance와 imagebase  (0) 2015.11.28
프로세스 핸들과 PID의 차이, getprocaddress()  (0) 2015.11.28
리버싱 4장 API 정리  (0) 2015.11.28
리버싱 3장 API 정리  (0) 2015.11.19