[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)으로 덮어쓰기
}
});
네이티브 함수뿐 아니라, 안드로이드의 자바 메서드나 iOS의 Objective-C 메서드도 직접 후킹할 수 있다.
// 안드로이드: 특정 클래스의 메서드 후킹
Java.perform(function () {
const RootCheck = Java.use("com.example.app.RootCheck");
RootCheck.isDeviceRooted.implementation = function () {
return false; // 루팅 탐지 결과를 항상 false로
};
});
특정 함수 하나가 아니라, 실행되는 명령어를 통째로 트레이싱하고 싶을 때는 Frida의 Stalker 엔진을 쓴다. 안티디버깅처럼 어디서 감지하는지 위치를 모를 때, 넓은 범위를 훑어서 단서를 찾는 용도로 유용하다.
Frida API를 직접 짜지 않고도 흔한 작업(SSL Pinning 우회, 루팅 탐지 우회, 클래스/메서드 목록 덤프)을 명령어 몇 개로 처리할 수 있게 해주는 래퍼다.
objection -g com.example.app explore
> android sslpinning disable
> android root disable
다음 두 글(안드로이드/iOS 앱 리버싱)에서 Frida가 실제로 어떻게 쓰이는지 구체적인 시나리오로 이어간다.