본문 바로가기

보안/Mobile_APP

[APP Hooking] Android 모바일 앱(Uncrackable-Level1.apk) 후킹_Level1

반응형

1. 실습 환경

(1) 삼성 갤럭시 S7 : 버전(안드로이드 8.0), 루팅상태, frida-server 실행, 

(2) windows 10 pro : frida 설치, python 3.8(64bit)

(3) APP 파일 : Uncrackable-Level1.apk

 

OWASP/owasp-mstg

The Mobile Security Testing Guide (MSTG) is a comprehensive manual for mobile app security development, testing and reverse engineering. - OWASP/owasp-mstg

github.com

 

2. 코드 분석

앱을 실행결과 루팅 탐지 및 차단을 하고 있다.

Uncrackable1 앱을 클릭하여 실행
실행 결과 루팅 탐지 확인

 

코드 분석 도구인 JEB를 이용하여 코드를 분석한다.

JEB도구로 MainActivity 확인

MainActivity 확인 결과 if문을 이용하여 루팅 및 디버깅 탐지하고 있는것을 확인하였다.

onCreate 함수

onCreate 함수에서 참이면 a함수를 실행한다.

그 결과 Root detected! 스트링 문자와 This in unacceptable. The app is now going to exit. 스트링 문자가 출력되며 OK 버튼 클릭시 onClick 함수를 실행하여 앱을 종료한다.

a 함수 및 onClick 함수 확인

우회 방법은 앱이 종료되지 않도록 우회를 시도해 보도록 한다.

다양한 방법중 Frida Hooking 기법을 이용하여 우회를 시도하겠습니다.

 

3. Frida Hooking 코드 작성

System.exit 함수가 호출되면 앱이 종료되기 때문에 System.exit 함수가 호출될 때 함수를 Hooking하여 앱이 종료되지 않도록 한다.

 

import frida, sys
def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)
PACKAGE_NAME = "owasp.mstg.uncrackable1"
jscode= """
setImmediate(function(){
    Java.perform(function(){
        console.log("[*] Hooking System.exit");
        var exitBypass = Java.use("java.lang.System");
        exitBypass.exit.implementation = function() {
            console.log("[*] System.exit Success");
        }
      })
});
"""
try:
    print('[*] By Daze !!!')
    print('')
    device = frida.get_usb_device(timeout=5)
    pid = device.spawn([PACKAGE_NAME])
    print("App is starting ... pid : {}".format(pid))
    process = device.attach(pid)
    device.resume(pid)
    script = process.create_script(jscode)
    script.on('message',on_message)
    print('[*] Running Hook')
    script.load()
    sys.stdin.read()
except Exception as e:
    print(e)

Rooting_Bypass.py
0.00MB

 

PACKAGE_NAME에 들어가는 패키지 이름은 frida-ps -U를 이용하여 코드가 실행될 앱 패키지 이름을 확인하여 작성한다.

현재 실행된 프로세스 확인 명령어
uncrackable1 앱 프로세스 명 확인

4. Frida Hooking 코드 실행 

후킹 코드가 설치된 폴더경로에서 CMD를 이용하여 실행한다.

실행 명령어 : python [실행파일 명].py

Rooting_Bypass.py 실행

CMD에서 [*] Hooking System.exit 상태에서 멈추면 모바일에서 OK 버튼을 클릭한다.

OK 버튼 클릭

앱이 종료 되지 않고 알림창만 종료된 것을 확인할 수 있다.

루팅 우회 성공

5.  [참고] frida 파이썬 바인딩

(1) 프로세스 식별하고 연결

(2) 연결된 디바이스에서 구현하려는 프로세스 세션 연결

(3) 자바 스크립트로 작성된 페이로드 자동 삽입

 

[프로세스 실행 상태에서 자바스크립트 후킹을 실행하는 코드]

import frida, sys	//frida, sys 모듈 가져오기

jscode= """paylod_code"""	//삽입할 자바스크립트 코드 넣기
try:
	session=frida.get_usb_device().attach("com.your.package.name")	//frida를 시작하고 USB 장치에서 com.your.package.name 프로세스 연결
    script=session.create_script(jscode)	//jscode에 있는 스크립트 코드를 frida에서 사용할 수 있도록 생성)
    script.load()	//생성한 script를 로드
    sys.stdin.read()	//script가 동작하기 전에 종료되는 문제 예방
except Exception as e:

 

[메인 쓰레드가 시작되기 전에 자바스크립트 코드 후킹을 실행하는 코드]

import frida, sys	//frida, sys 모듈 가져오기

jscode= """paylod_code"""	//삽입할 자바스크립트 코드 넣기
try:
	device=frida.get_usb_device()	//frida를 시작하고 USB장치에 연결
    pid=device.spawn(['com.your.package.name'])	//연결된 USB장치에서 com.your.package.name 프로세스 생성
	session=frida.get_usb_device().attach(pid)	//frida를 시작하고 USB 장치에서 com.your.package.name 프로세스 연결
    script=session.create_script(jscode)	//jscode에 있는 스크립트 코드를 frida에서 사용할 수 있도록 생성
    script.load()	//생성한 script를 로드
    device.resume(pid)	//com.your.package.name 프로세스 메인 스레드 실행
    sys.stdin.read()	//script가 동작하기 전에 종료되는 문제 예방
except Exception as e:

 

6. [참고] frida 파이썬 바인딩 메시지 처리

console.log()는 콘솔 화면에 바로 출력

send()는 스크립트로 전달하여 데이터 처리, 파이썬 스크립트를 통해 데이터를 전달하고, 제어하여 처리할 수 있다.

send(message, [data])	//frida 기반 애플리케이션에 자바스크립트 객체 massage 전송

script.on('message', on_message)	//frida script에서 보낸 메시지를 처리할 callback 함수를 설정, 호출 할 handler를 등록하는 과정

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

반응형