오늘은 지난 시간에 이어서 후킹 3편에 대해 포스팅을 해보도록 하겠습니다.
오늘 포스팅할 내용은 Frida라는 동적 바이너리 도구를 사용한 후킹입니다.
frida는 후킹만을 위한 툴은 아니고 실행 중인 프로그램을 마음대로 조작하고 분석할 수 있는 다용도 툴이며 특히 모바일에서 강력하게 사용됩니다.
먼저 저번에 했던 IAT 후킹의 핵심 원리와 동작 방식을 정리한 후 frida와 비교하면서 알아보겠습니다.
IAT 후킹의 핵심 원리 : 정적 구조 조작
- PE 파일의 Import Address Table(IAT)에 있는 함수 주소를 직접 수정해서 후킹
- 정적 구조를 조작하므로 탐지 우회나 유지가 쉽지 않다.
- DLL로 주입된 후 실행되는 HookIAT()함수가 핵심으로 작용한다.
IAT 후킹의 동작 방식
- PE의 IMAGE_IMPORT_DESCRIPTOR를 따라 IAT에 접근
- 타겟 함수(ex: MessageBoxA)의 주소를 검색
- 함수 포인터를 내가 만든 후킹 함수 주소(ex: MyMessageBoxA)로 직접 수정
다음 frida 후킹입니다.
Frida 후킹의 핵심 원리 : 동적 런타임 조작
- 프로세스 실행 후, frida가 해당 프로세스에 attach
- 원하는 함수의 주소에 jmp와 같은 동적 인젝션을 수행
- 실행 중 원하는 위치에 JS로 후킹을 넣을 수 있다.
Frida 후킹의 동작 방식
- 타겟 프로세스에 attach
- frida가 자동적으로 .so 나 .dll형식의 에이전트 주입
- 사용자가 작성한 후킹 스크립트(js)를 동적 실행
글로만 읽으시면 살짝 이해가 안되시겠지만 frida는 iat후킹보다 훨씬 쉽고 범용적인 느낌이 있습니다.
구현 방식이 조금 차이가 있고 각자 장단점이 조금 있는 것 같습니다.
그래도 frida가 가진 강점이 워낙 강력해서 리버싱을 한다면 반드시 배워야하는 것 같습니다.
frida 툴의 설치 방법에 대해 알려드리겠습니다.
pip install frida-tools frida
*환경변수 PATH에 python,pip이 포함되어 있어야 합니다.
설치하고 나면 다음과 같은 기본 명령어가 가능합니다.
//실행중인 프로세스 목록 보기
frida-ps

명령어 입력시 현재 실행중인 프로세스 목록과 PID를 출력해줍니다.
//프로세스 attach
frida -n <프로세스이름> //프로세스 이름으로 attach
frida -p <PID> //PID로 attach
frida -n <프로세스명> -l hook.js //hook.js를 로팅해서 attach
위의 명령어들은 후킹 및 attach 명령어입니다.

위의 멜론 플레이어의 pid에 attach를 시도했더니 성공한 모습입니다.
다음의 기본 로그 출력 명령어를 입력해보겠습니다.
console.log("Hello World!");

정상적으로 출력됨을 확인 가능합니다.
이번에는 로딩된 DLL을 확인하는 코드입니다.
Process.enumerateModules().forEach(m => console.log(m.name));

실행하면 dll 목록이 쭉 뜨는것을 확인했습니다.
다시 frida 명령어로 돌아가보겠습니다.
다음은 트레이싱 명령어입니다(자동 후킹 템플릿 생성)
frida-trace -n <프로세스명> //attach후 tracing용 핸들러 생성
frida-trace -n <프로세스 명> -i <함수명> //특정 함수만 tracing
트레이싱 명령을 실행하면 현재 디렉토리에 __handlers__/ 폴더 안에 JS 스크립트 템플릿이 자동 생성됩니다.
저번에 만들었던 victim.exe에 연결을 해보겠습니다.
frida-trace -n victim.exe -i MessageBoxA

*frida를 attach를 하려면 victim.exe를 실행시켜둬야 합니다.
해당 명령어를 입력하게 되면 현재 디렉토리인 C:\users\1의 handler안에 js파일이 생성됩니다.


