Frida(2) - 후킹, 쉘 다루기
글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약
1. Frida 후킹
프로세스에 스크립트를 인젝션하기 위한 사전 작업
- 어플리케이션 프로세스 실행 후 자바스크립트 삽입
- 어플리케이션 프로세스 시작되기 전 자바스크립트 삽입
frida -U -f com.android.chrome
com.android.chrome이 Spawned가 된 것을 확인 할 수 있다.
지금은 chrome 메인 스레드가 실행되지 않은 상태이다. 실행되기 전 오랜 시간이 지나면 자동으로 죽는 경우가 있다.
메인 스레드가 실행되지 않고 죽으면 스크립트 삽입이 불가하므로, %resume를 사용한다.
%resume를 사용하면 크롬이 다시 시작된다.
frida -U --pause -f com.android.chrome
-f 옵션으로 명령어를 입력할 때, 자동으로 메인 스레드가 실행되도록 하는 명령어 이다.
1.1. 메인 스레드 시작 전 JS 삽입
frida -U --pause -f com.android.chrome -l <000.js>
1.2. 메인 스레드 동작 중 JS 삽입
# Android Version 확인
Java.androidVersion
# enumerateLoadedClasses 삽입
Java.perform(function(){Java.enumerateLoadedClasses({"onMatch":function(className){console.log(className)},"onComplete":function(){}})})
[그림 2.1-2] 와 같이 구글 크롬을 시작하면 onResume() got called 를 작동시킨다.
위의 코드를 이해하기 위한 동작은 Activity Life Cycle 을 확인하기 바란다.
2. Activity Life Cycle
- Active : 화면에 Activity가 나타나 있고, 사용자와 상호작용할 수 있는 상태이다.
- Paused : 화면에 Activity가 보이기는 하나, 사용자와 상호작용할 수는 없는 상태이다. 화면에 Activity가 보이느냐 여부가 중요하다. 투명한 Activity나 전체 화면을 덮지 않는 특별한 Activity에 의해 현 Activity가 가려졌을 때 이 상태로 이전된다.
- Stopped : 다른 Activity가 위를 덮어, 완전히 화면에서 해당 Activity가 보이지 않게 된 상태이다.
Activity의 생성 및 파괴에 따라 실행되는 이벤트 핸들러는 아래의 순서를 따른다.
- onCreate : Activity가 맨 처음 만들어질 때 한 번 실행된다. 주로 초기화에 해당하는 코드를 넣으며, Activity에 View를 붙이는 곳도 여기다.
- onStart : 초기화가 끝나고 Activity가 사용자에게 보여질 때 호출되는 이벤트 핸들러이다.
- onResume : Activity가 사용자의 입력을 받아 상호작용할 수 있게 되었을 때, 실행된다. 이 이벤트 핸들러의 실행 이후 Activity의 상태는 실행중이 되며, 메인 스레드를 올려 작동한다.
- onPause : Activity가 백그라운드로 가기 직전에 실행된다. 이후는 onStop이나 onResume 둘 줄 하나의 이벤트 핸들러가 이어진다.
- onStop : 사용자에게 더 이상 Activity가 보여지지 않을 때 호출된다. Back 버튼으로 종료하거나, 또는 Home 버튼으로 다른 어플리케이션을 실행하여 현재 Activity 위에 다른 Activity를 올리는 경우를 말한다.
- onRestart : Activity가 중단 (Stopped) 되었으나, 이 상태에서 재시작된 경우 call 된다.
- onDestroy : Activity의 라이프 사이클 중 마지막으로, 이 이벤트 핸들러를 끝으로 Activity는 완전히 소멸된다.
3. 인스턴스화 객체 찾기
인스턴스 객체를 찾기 위해서 js 코드를 아래와 같이 작성한다.
js 코드를 작성해 인스턴스를 확인할 수 있다.
4. 파이썬 바이딩
파이썬 코드로 프리다 기능을 사용한다.
- 프로세스 식별하고 연결
- 연결된 디바이스에서 구현하려는 프로세스와 세션 연결
- 자바스크립트로 작성된 페이로드 자동 삽입
# frida, sys 모듈 가져오기
import frida, sys
# 삽입할 자바스크립트 코드 넣기
jscode = """ payload """
# frida를 시작하고 USB 장치에서 com.your.package.name 프로세스 연결
process = frida.get_usb_device().attach("com.your.package.name")
# jscode에 있는 스크립트 코드를 frida에서 사용할 수 있도록 생성
script = process.create_script(jscode)
# 생성한 script를 로드
script.load()
# script가 동작하기 전에 종료되는 문제 예방
sys.stdin.read()
메세지 처리
send (message [,data])
- 프리다 기반 어플리케이션에 자바스크립트 객체 message 전송
script.on('message', on_message)
- 프리다 스크립트에서 보낸 메세지를 처리할 콜백 함수를 설정
- 호출할 핸들러를 등록하는 과정
on_message(message, data)
- script.on('message', on_message)에서 등록한 핸들러에 대한 정의를 하는 부분
- 단순히 message 매개변수를 콘솔에 출력하는 역할
[출처] 인프런 보안프로젝트 프리다(Frida)를 이용한 안드로이드 앱 모의해킹