728x90

Trampoline Code Hooking은 후킹할 함수의 첫 5바이트를 수정하여 자신이 원하는 함수를 호출시키는 방법이다.


왜 하필 5바이트인가?

그 이유는 EIP의 흐름(실행 흐름)을 변화시키는 JMP문이 5바이트 이기 때문이다.


ex) JMP 00400000

   E9  xxxxxxxx -> 5byte


보통 이런 API Hooking은 DLL Injection과 함께 사용하여


타 프로세스의 기능을 개선시키거나 혹은 기능을 제거하는 등 폭넓게 사용할 수 있다.

(사용 소프트웨어에 하면 불법이라 한다.)


그러나 이번에는 DLL Injection 없이 API Hooking만 실시하였다.




위 코드에서는 새 바이트값을 WriteProcessMemory 함수를 이용해서 덮어씌웠지만


VirtualProtect 함수를 이용해서 해당 메모리의 속성(읽기, 쓰기 등)을 변경하여


memcpy(pFunction, NewBytes, 5); 이런 식으로도 할 수도 있다.




디버거로 확인해 보면


main 함수에서 HookCode()를 호출하기 전 printf의 바이트 값은


이랬지만 HookCode() 호출 후



이렇게 JMP Project1.00401500

        HookFunc함수로 jump하는 코드로 바뀐것을 확인할 수 있다.



실행 시켜보면


hooking 되어 메시지박스를 호출하는 것을 확인 할 수 있다.


[소스 코드] : 

https://github.com/khycan/API-Hooking/blob/master/API%20hooking%20without%20DLL%20Injection/HookingMain.c

728x90

+ Recent posts