티스토리 뷰
오랜만에 포스팅을 합니다.
거두절미하고 본론부터 가겠습니다.
Magisk로 루팅된 단말기에 magiskhide라는 아주 좋은 툴이 있는데
루팅탐지 방법에 따라 제대로 숨기지 못하여 어쩔 수 없이 후킹을 해야하는 상황이 발생합니다.
그래서 우회해야할 특정 클래스의 특정 함수를 후킹해야합니다.
우선 준비물은
1. Xposed Framework가 설치된 루팅된 단말기
- Magisk Manager에 들어가서 download 탭을 누르고 다운 받으면 됩니다.
2. Xposed Installer(앱)
- 공격할 모듈을 로드하기 위한 필수 앱
3. 후킹 대상이 될 테스트 앱(package : kr.hanssomi.fake1)
- 후킹 대상이 될 테스트 앱 특정 클래스의 함수
4. 후킹할 앱(package : kr.hanssomi.fake1.hooking)
- 후킹 대상이 될 테스트 앱 특정 클래스의 함수를 공격할 모듈
==============================================
공격 대상이 될 안드로이드 앱을 만듭니다.
간단하게 성공 시 키를 토스트로 띄우고 그렇지 않으면 failed!! 토스트를 띄우며 앱을 종료합니다.
다음과 같이 만들었습니다.
package kr.hanssomi.fake1;
...............
...............
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(check()) {
Toast.makeText(getApplicationContext(), "Success!!", Toast.LENGTH_LONG).show();
if(isRooted()) {
Toast.makeText(getApplicationContext(), "The key is 'You are Best!'", Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(getApplicationContext(), "Success, but key is ......", Toast.LENGTH_LONG).show();
finish();
}
}
else {
Toast.makeText(getApplicationContext(), "failed!!", Toast.LENGTH_LONG).show();
finish();
}
}
public boolean check() {
return false;
}
public boolean isRooted() {
return false;
}
정말 간단한 앱입니다.
정상적인(후킹이 되기 전) 내용은 failed!! 토스트를 띄우고 앱을 종료합니다.
Success!!를 띄우고 키를 토스트로 띄웁니다.
==============================================
다음은 공격할 앱을 만듭니다.
우선 AndroidManifest.xml과 assests/xposed_init 파일을 다음과 같이 만듭니다.
build.gradle 파일 수정
AndroidManifest.xml 파일
<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/AppTheme">
<meta-data
android:name="xposedmodule"
android:value="true" />
<meta-data
android:name="xposeddescription"
android:value="powered by hanssomi" />
<meta-data
android:name="xposedminversion"
android:value="30" />
.......
</application>
app/src/main/assests/xposed_init 파일
kr.hanssomi.fake1.hooking.Hook
이 파일이 가장 중요한데요.
kr.hanssomi.fake1.hooking.Hook 클래스를 로드 시켜 대상 Class - function을 후킹하는 역할을 합니다.
build.gradle 파일
dependencies {
provided files('lib/XposedBridgeApi-54.jar')
}
이 파일은 xposed 프로젝트에서 다운 받을 수 있습니다.
==============================================
그럼 이제 실제 후킹하는 코드를 만들어 볼겁니다.
kr.hanssomi.fake1.hooking 패키지에 Hook.java 클래스를 만듭니다.
package kr.hanssomi.fake1.hooking;
public class Hook implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
if(!lpparam.packageName.equals("kr.hanssomi.fake1")) {
Log.e("ERROR ======", "==========================> ERROR!!!!!!!!!!!!!");
return;
}
else {
XposedBridge.log("Loaded app: " + lpparam.packageName);
}
findAndHookMethod("kr.hanssomi.fake1.MainActivity", lpparam.classLoader, "check", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
param.setResult(true); // check 함수의 리턴값을 true로 변경
}
});
findAndHookMethod("kr.hanssomi.fake1.MainActivity", lpparam.classLoader, "isRooted", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
param.setResult(true); // isRooted 함수의 리턴값을 true로 변경
}
});
}
}
생각보다 간단한 코드이니 굳이 설명은 안하겠습니다.
위 코드를 넣고 build를 하면 XPosed Installer에서 인식을 하고 모듈을 로드합니다.
(다만, 디바이스를 재시작해야 적용이되니 참고하시고요.)
그럼 이제 테스트를 해볼까요?
간단하게 공격 대상이 되는 앱의 특정 Class - Function을 후킹해보았습니다.
(다음은 좀 더 진중한 내용을 다뤄볼께요. override 된 함수라던지 jni라던지)
다음 포스팅에는 MobileSubstrate를 이용하여 탈옥감지우회트윅(iPhone Class functions hooking)을 간단히 만들어보겠습니다.
그 날이 언제가 될지는 저도 미지수라........
조만간 jailbreak bypass 로 찾아뵙겠습니다.
허접한 글 봐주셔서 감사합니다.
참고로 해당 문서는 참고 및 테스트 용도로만 이용해주세요.
-
홍길동123 안녕하세요 한가지 질문이 있습니다 superSU로 루팅할땐 안그런데 magisk 로 루팅하고 xposed framwork 플래싱 하기만 하면 발열이 심해지고 부팅도 한참 걸리면서 폰이 전체적으로 무겁고 매우 느려집니다 혹시 원인과 해결방법 좀 아시나요? 2019.11.19 11:15
-
광주아이 안녕하세요.
android SDK 버전은 어떻게 되시는지요?
현재 정확한 내용은 아니지만요.
xposed framework 가 현재 베타로 oreo까지 나온걸로 알고 있습니다.
9 버전은 테스트를 아직 안해봐서 모르겠지만 안되는걸로 알고 있거든요.
android os 버전 먼저 확인하시고 테스트 해보심이 맞으실 듯 합니다. 2019.11.19 11:18 신고 -
bb java.lang.illegalaccesserror 에러가 뜨는데 혹시 이유를 아시나요??
혹시나 해서 .jar 파일을 다른 걸로 교체를 하니 classnotfoundexcetion 에러가 뜹니다! 2020.05.21 20:11 -
광주아이 정확한 내용은 봐야 알겠지만 클래스를 찾을 수 없다는 내용 보니 참조하지 못하는 클래스가 호출된 모양입니다. 2020.05.22 08:31 신고
-
bb package com.example.newxposedhooking;
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 static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
public class Hook implements IXposedHookLoadPackage{
@Override
public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if(!lpparam.packageName.equals("com.example.hooktestapk")) return;
XposedHelpers.findAndHookMethod(
"com.example.hooktestapk.MainActivity",
lpparam.classLoader,
"ButtonClickCount",
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
param.setResult(100);
}
}
);
}
}
소스코드입니다. libs 에는 api-82.jar을 넣었고 build.gradle에는
dependencies {
provided files ('libs/api-82.jar')
}
assets 파일을 정상적으로 생성하고 xposed_init 파일을 생성한 것을 확인하였고 별에 별 방법을 다 찾아가면서 해봤는데도 해결이 안되고 있씁니다 ㅠㅠㅠㅠ 2020.05.26 02:17 -
dd 이 에러를 해결하기 위해 한 1주일동안 삽질만 한거같습니다 ㅎㅎ ㅠㅠ
기존에 안드로이드 스튜디오 3.6에서 실행하던 것을 2.3.2로 다운그레이드 한 후 instant run을 비활성화 해주었습니다. << 이는 정확한 해결방법인지 모르겠네요.
java.lang.IllegalAccessError 에러는 사전 검증 된 클래스의 클래스 참조가 예기치 않은 구현으로 생겨난 에러고 .jar 파일을 lib 폴더를 새로 만들어서 저장한뒤 실행하니 해결이 되었습니다. 번역기로 번역한거라 정확하진 않지만 libs와 안드로이드 프로젝트는 함께 배치 할 수 없고 컴파일 방법이 다르기 때문에 정확한 이유는 알 수 없다고 나와있네요..
누군가 이 블로그를 찾아왔을때 이걸 보고 저처럼 오랜시간동안 다양한 삽질을 안했으면 좋겠어요 2020.05.26 02:38 -
광주아이 안녕하세요.
고생하셨네요.
도움이 못 돼 드려서 죄송하네요.
본인이 해결하셨다니 참다행입니다. ^^ 2020.05.26 10:06 신고 -
dd 혹시 괜찮으시다면 후킹 성공 후 xposed 애플리케이션에서 로그값 보여주실수 있나요..? 2020.05.26 18:34