본 포스팅에서는 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
후킹에 앞서, dex 디컴파일러로 dex의 구조를 파악해봅니다.
무료 디컴파일러 중에선 jadx가 유용합니다.
jadx로 열어보면 위와 같은 소스코드가 보입니다. frida로 하나씩 후킹해보도록 하겠습니다.
후킹 소스의 기본 틀은 아래와 같습니다.
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 소스파일명 (원격)
있던 프로세스에 attach
frida -H 아이피 앱이름 -l 소스파일명
android 11에서 spawn시 Error: VM::AttachCurrentThread failed: -1가 발생할 경우 쉘에서 아래 커맨드를 입력
setprop persist.device_config.runtime_native.usap_pool_enabled false
'Android Linux' 카테고리의 다른 글
classes.dex memory dump (0) | 2018.07.19 |
---|---|
안드로이드 후킹, 메모리 변조 : dalvik 바이트코드 변조 (0) | 2018.07.04 |
[KERNEL MODULE] linux kernel 4.6 이상에서 file hash 구하기 (0) | 2017.11.27 |
시스템 콜(syscall) 함수 직접 호출하기 (0) | 2017.11.01 |
kdress x86 빌드 (0) | 2017.10.17 |