Post

How to disable android anti-capture

With Hook Script

다양한 앱을 사용하다보면 사진을 캡쳐하고 싶을 때가 있다. 안드로이드 기종에서는 이 기능을 간편하게 지원해주는데 일부 앱에서는 이 캡쳐 기능을 보안과 도용 방지를 위해 기술적으로 차단하려고 한다. 오늘은 해당 방법을 알아보고 우회하는 걸 재연해보려고 한다.

FLAG_SECURE

1
2
3
4
5
6
7
8
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(FLAG_SECURE); // secure-display
        setContentView(binding.getRoot());
    }
}

코드는 위와 같다.

1
getWindow().addFlags(FLAG_SECURE);

위 플래그는 아래와 같은 설명으로 8192 값을 가지고 있다.

1
2
3
4
5
6
7
8
9
10
Java.perform(function () {
   var FLAG_SECURE = 0x2000;
   var Window = Java.use("android.view.Window");
   var setFlags = Window.setFlags; //.overload("int", "int")
   setFlags.implementation = function (flags, mask) {
      console.log("Disabling FLAG_SECURE...");
      flags &= ~FLAG_SECURE;
      setFlags.call(this, flags, mask);
   };
 });

위와 같이 javascript 를 작성해준다.

Android 8192 Flag

위는 적용하지 않았을 때 일반적인 앱 작동 모습이다.

실행중인 다른 앱을 보려고 백그라운드로 진입하면 앱 화면이 사라진다.

Disable 8192 Flag

Hook 을 걸어 특정 메소드에 값을 변조시켰더니 이전과 다르게 백그라운드로 진입해도 화면이 사라지지 않는 걸 볼 수 있다.

stateDiagram-v2
    State1: onCreate
    State2: FLAG_SECURE
    State3: any UI
    note right of State2
        Hook and replace value.
    end note
    State1 --> State2
    State2 --> State3

onCreate 가 호출될 때 FLAG_SECURE 가 작동되는데 이때 해당 플래그를 인자 받는 메소드를 변조하여 블랙스크린 및 캡쳐 방지 기능을 무효화시킬 수 있다.

This post is licensed under CC BY 4.0 by the author.
If you find any errors, please let me know by comment or email. Thank you.

© Ruffalo. Some rights reserved.

I'm

Using the Chirpy theme for Jekyll.