Magisk

1 개요

Magisk
매기스크, 마기스크
Magisk 시스템리스 루팅


  • Magic + Mask의 합성어[1]
  • /system을 건드리지 않은 상태에서 루팅할 수 있는 시스템리스 루팅 프레임워크
  • system 파티션을 건드리지 않고 권한을 얻는 시스템리스 방식이므로 루팅 탐지를 피할 수 있음

2 Magisk 설치법

  • Magisk 공식 사이트에서 APK 파일을 받아 설치한다.
  • Magisk Manager 하단의 설치(Download & Install) 버튼을 클릭한다.
  • ZIP이 받아지면, 리커버리 플래싱 프로그램 (삼성의 경우 오딘)을 연결하여 자신의 기기 버전에 맞는 TWRP 리커버리를 플래싱한다.
  • TWRP 진입 후, 먼저 백업을 실행한다. (실패 시 빠른 복원을 위해)
  • 백업 완료 후, 다운받은 Magisk ZIP을 플래싱한다.
  • 플래싱 완료 후 재부팅한다.
  • Magisk Manager에 들어가 성공 여부를 확인한다.
  • 성공하였다면, 성공한 채로 또 TWRP에서 백업을 하는 것을 권장한다.
  • 탐지당하는 것을 막기 위해 Magisk의 패키지 이름을 랜덤하게 바꾸는 옵션(Hide Magisk Manager)을 실행한다.
  • Magisk Hide에서 com.android.vending, com.google.android.gms.* 그리고, 루팅 우회를 원하는 프로그램을 모두 체크.
  • Magisk 매니저의 모듈 다운로드 메뉴에서, SafetyNet을 검색하여 항목이 뜨면 SafetyNet 우회 모듈임. 이것을 설치하면 SafetyNet 우회 성공 확률이 높아짐.
  • (Magisk 매니저에서 모듈 바로 설치가 되지 않는다면, 리커버리에서 설치.)
  • 성공하였다면, 빠른 복원을 위해 리커버리에서 또 백업한다. (용량이 부족할 경우 이전 백업본을 삭제 또는 PC로 이동 후 백업. 스마트폰 스토리지의 TWRP 디렉토리.)
  • 이 방법이 통하지 않는다면, Magisk Core Only Mode 사용 시, 모듈은 모두 비활성화되지만, SafetyNet 우회 성공률이 더 높아짐.
  • 이 방법으로도 SafetyNet 우회가 불가능하거나, SafetyNet을 완벽히 우회한 시스템리스까지 잡아낸다면, 지금은 답이 없다. xda-developers에서 완벽한 우회 수단이 나올 때까지 루팅폰이랑 금융/게임용 노루팅 세컨폰을 들고 다니는 수 밖에 없다.

3 Magisk 문제 해결

  • Magisk가 가끔씩 풀려 버림. 설치 인식을 하지 않음.
    • 시스템 재시작으로 문제 해결.
    • 재시작으로 해결되지 않을 시, Magisk 재설치.
  • 설치 후 벽돌 현상
    • 잘 동작한 백업본을 선택하여 리커버리 백업 복원.
    • (삼성 기기일 경우) 리커버리 백업이 없을 시 오딘으로 순정 롬 덮어씌우기.
  • 리커버리에서는 모듈 설치가 잘 됨. 그러나 Magisk Manager에서 모듈 설치가 되지 않음. (/data/adb/magisk_merge.img mount failed.)
    • F2FS Loopback Bug Workaround 검색 및 다운로드
    • 리커버리에서 설치
    • 설치에 성공하였다면 Magisk Manager에서 원하는 모듈을 받아 설치가 되는 지 테스트.
    • F2FS를 지원하지 않는 기기는 설치 불가. 실험한 갤럭시 노트 4의 경우 F2FS를 지원하지 않음.
  • ViPER4Android 작동하지 않는 증상
    • 키를 잘못 입력했거나 버전이 기기와 호환되지 않는 경우
    • 리커버리에서 설치 시 키 테스트, 프로그램 버전, 드라이버 버전 질문이 나온다.
    • 프로그램 버전과 드라이버 버전을 변경해 가며 재설치 시도
    • 실험한 갤럭시 노트 4 SM-N916S의 경우, 모두 신버전으로 설치하여 성공.
    • 이어폰을 장착하고 음악을 들어가며 바이퍼 설정을 변경하여 테스트한다. 음향이 조금씩 바뀌는 것이 감지되면 성공.
  • Magisk Hide 메뉴에서 강제 종료됨.
    • 다음은 로그캣에서의 에러 로그 중 일부.
