What is Hooking?
1. Hooking이란 무엇일까요?
한 친구가 컵에 물을 따르려고 주방으로 걸어갑니다.
그 순간, 당신이 부드럽게 손목을 잡고 말하죠.
“잠깐만, 이렇게 따르는 게 더 좋아.”
그리고 컵 위치를 살짝 옮겨줍니다.
물은 여전히 컵에 들어가지만, 당신이 개입한 덕분에 방향과 방식이 조금 달라진 것이죠.
이 장면을 프로그램 세계로 옮겨보면 Hooking입니다.
즉, 프로그램이 원래 실행하려던 함수나 메서드의 동작을 중간에서 가로채어 우리가 원하는 방식으로 바꾸는 기술이에요.
쉽게 말해, “원래 가던 길에 잠깐 우회로를 만들어주는 것”이라고 생각하면 됩니다.
그래서 Hooking을 이해한다는 건, “프로그램이 어떻게 숨 쉬는지” 들여다보는 능력을 갖는 것과 같습니다.
2. Hooking의 종류
1) API Hooking – 운영체제와 대화 가로채기
운영체제(API)는 프로그램이 “파일을 열어줘”, “화면에 출력해줘” 같은 부탁을 하는 통로입니다.
API Hooking은 이 부탁이 운영체제에 도착하기 전에 잠깐 가로채서, 전화 교환원이 전화를 다른 사람에게 돌리듯 다른 곳으로 연결하는 방법입니다.
“파일 A를 열어줘” 요청을 “파일 B”로 바꿔 실행하기.
2) Method Hooking – 메서드의 답변 바꾸기
Java, Kotlin, Objective-C 같은 언어에서는 기능이 ‘메서드’라는 형태로 들어 있습니다.
Method Hooking은 메서드 실행 시 입력값이나 반환값을 마치 책의 결말 페이지를 다른 내용으로 갈아끼우듯 바꿔버리는 기술입니다.
로그인 실패를 강제로 ‘성공’으로 돌려주기.
3) Inline Hooking – 코드 안에 갈림길 만들기
메모리에 올라간 기계어 코드의 앞부분(함수 시작 지점)을 수정하여 흐름을 바꾸는 방식입니다.
마치 길목 표지판을 바꿔, 원래 길 대신 다른 길로 보내는 것과 비슷합니다.
결제 금액 차감 코드가 실행되기 전에, 바로 “통과” 시켜버리는 경우.
4) Library Hooking – 라이브러리 호출 바꾸기
프로그램은 DLL(Windows)이나 so(Linux, Android) 같은 라이브러리에서 기능을 불러옵니다.
Library Hooking은 이 불러오는 순간을 가로채, 도서관 사서가 특정 책 대신 다른 책을 건네주는 것처럼 다른 코드를 실행하게 합니다.
이미지 로딩 라이브러리를 가로채어 항상 고양이 사진을 보여주기.
3. 동작 원리 – ‘원래 길목에 새 길을 만드는 과정’
- 원래 목적 설정
누군가 “편의점에 가야지” 하고 길을 나섭니다. → 원래 호출하려는 함수.
- 길목에서 개입
골목 입구에서 “잠깐, 여기 먼저 들렀다 가는 게 어때?” 하며 손목을 잡습니다. → 후킹 함수로 연결 변경.
- 원하는 일 수행
사진을 찍게 하거나, 다른 가게에 들르게 하는 행동. → 후킹 함수 내에서 원하는 작업 실행.
- 원래 길로 돌려보내기 (또는 차단)
일을 마치고 원래 목적지로 보내면 → 원본 함수 호출,
그냥 집으로 돌려보내면 → 원본 함수 미호출.
원본 동작 → 가로채기 → 원하는 조작 → 실행
4. 대표 도구들
도구명 | 특징 | 활용 예시 | 다운로드 |
Frida | 크로스 플랫폼 런타임 후킹 |
실시간 함수 가로채기, 보안 분석, 테스트 | https://frida.re/ |
Xposed Framework | Android 전용 시스템 확장 | 앱 기능 수정, 모듈 기반 기능 추가 | https://repo.xposed.info/ |
Cydia Substrate | iOS·Android 모두 지원 | 탈옥·루팅 환경에서 앱 후킹 | http://www.cydiasubstrate.com/ |
Detours | Microsoft API 후킹 라이브러리 | Windows API 호출 분석·확장 | https://github.com/microsoft/Detours |
5. Hooking의 활용 사례
Hooking은 칼처럼 양날을 가지고 있습니다.
좋은 예시 | 나쁜 예시 |
디버깅 / 성능 분석 접근성 기능 추가 게임 모드 개발 |
루팅 탐지 우회 암호 입력 가로채기 결제 로직 변조 |
6. Hooking 방어 방법
- 코드 무결성 체크
해시·서명 값 비교를 통해 코드가 변조되었는지 확인.
- 안티 디버깅 기법
디버거가 연결되면 즉시 종료하거나 동작 제한.
- 메모리 영역 감시
함수 시작 지점의 메모리 권한 변화, JMP 패치 여부 탐지.
- 런타임 환경 검증
루팅·탈옥 여부, 후킹 도구 프로세스 존재 여부 확인.
이 내용은 다음에 따로 글 작성할게요.
7. 간단한 예시 (Frida)
Java.perform(function() {
var target = Java.use("com.example.CheckRoot");
target.isRooted.implementation = function() {
console.log("루팅 탐지 우회");
return false;
};
});
Android 앱의 CheckRoot 클래스에서 isRooted() 함수 결과를 항상 false로 바꾸는 예시입니다.
8. 마무리
Hooking은 기술적으로 매우 매력적이지만, 악용될 경우 심각한 피해를 야기할 수 있습니다.
보안 연구자는 “알고 대비하는 것”을 목표로,
개발자는 탐지·방어 기법을 설계하는 관점으로 접근해야 합니다.