WriteFileHook.cpp
- 위 소스는 Kernel32.dll의 WriteFile 함수를 후킹하는 DLL의 소스코드입니다. 32비트의 경우 밑에서 설명할 Redirect 루틴을 탈 경우 0x25FF(Absolute Jump)를 사용하고, 실제 함수 구현체 루틴으로 갈 경우 E9(Relative Jump)를 사용합니다. 64비트의 경우 Redirect 루틴을 탈 경우 KernelBase의 함수를 후킹하며, 실제 함수 구현체 루틴으로 갈 경우엔 해당 함수를 바로 후킹하는데 둘 모두 기존 코드를 점프에 필요한 크기만큼 백업해두고 인라인 후킹을 진행합니다.
- Windows 7에서부터 Kernel32.dll 외에 KernelBase.dll 이라는 DLL 파일이 생겨 일부 함수들에 대해 구현은 KernelBase.dll에 존재하고 Kernel32.dll 을 통해호출시 KernelBase.dll 의 함수로 리다이렉트시킵니다. 자세한 내용은 여기 참고. Redirect Call 명령은 0x25FF 로 Absolute Jump를 하고 있기 때문에 x86 환경에서는 이를 주소 오퍼랜드만 변경하여 쉽게 후킹이 가능하지만 x64환경에서는 6바이트만으로는 원하는 메모리 주소로의 점프가 불가능합니다. 이를 위해 위 코드에서는 64비트 환경에서 KernelBase.dll 로의 리다이렉트 코드를 발견할 경우 KernelBase.dll 에서 해당 함수의 주소를 가져와 인라인 후킹을 진행하도록 작성하였습니다. 1
- 함수를 후킹한 후 내부에서 기존 함수를 실행하여 결과를 그대로 반환하고 싶은 경우에는 인라인 후킹을 진행할 때 NOP 다섯 개와 MOV EDI, EDI; PUSH EBP; MOV EBP, ESP로 총 10바이트의 여유 공간이 있기 때문에 이를 이용하여 후킹 함수로의 점프 5바이트, 후킹 함수 내에서 기존 함수 주소 -5로의 점프, 기존 함수 주소 -5에 PUSH EBP; MOV EBP, ESP와 기존 함수 주소 +5로의 점프(EB 05) 2를 넣어 언훅을 하지 않고도 호출이 가능하게 할 수 있습니다. 하지만 x64에서는 함수 도입부가 정형화되어있지 않은데다 위에서 설명한 KernelBase.dll로의 Redirect Call이 있을 경우 6바이트의 여유밖에 없기 때문에 이것이 불가능하여 위 코드에서는 어떤 방식으로 후킹을 하던 간에 내부에서 언훅 후 기존 함수를 실행하고, 다시 후킹을 건 다음 리턴하도록 작성해 두었습니다. 3
- 145번째 줄에서 타겟 함수 주소 - 5를 하는 이유는 여기 참고
'Programming' 카테고리의 다른 글
[Hooking] x86, x64 API Hooking (5) | 2019.06.17 |
---|---|
LD_PRELOAD를 이용한 가변 인자 함수 후킹 (0) | 2019.04.19 |
[C/C++] extern "C"와 네임 맹글링 (2) | 2019.03.29 |
Python + selenium을 이용한 네이버 메일 크롤러 (3) | 2018.09.07 |
Visual Studio에서 보호 기법 해제하고 바이너리 빌드하기 (0) | 2018.07.18 |
[Python] PyV8을 이용한 Javascript 분석 (2) | 2018.04.27 |
댓글을 달아 주세요
비밀댓글입니다
안녕하세요, 답글이 늦었네요.
윈도우 XP나 7에서는 함수 호출시 뭔가 다른 부분이 있어서 아마 동작하지 않는 것이라고 밖에 예상이 되지 않는데요, 최근 너무 바빠서 이걸 지금 확인할 여유가 없네요 ㅠㅠ
나중에 시간이 난다면 확인하여 업데이트해보도록 하겠습니다.
비밀댓글입니다
비밀댓글입니다
많이 배우고 많은 도움이 되었습니다.
감사합니다. ^^