[Android] 프로그램 무결성 검증 (API 28 이상 버전)

2024. 10. 31. 04:30·Hacking/Mobile

프로그램 무결성 검증이란?

안드로이드에서 프로그램 무결성 검증이란 앱 위ㆍ변조 여부를 확인하는 항목

 

Signing Key 검증 소스코드 (API 28 버전)

API 28 버전 이상부터는 서명을 하여도 재 서명이 가능하여, 앱 해쉬 값 검증, Signing Key 검증 등을 통해 무결성 검증을 진행할 필요가 있음

public class MainActivity extends AppCompatActivity {

    // 검증할 앱의 서명 값 (SHA-256 값)
    private static final String APP_SIGNATURE = "[Hash 값]";


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

        // 추출된 서명 값과 앱 서명 값 검증
        boolean isValidSignature = verifyAppSignature(APP_SIGNATURE);
        if (isValidSignature) {
            // 검증 성공 로직
            Toast.makeText(this, "App signature is valid", Toast.LENGTH_SHORT).show();
        } else {
            // 검증 실패 로직
            Toast.makeText(this, "App signature is NOT valid", Toast.LENGTH_SHORT).show();
            finish(); // 앱 종료
        }
    }

    private boolean verifyAppSignature(String expectedSignature) {
        try {
            // 패키지 정보 가져오기
            PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(),PackageManager.GET_SIGNING_CERTIFICATES);

            // 앱 서명 값(Signature) 가져오기
            Signature[] signatures = packageInfo.signingInfo.getApkContentsSigners();

            for (Signature signature : signatures) {
                // 앱 서명 값 암호화 (SHA-256 사용)
                MessageDigest md = MessageDigest.getInstance("SHA-256");
                md.update(signature.toByteArray());
                byte[] signatureBytes = md.digest();

                // 앱 서명 값 검증
                String currentSignature = bytesToHex(signatureBytes);

                if (currentSignature.equals(expectedSignature)) {
                    // 서명 값 일치하는 경우 true 반환
                    return true;
                }
            }
        } catch (PackageManager.NameNotFoundException | NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        // 서명 값 일치하지 않는 경우 false 반환
        return false;
    }

    private String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02X", b));
        }
        return sb.toString();
    }
}

'Hacking > Mobile' 카테고리의 다른 글

[Android] 분할 APK 설치 방법  (0) 2025.05.15
[Android] 안드로이드 캡처 우회  (0) 2025.05.15
[Android] Activity 화면 강제 호출 취약점  (0) 2024.10.31
'Hacking/Mobile' 카테고리의 다른 글
  • [Android] 분할 APK 설치 방법
  • [Android] 안드로이드 캡처 우회
  • [Android] Activity 화면 강제 호출 취약점
Gom_Po
Gom_Po
IT보안
  • Gom_Po
    Gom_Po
    Gom_Po
  • 전체
    오늘
    어제
    • 분류 전체보기 (47)
      • 버그바운티 (2)
      • CTF (8)
        • Lord Of SQL (0)
        • CCE (2021) (5)
        • 1753CTF (2024) (3)
      • Hacking (19)
        • Web (4)
        • Mobile (4)
        • CS (6)
        • System (2)
        • 무선랜 해킹 (3)
      • WarGame (17)
        • TryHackMe (5)
        • DreamHack (11)
        • Root-Me (0)
        • HackTheBox (1)
  • 인기 글

  • 태그

    #WriteUp
    Android
    #CCE
    문제풀이
    write-up
    예선문제
    #DreamHack
    sql injection
    #WebHacking
    Dreamhack
    드림핵
    betafast
    writeup
    1753CTF
    dvta
    TryHackMe
    웹 해킹
    침투 모의해킹
    #문제풀이
    #대회
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Gom_Po
[Android] 프로그램 무결성 검증 (API 28 이상 버전)
상단으로

티스토리툴바