해당 js를 수정해서 후킹을 하는것도 가능하고, 후킹 스크립트를 먼저 작성한 뒤 frida -n 명령어로 attach하는 것중 편하신 것을 선택하시면 됩니다.
단순히 하나의 함수만 후킹할 경우엔 frida-trace를 통해 후킹을 하는것이 더 편할 수는 있습니다.
저번에 IAT후킹과 똑같은 동작을 하는 frida 후킹 코드를 작성해보겠습니다.
먼저 frida로 frida -n으로 후킹을 하려면 두가지가 필요합니다.
- exe 실행 파일(victim.exe)
- JavaScript 후킹 스크립트
- 스크립트를 제어해주는 Python 코드 (필수는 아님)
후킹 단계별로 실습해보겠습니다.
1. exe 실행 파일
#include <windows.h>
int main() {
MessageBoxA(NULL, "Hello", "Original", MB_OK);
return 0;
}
먼저 실행파일은 저번에 사용했던 코드 그대로 작성해주겠습니다.
//컴파일 명령어
cl victim.c /Fe:victim.exe user32.lib
2.JavaScript 후킹 스크립트 작성
저번과 비슷한 방식으로 설명을 작성하겠습니다. 전체 스크립트는 다음과 같습니다
// hook.js
Interceptor.attach(Module.getExportByName("user32.dll", "MessageBoxA"), {
onEnter: function (args) {
Memory.writeAnsiString(args[1], "poiri3r");
}
});
저번의 IAT 후킹보단 코드가 확실히 짧고 간결합니다.
하지만 Frida 내장함수들은 처음 보기 때문에 간단하게 설명 드리겠습니다.
Interceptor.attach(address,callbacks)
Frida의 후킹기능을 담당하는 핵심 함수입니다.
실행중인 프로세스의 시작 주소를 후킹해서 함수 진입점(onEnter)과 종료(onLeave) 시점에 코드를 삽입하거나, 함수를 변경하게 해줍니다.
Module.getExportByName(DLL NAME, FUNC NAME)
//반환값 : 함수 주소(NativePointer)
첫번째 인자로 DLL 또는 SO 파일 이름, 두번째 인자로 함수 이름을 받아 그 함수의 주소값을 return해주는 함수입니다.
일반적으로 Interceptor.attach의 첫번째 인자로 들어가게 됩니다.
저희가 원하는 함수를 넣으면 Frida가 알아서 entry point 주소를 찾아내줘서 매우 편리한 기능을 제공합니다.
//두번째 인자로 들어가는 callbacks
onEnter : function (args) {
//명령어
}
onLeave : function (retval) {
//명령어
}
onEnter 명령어와 onLeave 명령어는 둘 다 있어도 되고 하나만 넣어도 상관 없습니다.
여기서 onEnter의 args에는 후킹하려는 함수의 인자가 배열형식으로 들어가게 됩니다.
onLeave의 retval에는 함수의 리턴값이 들어가게 됩니다. 해당 값을 이용하면 함수의 리턴 값 자체를 바꿀 수 있습니다.
Memory.writeAnsiString(address, string)
메모리의 특정 주소(address)에 null로 끝나는 string을 넣습니다.
개별함수들에 대해 살펴보았으니 전체코드에 주석을 달고 살펴보겠습니다.
//user32.dll의 MessageBoxA에 attach
Interceptor.attach(Module.getExportByName("user32.dll", "MessageBoxA"), {
//함수가 실행될 때
onEnter: function (args) {
//MessageBoxA의 2번째 인자에 poiri3r를 입력
Memory.writeAnsiString(args[1], "poiri3r");
}
});
저번에 IAT 후킹한다고 고생했던거에 비하면 아주아주 간단한 코드입니다.
코드를 저장해준뒤 셸을 키고 frida로 어태치해주면 끝입니다.
한가지 유의해야할점이 있는데 frida는 동적분석도구이므로 프로세스가 실행된 상태가 아니면 attach가 불가능합니다.

따라서 명령어를 입력해주어도 unable to find process가 뜨면서 오류가 발생하는데, 저희가 작성한 victim.exe가 굉장히 짧고 실행되자마자 출력 후 종료되는 코드이기 때문에 코드가 실행되기 전에 hook.js가 실행되게 해야합니다.
그래서 frida에서 제공하는 -f 옵션을 사용해야합니다.
-f 옵션은 Frida가 타겟 프로그램을 직접 실행하면서 attach해줍니다.
frida -f victim.exe -l hook.js
위 코드를 입력해주면

저번과 똑같이 hello 문자열 대신 poiri3r 문자열이 출력되었습니다.
이번 포스팅에서는 frida를 통한 후킹에 대해 알아봤습니다.
frida는 사용 난이도에 비해 정말 강력한 기능을 제공해줘서 편리함이 있는 것 같습니다.
하지만 매번 뭔가를 익혀갈때마다 내장 함수라던가 이런 명령어들을 익히는 것에 대한 부담감이 좀 있긴한데, 요즘은 ai가 다 알려주기도 해서 다행인 것 같습니다.
다양한 언어들의 다양한 내장함수들의 명령어들을 외우는건 컴퓨터공학과라면 직종 상관없이 평생 안고가야 되는 부분인 것 같습니다.
다음 시간에는 마찬가지로 frida로 윈도우내장함수 후킹 실습을 준비해보겠습니다. 또 드림핵 리버싱 5단계의 captain-hook write-up을 작성해보고 싶은데 드림핵 문제 롸업은 비공개로 작성해야 되지 않을까 싶네요.
C언어도 공부해야되고 프로젝트 구상도 해야되는데 참 공부할게 많은 것 같습니다.
이래저래 잡설이 좀 많았는데 이상으로 포스팅을 마치겠습니다. 읽어주셔서 감사합니다~

'취약점분석 > Reversing' 카테고리의 다른 글
| [Reversing] Hooking - 5 (Inline Hooking ①) (0) | 2025.07.19 |
|---|---|
| [Reversing] Hooking - 4 (Frida Hooking ②) (3) | 2025.07.12 |
| [Reversing] Hooking -2 (IAT Hooking) (0) | 2025.07.05 |
| [Reversing] Hooking - 1 (DLL,IAT 이론) (2) | 2025.07.05 |
| [Reversing]콜링 컨벤션(Calling convention) -2 (64 bits) (1) | 2025.06.27 |