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

2024. 10. 31. 04:30·Hacking/Mobile Hacking
반응형

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

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

 

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 Hacking' 카테고리의 다른 글

[Android] Frida 후킹 탐지/차단 및 우회  (0) 2026.03.03
[Android] 분할 APK 설치 방법  (0) 2025.05.15
[Android] 안드로이드 캡처 우회  (0) 2025.05.15
[Android] Activity 화면 강제 호출 취약점  (1) 2024.10.31
'Hacking/Mobile Hacking' 카테고리의 다른 글
  • [Android] Frida 후킹 탐지/차단 및 우회
  • [Android] 분할 APK 설치 방법
  • [Android] 안드로이드 캡처 우회
  • [Android] Activity 화면 강제 호출 취약점
Gom_Po
Gom_Po
IT보안
  • Gom_Po
    Gom_Po
    Gom_Po
  • 전체
    오늘
    어제
    • 분류 전체보기 (58)
      • 버그바운티 (2)
      • Capture The Flag (8)
        • Lord Of SQL (0)
        • CCE (2021) (5)
        • 1753CTF (2024) (3)
      • Hacking (27)
        • Web Hacking (5)
        • Mobile Hacking (5)
        • CS Hacking (6)
        • 침투 테스트(Pen Test) (7)
        • Wi-Fi Hacking (4)
      • WarGame (19)
        • TryHackMe (6)
        • DreamHack (12)
        • Root-Me (0)
        • HackTheBox (1)
      • 지니안NAC (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

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

    • 최근 글

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

    티스토리툴바