Android에서 root 권한을 얻으려면 Runtime.getRuntime().exec("su")로 얻을 수 있습니다.
이 명령어를 Python에서 돌려야하니, Python에서 Java코드를 돌리는 방법을 찾아봤습니다.
pyjnius와 subprocess로 돌리는 방법을 찾았는데, 이 상황은 jnius가 맞다고 생각했습니다.
try:
ps = autoclass("java.lang.Runtime").getRuntime().exec("su")
Datastream = autoclass("java.io.DataOutputStream")
ro = DataStream(ps.getRuntime())
except Exception as e:
text = str(e)
실행해보니 permission denied가 나옵니다.
다음으로 든 생각이 Buildozer로 만든 APK도 MainActivity가 있고, MainActivity에서 명령어를 써주기만 하면 동작하지 않을까? 였습니다.
jadx로 확인해보니, org.kivy.android.PythonActivity에서 main.py라는 entry point를 설정합니다.
여기서 추가해주면 될거같아서 파일을 확인해봤습니다.
python-for-android의 webview는 Activity를 extends하고, sdl2에 있는 Activity가 SDLActivity를 extends합니다.
(jadx에 있는 PythonActivity는 SDLActivity를 extends하고 있습니다.)
python-for-android의 bootstraps 내용을 아키텍처(x86 / arm64)에 따라 build/bootstrap으로 복사한 다음 빌드하면서 myapp폴더가 생깁니다.
즉, Python-for-android를 수정하면 매번 코드를 추가하는 게 아니라 빌드할 때 옵션을 줘서 루트 권한을 얻을 수 있습니다.
dists폴더가 있으면 bootstrap 내용을 빌드하지 않고, 없으면 bootstrap 내용을 빌드합니다.
동작은 하는지 확인하기 위해, dists/myapp에 있는 PythonActivity에
이렇게 코드를 추가한 다음 빌드합니다.
루팅 된 실 단말기가 없어서 단말기 작동 여부는 확인되지 않았지만, Nox에서 Root옵션을 주면 슈퍼유저 권한을 얻었다는 메시지를 확인할 수 있습니다.
수동적으로 하지 않고 옵션이나 .spec 파일을 수정해서 하는 방법을 찾아보고 있습니다.
Linux Capability - ping 분석 (0) | 2022.10.10 |
---|---|
ubuntu18.04 kivy buildozer 설치 (3) | 2020.11.03 |
Android ssl pinning bypass(2) (0) | 2020.08.15 |
Android ssl pinning bypass(1) (0) | 2020.07.30 |
Transport Layer (0) | 2020.03.07 |