본 포스팅에서는 FRIDA 프레임워크를 통한 후킹 방법을 설명합니다.

FRIDA를 설치하기 위해선 반드시 ROOT 권한이 필요합니다. 각자 환경에 맞는 루팅을 진행해주시면 됩니다.

 

필자의 테스트 환경

- galaxy S5 

- Android 4.4.2

- Snapdragon 805 (32bit) 

 

설치 준비물은 아래와 같습니다.

- Python 3.7

- frida-server-xx.y.zz-android-arm.xz (https://github.com/frida/frida/releases 에서 각자 환경에 맞는 최신 자료를 다운로드)

(갤럭시탭A 2017은 14.2.13버전 적합)

 

1. 단말기에 설치

adb shell 접속 후, /system의 read-only 권한을 쓰기 권한으로 변경하여야 합니다.

모든 권한은 항상 ROOT입니다.

 

mount -o rw,remount /system 

(에러 발생 시 mount -o rw,remount / )

/system/priv-app 에 xz파일 압축 해제

mount -o ro,remount /system

 

단말기를 재부팅한 후에 서버를 구동합니다.

/system/priv-app/frida-server &

(remote 시 /frida-server -l(엘) 아이피 &

 

2. 윈도우에 설치

파이선 설치는 가능하면 d:\python와 같은 짧은 경로로 설치합니다.

설치가 끝나면 아래 명령어를 실행합니다.

c:\>pip install frida

c:\> pip install frida-tools // frida.exe를 설치해주며(필수), 최신버전 frida도 함께 설치해줌

(특징 버전 설치: pip install frida==14.2.13)

설치가 정상적으로 되었다면 frida-ps -U 로 안드로이드 내의 프로세스가 보이는지 확인합니다.

(remote 시 frida-ps -H 아이피)

 

이제 모든 준비가 끝났습니다. 이제부터 실전 예제를 통해 후킹 방법을 설명합니다.

제가 준비한 예제는 다음과 같습니다. apk를 단말기에 설치합니다.

 

- 루팅 감지

소스 : https://github.com/codetronik/RootChecker

codetronik.rootchecker.apk
다운로드

 

 


 

후킹에 앞서, dex 디컴파일러로 dex의 구조를 파악해봅니다.

무료 디컴파일러 중에선 jadx가 유용합니다.

 

jadx로 열어보면 위와 같은 소스코드가 보입니다. frida로 하나씩 후킹해보도록 하겠습니다.

후킹 소스의 기본 틀은 아래와 같습니다.

 
 
후킹 코드들은 Java.perform(function(){ 후킹 코드 }); 와 같은 형태로 작성하면 됩니다.

execute_su() 함수는 su가 실행이 되면 true를 리턴합니다. 아래 코드로 우회할 수 있습니다.

단말기에서 앱을 실행 후, 후킹 소스를 실행하여 실행결과를 비교해보면 화면의 check execute su : YES에서 NO로 바뀐 것을 확인해볼 수 있습니다.

check_su_files() 함수는 su 파일이 존재하면 해당 경로를 리턴하고, 없으면 null을 리턴합니다. 마찬가지로 return null을 하면 간단히 우회할 수 있으나 임의의 경로를 인자로 넘기는 방법도 있습니다.

후킹할 함수에 인자가 있는 경우, 적절하게 overload를 해주시면 됩니다.  

 Byte[]   [B
 String  java.lang.String
 int  int
   

  

 

팁: 소스에서 Java.perform(function( ~~ ){}); 이외는 삭제하고, 아래와 같이 실행하면 frida가 앱을 실행하면서 후킹을 합니다.

앱 띄우면서 중단없이 후킹

frida -H 아이피 -f 앱이름 -l 소스파일명 (원격)

frida -U -f 앱이름 -l 소스파일명 (usb)
 

있던 프로세스에 attach

frida -H 아이피 앱이름 -l 소스파일명 

android 11에서 spawn시 Error: VM::AttachCurrentThread failed: -1가 발생할 경우 쉘에서 아래 커맨드를 입력

setprop persist.device_config.runtime_native.usap_pool_enabled false

+ Recent posts