반응형

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)

반응형

+ Recent posts