Xposed는 Android 4, 5 버전에서 사용되었던 구시대의 유물로 생각하였으나, Edxposed, LSPosed를 통해 그 명맥을 유지하고 있으며 AOS 9 이상에서도 Xposed Framework 사용이 가능합니다.
LSPosed는 Magisk Module로서 EdXposed의 Alternative이며, Xposed의 API를 이용하여 ART hooking을 도와주는 framework라고 소개하고 있습니다.
◼︎LSPosed 설치
1. Install Magisk v23+
2. Install "Riru" module v25+ from Magisk repo
3. Download and install "Riru-LSPosed" module in Magisk Manager
4. Reboot --> LSPosed 앱 실행해서 "활성화됨" 확인
◼︎Xposed 모듈 제작
Galaxy S9(SM-G960N, AOS9)에서 작동하는 간단한 Xposed Module을 제작해보겠습니다.
Android Studio를 열고, 새로운 프로젝트를 생성합니다.
1. No Activity 선택 --> project Name 설정
2. Run --> Edit Configurations --> Launch Options "Nothing" 설정(Module 작성후 android studio에서 run 할 경우 "Error running 'app': Default Activity not found" 에러 발생 방지)
3. main 폴더에서 Assets Folder 생성 --> "xposed_init" 파일 생성 --> 파일 내용에 부팅시에 load할 클래스의 full name 작성
※ xposed_init file will tell the Xposed framework which classes to load on the boot
4. "xposed_init" 파일에 명시한대로 java class 파일을 생성
5. "AndroidManifest.xml" 파일을 다음과 같이 수정
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.hackcatml">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Hackcatml">
<meta-data
android:name="xposedmodule"
android:value="true" />
<meta-data
android:name="xposeddescription"
android:value="An example which changes the color of clock text in status bar" />
<meta-data
android:name="xposedminversion"
android:value="53" />
</application>
</manifest>
6. "build.gradle" 파일의 dependencies 항목에 다음 내용 추가후 Sync
7. Xposed Module 코드 기본 틀
package com.example.hackcatml;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import de.robv.android.xposed.XposedBridge;
public class MyModule implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
XposedBridge.log("Loaded app: " + lpparam.packageName);
XposedHelpers.findAndHookMethod(<후킹할 클래스이름>, lpparam.classLoader, <후킹할 메서드이름>, new XC_MethodHook() {
// Called before the invocation of the method
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
}
// Called after the invocation of the method
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
}
});
}
}
간단하게 "9월 13일 월요일"이 적혀있는 ui를 "9월 13일 월요일 HACKCATML"로 변경해보고자 합니다.
컨트롤 센터에 날짜가 찍히는 기능은 "com.android.systemui" 앱의 "com.android.systemui.statusbar.policy.QSClockBellTower" 클래스의 "getDateViewText" 메서드에서 담당하고 있습니다.
Xposed의 "afterHookedMethod" API를 이용하여 return 값을 변조해주면 원하는 목적을 달성할 수 있습니다. "param" 파라미터에 메서드의 arguments 및 return값이 전달되고 있으며, param.getResult() 를 이용하여 original return 값을 얻어올 수 있으며, param.setResult() 를 이용하여 return값 변경이 가능합니다.
package com.example.hackcatml;
import android.util.Log;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import de.robv.android.xposed.XposedBridge;
public class MyModule implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
XposedBridge.log("Loaded app: " + lpparam.packageName);
XposedHelpers.findAndHookMethod("com.android.systemui.statusbar.policy.QSClockBellTower", lpparam.classLoader, "getDateViewText", new XC_MethodHook() {
// Called after the invocation of the method
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
Log.d("[hackcatml]","my first xposed module works fine");
String newDateViewText = param.getResult() + " HACKCATML";
param.setResult(newDateViewText);
}
});
}
}
안드로이드 스튜디오에서 shift + f10(Run 'app') 버튼으로 모듈을 단말기에 설치해줍니다.
LSPosed 앱에 들어가서 대상 앱(com.android.systemui 앱)에 대하여 작성한 모듈을 활성화 해줍니다.
모듈 활성화 후에는 재부팅이 필요합니다.
재부팅 후 확인해보면 다음과 같이 "날짜 + HACKCATML" 문구가 삽입되었으며, 메서드 호출시 "[hackcatml] ... " 로그도 찍히고 있습니다.
※ 출처
https://api.xposed.info/reference/packages.html (XPosed Framework API)
https://medium.com/@meetvora1994/develop-your-first-xposed-module-386c7b0335a2 (develop the frist xposed module)
https://forum.xda-developers.com/t/lsposed-xposed-framework-8-0-12-0-simple-magisk-module-edxposed-alternative.4228973/(LSPosed 소개글 in XDA)
https://riptutorial.com/android/example/16247/creating-a-xposed-module (Xposed Module Development Tutorial)
'Information Security > Android' 카테고리의 다른 글
Android Native Memory Patch (0) | 2021.10.01 |
---|---|
안드로이드 Native Hooking을 위한 Dobby Static Library 연결(Link Dobby Static Library for Android Native Hooking) (0) | 2021.09.29 |
갤럭시 S9(SM-G960N) Pixel AOS 10 커스텀롬 설치 (1) | 2021.07.10 |
Uncrackable Level 3 Only Frida (2) | 2021.06.25 |
Frida의 ptrace 사용 시점, 그리고 MagiskHide (0) | 2021.06.21 |