JJANG-JOON
article thumbnail
반응형

 

ios의 경우앱 스토어에서 자체 난독화 등의 기능이 있다

Android 소스 코드 난독화는 안드로이드 앱의 소스 코드를 변환하여 읽기 어렵게 만드는 기술이다.

이를 통해 앱의 보안을 향상시키고, 앱의 로직과 알고리즘을 보호하는데 도움이 된다.

안드로이드 소스 코드 난독화는 주로 앱의 디컴파일, 역공학, 코드 추출 등을 어렵게 하여 악성 사용자로부터 앱을 보호하는데 사용된다.

 

안드로이드 소스 코드 난독화에는 다양한 방법이 있지만 일반적으로 다음과 같은 것들이 있다.

 

  1. ProGuard: ProGuard는 안드로이드 빌드 도구에 포함된 최적화 및 난독화 도구로, 클래스, 메서드, 필드 이름을 압축하고 난독화하여 앱의 크기를 줄이고 보안을 향상시킨다.
  2. DexGuard: DexGuard는 ProGuard의 기능을 확장하여 더 강력한 난독화 및 보안 기능을 제공하는 상용 라이브러리이다.
  3. String Encryption: 문자열 상수 값을 암호화하여 코드 내에서 평문으로 노출되지 않도록 한다.
  4. Control Flow Obfuscation: 코드의 제어 흐름을 임의로 변경하여 정상적인 실행 흐름을 추론하기 어렵게 만든다.
  5. Resource Encryption: 리소스 파일 (예: 이미지, XML 등)을 암호화하여 디컴파일 시에도 이해하기 어렵게 만든다.
  6. Dynamic Code Loading: 앱이 실행되는 동안 동적으로 코드를 로드하여 정적으로 분석하기 어렵게 만든다.
  7. JNI (Java Native Interface) 활용: 민감한 코드를 JNI를 통해 네이티브 라이브러리로 분리하여 앱 내부에서 직접 접근하기 어렵게 만든다.
  8. Class Encryption: 클래스 파일을 암호화하여 디컴파일 시에도 클래스 내용을 이해하기 어렵게 만든다.

프로가드 이미지

더보기

이러한 난독화 기법들을 적절하게 조합하여 앱의 보안을 향상시키고 역공학을 어렵게 만들 수 있다. 그러나 완벽한 보안을 제공하지는 않으며, 추가적인 보안 조치와 주기적인 업데이트가 필요할 수 있다. 또한, 난독화를 사용할 경우 앱의 성능과 충돌 문제에 주의해야 하며, 충분한 테스트를 수행해야 한다.

 

난독화 전 코드

 

// MainActivity.java

public class MainActivity extends AppCompatActivity {
    private static final String API_KEY = "YOUR_API_KEY";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String message = "Welcome to my app!";
        Log.d("MainActivity", message);

        String response = callWebService(API_KEY);
        parseResponse(response);
    }

    private String callWebService(String apiKey) {
        // 웹 서비스 호출하는 로직
        return "Server response data";
    }

    private void parseResponse(String response) {
        // 서버 응답 데이터 파싱하는 로직
    }
}

 

 

난독화 후 코드 예시

 

public class a extends b {
    private static final String a = "YOUR_API_KEY";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String a = "Welcome to my app!";
        Log.a("MainActivity", a);

        String b = c(a);
        d(b);
    }

    private String c(String a) {
        // 웹 서비스 호출하는 로직
        return "Server response data";
    }

    private void d(String a) {
        // 서버 응답 데이터 파싱하는 로직
    }
}

 

 

 

위의 예시는 ProGuard를 사용하여 난독화된 결과이다.

다른 난독화 기법들을 적용하면 더 복잡한 난독화가 가능하다.

난독화는 코드를 읽기 어렵게 만들어 역공학을 어렵게 하지만, 절대적인 보안을 제공하지는 않으며, 악의적인 사용자들이 여전히 앱을 해킹하는 데 성공할 수 있다.

난독화 후의 코드에서는 클래스 이름과 메서드 이름이 간단한 압축된 이름으로 변경되어 있다. 또한, 상수 문자열인 API_KEY의 값도 더 이상 알아볼 수 없는 형태로 변환되었다.

 

반응형
profile

JJANG-JOON

@JJANG-JOON

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...