← 목록으로

Frida로 동적 계측/후킹하기

[Rev] 리버싱 · 작성: 2026-07-19 19:34:18 · 조회 5

Frida는 실행 중인 프로세스에 JavaScript 코드를 주입해서, 함수 호출을 가로채고(hook) 인자·리턴값을 실시간으로 보거나 바꿀 수 있게 해주는 동적 계측(Dynamic Instrumentation) 도구다. 바이너리를 패치하지 않고도 동작을 바꿀 수 있어서, 안티디버깅 우회·SSL Pinning 우회·라이선스 체크 우회에 특히 많이 쓰인다.

설치

pip install frida-tools
# 안드로이드/iOS 대상이면 기기(또는 에뮬레이터/탈옥 기기)에 frida-server도 올려야 한다

기본 사용: 함수 후킹

네이티브(C) 함수를 후킹하는 기본 골격이다.

// hook.js
Interceptor.attach(Module.findExportByName(null, "strcmp"), {
  onEnter(args) {
    console.log("strcmp:", args[0].readCString(), "vs", args[1].readCString());
  },
  onLeave(retval) {
    console.log("결과:", retval.toInt32());
  }
});
frida -f ./target -l hook.js --no-pause

이렇게 하면 프로그램이 strcmp를 호출할 때마다 무엇을 비교하는지 콘솔에 그대로 찍힌다 — 라이선스 키 검증 같은 로직을 찾을 때 strings+디스어셈블보다 훨씬 빠른 경우가 많다.

리턴값 조작

함수가 항상 "성공"을 리턴하도록 강제로 바꿀 수도 있다.

Interceptor.attach(Module.findExportByName(null, "check_license"), {
  onLeave(retval) {
    retval.replace(1);   // 무조건 성공(1)으로 덮어쓰기
  }
});

자바/Objective-C 레벨 후킹

네이티브 함수뿐 아니라, 안드로이드의 자바 메서드나 iOS의 Objective-C 메서드도 직접 후킹할 수 있다.

// 안드로이드: 특정 클래스의 메서드 후킹
Java.perform(function () {
  const RootCheck = Java.use("com.example.app.RootCheck");
  RootCheck.isDeviceRooted.implementation = function () {
    return false;   // 루팅 탐지 결과를 항상 false로
  };
});

함수 내부 흐름 추적: Stalker

특정 함수 하나가 아니라, 실행되는 명령어를 통째로 트레이싱하고 싶을 때는 Frida의 Stalker 엔진을 쓴다. 안티디버깅처럼 어디서 감지하는지 위치를 모를 때, 넓은 범위를 훑어서 단서를 찾는 용도로 유용하다.

objection: Frida를 감싼 편의 도구

Frida API를 직접 짜지 않고도 흔한 작업(SSL Pinning 우회, 루팅 탐지 우회, 클래스/메서드 목록 덤프)을 명령어 몇 개로 처리할 수 있게 해주는 래퍼다.

objection -g com.example.app explore
> android sslpinning disable
> android root disable

왜 바이너리 패치보다 Frida를 먼저 시도하는가

다음 두 글(안드로이드/iOS 앱 리버싱)에서 Frida가 실제로 어떻게 쓰이는지 구체적인 시나리오로 이어간다.

리버싱 카테고리의 글 (6/11)

  1. 리버싱이란 무엇인가: 정적 분석 기초
  2. 어셈블리어 읽기 기초 (x86-64)
  3. 동적 분석: 디버거로 실행 흐름 추적하기
  4. 안티 디버깅 / 안티 리버싱 기법과 우회
  5. 패킹과 언패킹: 실행 파일을 압축/암호화해서 숨기기
  6. Frida로 동적 계측/후킹하기
  7. 안드로이드 앱 리버싱: APK 분석 기초
  8. iOS 앱 리버싱 기초
  9. 크랙미(Crackme) 실습 방법론
  10. PE 포맷 내부 구조: Windows 실행 파일 뜯어보기
  11. 코드 난독화 해제: Control Flow Flattening 분석하기
← 패킹과 언패킹: 실행 파일을 압축/암호화해서 숨기기 안드로이드 앱 리버싱: APK 분석 기초 →