티스토리 뷰
오랜만에 포스팅을 합니다.
거두절미하고 본론부터 가겠습니다.
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 로 찾아뵙겠습니다.
허접한 글 봐주셔서 감사합니다.
참고로 해당 문서는 참고 및 테스트 용도로만 이용해주세요.