앱 모의해킹/안드로이드

Frida(2) - 후킹, 쉘 다루기

grinidia 2024. 6. 14. 16:57

글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 

 

 


1.  Frida 후킹

프로세스에 스크립트를 인젝션하기 위한 사전 작업

  • 어플리케이션 프로세스 실행 후 자바스크립트 삽입
  • 어플리케이션 프로세스 시작되기 전 자바스크립트 삽입

 

frida -U -f com.android.chrome

[그림 1-1] 후킹

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(){}})})

[그림 1.2-1] onResume 함수 변경
[그림 2.1-2] 프리다에서 실행

[그림 2.1-2] 와 같이 구글 크롬을 시작하면 onResume() got called 를 작동시킨다.

위의 코드를 이해하기 위한 동작은 Activity Life Cycle 을 확인하기 바란다.

 


 

2.  Activity Life Cycle

[출처 : Android Developers

  • Active : 화면에 Activity가 나타나 있고, 사용자와 상호작용할 수 있는 상태이다.
  • Paused : 화면에 Activity가 보이기는 하나, 사용자와 상호작용할 수는 없는 상태이다. 화면에 Activity가 보이느냐 여부가 중요하다. 투명한 Activity나 전체 화면을 덮지 않는 특별한 Activity에 의해 현 Activity가 가려졌을 때 이 상태로 이전된다.
  • Stopped : 다른 Activity가 위를 덮어, 완전히 화면에서 해당 Activity가 보이지 않게 된 상태이다.

 

Activity의 생성 및 파괴에 따라 실행되는 이벤트 핸들러는 아래의 순서를 따른다.

  1. onCreate : Activity가 맨 처음 만들어질 때 한 번 실행된다. 주로 초기화에 해당하는 코드를 넣으며, Activity에 View를 붙이는 곳도 여기다.
  2.  onStart : 초기화가 끝나고 Activity가 사용자에게 보여질 때 호출되는 이벤트 핸들러이다.
  3. onResume : Activity가 사용자의 입력을 받아 상호작용할 수 있게 되었을 때, 실행된다. 이 이벤트 핸들러의 실행 이후 Activity의 상태는 실행중이 되며, 메인 스레드를 올려 작동한다.
  4. onPause : Activity가 백그라운드로 가기 직전에 실행된다. 이후는 onStop이나 onResume 둘 줄 하나의 이벤트 핸들러가 이어진다.
  5. onStop : 사용자에게 더 이상 Activity가 보여지지 않을 때 호출된다. Back 버튼으로 종료하거나, 또는 Home 버튼으로 다른 어플리케이션을 실행하여 현재 Activity 위에 다른 Activity를 올리는 경우를 말한다.
  6. onRestart : Activity가 중단 (Stopped) 되었으나, 이 상태에서 재시작된 경우 call 된다.
  7. onDestroy : Activity의 라이프 사이클 중 마지막으로, 이 이벤트 핸들러를 끝으로 Activity는 완전히 소멸된다.

 


 

3.  인스턴스화 객체 찾기

인스턴스 객체를 찾기 위해서 js 코드를 아래와 같이 작성한다.

[그림 3-1] js 작성
[그림 3-2] 인스턴스 확인

js 코드를 작성해 인스턴스를 확인할 수 있다.

 


 

4.  파이썬 바이딩

파이썬 코드로 프리다 기능을 사용한다.

  1. 프로세스 식별하고 연결
  2. 연결된 디바이스에서 구현하려는 프로세스와 세션 연결
  3. 자바스크립트로 작성된 페이로드 자동 삽입
# 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()

[그림 4-1] 파이썬에서 frida 실행

 

  메세지 처리

 

send (message [,data])

  • 프리다 기반 어플리케이션에 자바스크립트 객체 message 전송

 

script.on('message', on_message)

  • 프리다 스크립트에서 보낸 메세지를 처리할 콜백 함수를 설정
  • 호출할 핸들러를 등록하는 과정

 

on_message(message, data)

  • script.on('message', on_message)에서 등록한 핸들러에 대한 정의를 하는 부분
  • 단순히 message 매개변수를 콘솔에 출력하는 역할

 

[그림 4-1] 메세지 처리
[그림 4-2] 아나콘다 확인

 

[출처] 인프런 보안프로젝트 프리다(Frida)를 이용한 안드로이드 앱 모의해킹