// com.uCs1.WGAR.gcUZPm 는 Hide Magisk Manager를 실행했을 때 랜덤하게 생성되는 패키지 이름.
10-06 18:21:18.224 30528-30831/? E/AndroidRuntime: FATAL EXCEPTION: RxCachedThreadScheduler-8
    Process: com.uCs1.WGAR.gcUZPm, PID: 30528
    a.y71: The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the exception has nowhere to go to begin with. Further reading: https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling | java.lang.OutOfMemoryError: Failed to allocate a 67108876 byte allocation with 16777216 free bytes and 26MB until OOM
        at a.dh1.a(SourceFile:12)
        at a.vf1.run(SourceFile)
        at a.vf1.call(SourceFile)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)
     Caused by: java.lang.OutOfMemoryError: Failed to allocate a 67108876 byte allocation with 16777216 free bytes and 26MB until OOM
        at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
        at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
        at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:856)
        at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:675)
        at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:2228)
        at android.content.res.Resources.loadDrawableForCookie(Resources.java:4215)
        at android.content.res.Resources.loadDrawable(Resources.java:4089)
        at android.content.res.Resources.getDrawable(Resources.java:2005)
        at android.content.res.Resources.getDrawable(Resources.java:1987)
        at android.app.ApplicationPackageManager.getDrawable(ApplicationPackageManager.java:979)
        at android.app.ApplicationPackageManager.loadUnbadgedItemIcon(ApplicationPackageManager.java:2844)
        at android.app.ApplicationPackageManager.loadItemIcon(ApplicationPackageManager.java:2776)
        at android.content.pm.PackageItemInfo.loadIcon(PackageItemInfo.java:220)
        at android.content.pm.PackageItemInfo.loadIcon(PackageItemInfo.java:206)
        at a.qm0.a(SourceFile:5)
        at a.kb1.b(SourceFile)
        at a.qa1.b(SourceFile)
        at a.qa1.a(SourceFile)
        at a.se1.a(SourceFile:1)
        at a.se1.d(SourceFile)
        at a.ue1.b(SourceFile)
        at a.f71.a(SourceFile)
        at a.te1.b(SourceFile)
        at a.r61.a(SourceFile)
        at a.sa1.b(SourceFile)
        at a.r61.a(SourceFile)
        at a.mb1.b(SourceFile)
        at a.r61.a(SourceFile)
        at a.sa1.b(SourceFile)
        at a.r61.a(SourceFile)
        at a.zb1.b(SourceFile)
        at a.f71.a(SourceFile)
        at a.te1.b(SourceFile)
        at a.r61.a(SourceFile)
        at a.mb1.b(SourceFile)
        at a.r61.a(SourceFile)
        at a.zb1.b(SourceFile)
        at a.f71.a(SourceFile)
        at a.xe1.b(SourceFile)
        at a.f71.a(SourceFile)
        at a.me1.b(SourceFile)
        at a.f71.a(SourceFile)
        at a.pe1.b(SourceFile)
        at a.f71.a(SourceFile)
        at a.le1.b(SourceFile)
        at a.f71.a(SourceFile)
        at a.je1.b(SourceFile)
        at a.f71.a(SourceFile)
        at a.me1.b(SourceFile)
        at a.f71.a(SourceFile)
        at a.af1.run(SourceFile)
        at a.a71.run(SourceFile)
        at a.vf1.run(SourceFile) 
        at a.vf1.call(SourceFile) 
        at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:154) 
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
        at java.lang.Thread.run(Thread.java:818) 
    • 해결 방법 추가바람.

4 SafetyNet 우회가 성공하였는가?

  • Magisk Manager에서 확인 가능
  • SafetyNet Test에서 확인가능. Magisk Hide에 추가할 것. 모두 success가 나와야 우회 성공.

5 SafetyNet 우회 성공

  • 우리은행 원터치알림
  • 신한은행 S알리미 (javax.*** 오류 발생은 일시적인 것임. 다시 실행하여 해결.)

5.1 SafetyNet 우회에 성공하나 불안정

  • Pokémon GO
    • 로그인이 되지 않는 오류
      • 오류 메시지 : This device, OS, or software is not compatible with Pokémon GO.
      • 또는 Failed to Log in.
      • 로그인이 되지 않는 문제. 루팅 탐지 시 발생하는 오류.
      • 애플리케이션 설정에서 포켓몬 고의 데이터를 지운다. (데이터는 전부 서버에 저장되니 걱정하지 않아도 된다.)
      • 로그인 - 실패 시 데이터 삭제 - 로그인을 반복.
      • Do not enter dangerous areas~ 또는 Do not trespass~ 등의 메시지가 나오면 성공.
      • 성공하여도 그 다음날 다시 켜보면 실패하는 경우가 있음. 위의 과정을 반복.
  • ISP 페이북
    • Hide Magisk Manager (패키지 이름을 랜덤하게 변경하는 옵션) 실행
    • 위 명령 실패 시 3.0.30 이하 apk를 설치. (임시책. 언젠가 구버전이 막힐 가능성 있음.)

