본문 바로가기
리버싱

API 후킹 방식

by u0jin 2020. 3. 22.

< API 후킹 테크 맵 >



< 후킹 방식에 따른 분류 >




Where?


  • IAT (Import Address Table )

: IAT에 있는 API 주소를 후킹 함수 주소로 변경하는 방법


장점 - 가장 단순함, 구현방법이 가장 쉬움

단점 - IAT에 없는데 프로그램에서 사용되는 API의 경우 후킹불가능 (예 - DLL을 동적으로 로딩해서 사용하는 경우 )



  • code 
: 프로세스 메모리에 매핑된 시스템 라이브러리 (DLL)에서 API의 실제 주소를 찾아가 코드를 직접 수정해버리는 방법

* 가장 널리 사용되는 방법


구현에 있어서 다양한 옵션이 존재

- 시작 코드를  JMP명령어로 패치하는 방법
- 함수 일부를 덮어쓰는 방법
- 필요한 부분만 일부 변경하는 방법



  • EAT
: DLL 의 EAT ( Export Address Table ) 에 기록된 API의 시작주소를 후킹함수 주소로 변경하는 방법

* 구현은 간단하지만, code 방법이 더 간단하고 강력함. => EAT 수정방법은 잘 사용되지않는다.




How?


후킹 대상 프로세스 메모리에 침투하여 후킹 함수를 설치하는 구체적인 방법

  • 디버그 (Debug) VS 인젝션(Injection)

  • 인젝션 -> Code VS DLL



Debug

: 대상 프로세스를 디버깅 하면서 API를 후킹하는 방법


  • 디버거 = 디버깅을 당하는 프로세스인 디버기에 대한 모든 권한 ( 실행제어, 메모리 액세스,기타 )을 가짐

    ==> 디버기의 프로세스 메모리에 후킹 함수를 자유롭게 설치 가능


디버거는 후킹을 위해 사용자가 직접 제작한 프로그램이다.

프로그램에서 debug api를 이용하여 대상 프로세스에 attach하고, (실행이 잠깐 멈춰진 상태에서) 후킹함수를 설치, 설치후, 실행을 재개시키면 api 후킹이 이뤄진다.




기존 디버거 ( ollyDbg, WinDbg, IDAPro )에 자동화 스크립트를 사용하여 api 후킹을 자동화하는 방법도 있다.

구현만 완벽하다면, (하나의 프로새스에 대한 ) 가장 강력한 후킹방법이다.

API 후킹뿐아니라, 필요에 따라서 실행 흐름까지도 완벽히 제어할수 있다.

따라서 API 후킹 도중이라도 사용자가 Interactive하게 프로그램의 실행을 멈추고 API 후킹을 추가/수정/제거 등의 작업을 할수 있다. ** 다른 방식과의 큰 차별점 **

단점 - 디버거에 대한이 필요함 (or 자동화 스크립트에 대한 지식) & 안정적인 동작을 위한 많은 테스트가 필요

-> 이런 단점 때문에 강력하지만 널리 사용되지는 않는다.




인젝션

: 해당 프로세스 메모리 영역에 침투하는 기술

  • DLL 인젝션 - 가장 많이 사용되는 방법

: 대상 프로세스로 하여금 강제로 사용자가 원하는 DLL 파일을 로딩하게 만드는 기술

인젝션할 DLL에 미리 후킹 코드와 설치 코드를 만들고, DIIMain()에서 설치코드를 호출해주면 , 인젝션되는 순간에 API후킹이 완료된다.

  • Code 인젝션

: DLL 인젝션보다 좀 더 발전된 기술, 주로 악성코드( 바이러스, 셸코드, 기타) 에서 많이 사용된다.

(DLL 인젝션은 AV제품에서 탐지가 잘 되므로, 악성코드들은 좀더 탐지 하기 어려운 Code 인젝션을 많이 시도하고있다.)


Code 인젝션이 DLL인젝션보다 까다로운 이유?


DLL 인젝션처럼 완전한 형태의 PE Image 가 아니라, 실행 코드와 데이터만 인젝션된 상태에서 자신이 필요한 API주소를 직접 구해서 사용해야한다.

또, 코드 내의 메모리 주소에 접근할때 잘못된 주소를 액세스하지않도록 주의 해야한다.

'리버싱' 카테고리의 다른 글

Debug  (0) 2020.03.22
후킹이란?  (1) 2020.03.22

댓글