6 SafetyNet 우회 실패

  • Xposed Systemless
    • 삼성 전용 Xposed 받기
    • Magisk 모듈 목록에 있는 Xposed는 Systemless지만, 삼성 터치위즈 지원을 하지 않음. 삼성 터치위즈 롬에서는 설치 시 무한부팅 벽돌 현상이 발생함.
    • Systemless Xposed를 설치하여도 SafetyNet을 우회할 수 없다고 말함.(Systemless Xposed does not pass SafetyNet!!!)
    • Magisk용 Xposed 모듈을 설치한 경우, Magisk 모듈 메뉴에서 Xposed를 해제한 후 재부팅하면 SafetyNet이 우회된다.

Xposed fails safetynet.png

불가능하다.

글을 읽고 포럼을 검색해 봐도, 이렇게 말하고 있다.

Xposed=SafetyNet 우회 실패.

그러하다.

It only passes ctsprofile.png

이 모듈(Xposed)은 "기기 체크"이다. CTSProfile는 우회되지만, BasicIntegrity는 우회에 실패한다.


7 Magisk 시스템리스 루팅 추천앱 또는 모듈

Greenify + ForceDoze
  • 강제로 Doze 모드를 활성화하여 배터리 절약 효율이 극대화된다.
  • Greenify에서는 앱 종료 시 루팅 상태에서는 바로 전부 종료가 가능하다. (비루팅 상태에서는 전부 꺼짐 버튼이 눌릴 때까지 기다려야 한다. 비루팅에서 이 옵션을 켤 시 배터리 역효과가 날 수 있다.)
  • Greenify 유료 버전 + Xposed를 적용할 경우, GCM(FCM) 푸시 허용, 시스템 앱 추가, WakeUp 타이머 병합 등의 강력한 기능을 사용할 수 있다.
  • 네이티브로 Doze를 지원하는 안드로이드 6.0 MarshMallow 이상에서 가장 효과가 있다.
  • DCMProvider는 갤러리에서 사진 분류 역할을 한다. 서드 파티 갤러리를 쓴다면 필요없다. Doze 방해 주범이다.
티타늄 백업
  • 시스템 앱 중 하는 일도 없으면서 메모리를 점유하거나 Doze를 방해하는 앱을 찾아 삭제 또는 비활성화할 수 있다.
  • 없을 시 나중에 오류를 일으킬 수 있는 시스템 앱은 나중에 다시 활성화할 수 있도록 삭제하지 말고 비활성화하자.
  • 티타늄 백업으로 필요없는 시스템 앱을 삭제(비활성화)하고 위 Greenify + ForceDoze와 같이 사용하면 Doze가 지원되는 기기에서는, 사용하지 않는 경우 거의 피처폰 수준의 배터리 절약 효과를 기대할 수 있다.
  • NFC는 기기에 Wakelock을 일으켜 배터리를 소모하게 하는 주범중 하나다. 일부 마시멜로 사용 기종에서는 정상적인 방법으로 NFC가 종료되지 않을 때가 있다. 이 때 티타늄 백업에서 NFC를 비활성화하면 된다.
Wakelock Detector
  • Doze를 방해하는 앱을 찾아, Greenify와 연동시켜 Doze를 방해하지 않도록 종료시킬 수 있다.
ViPER4Android
  • 모든 앱의 음향 효과를 극대화할 수 있다.
  • 다른 노루팅 이퀄라이저와 비교하여 배터리 효율이 증가하고 품질 역시 증가한다.
  • 이퀄라이저를 지원하지 않는 앱(SoundCloud, YouTube)에서 음향 효과를 줄 수 있다.
  • 블루투스, USB, 아날로그잭, 폰 스피커 등 따로 설정이 가능하다.
  • 제조사에서 제한한 음량 이상으로 출력이 가능하다.
  • 이전 버전은 SELinux 허용적(Permissive) 상태에서만 작동하였지만, 최신 버전은 강화(Enforced) 상태와도 호환된다.
YouTube Vanced
  • 백그라운드에서 유튜브를 실행가능
  • 광고 제거
RAM Management fixes
  • 램 관련 트윅
  • 빨라지는 기종도 있지만 오히려 심하게 느려지는 기종도 있음. 느려질 시 모듈 체크 해제 후 재부팅
Emoji One
  • 업데이트 지원을 하고 있는 현역 폰이 아닌, 기술 지원이 끝난 구형 폰에 추천
  • 유니코드 DB 업데이트에 따라, 유니코드 신버전에서 새로 추가된 이모지를 업데이트해 줌
Magic Charging Switch
  • 최대 충전 용량에 제한을 두어 배터리 수명을 늘리는 모듈
  • 일체형 배터리거나, 착탈식이라도 한 개만 쓰는 경우 추천.
  • 모듈 설치 후 터미널에서 조작
  • su로 # 권한을 얻고 mcs 85 80 : 배터리를 85%[2]까지 충전하고 충전 중단, 80%까지 내려가면 충전 재개.

8 같이 보기

9 참고

  1. [1] A Magic Mask to Alter Android System Systemless-ly
  2. 신형 삼성 노트북의 배터리 수명 연장 기능 사용 시의 충전 제한값은 85%.
문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}