주어진 소스 코드에서 APK가 빌드되었는지 확인


10

동일한 응용 프로그램의 경우 다음이 있습니다.

  • 앱 스토어 의 APK
  • 동일한 버전 의 소스 코드 라고 주장되는 것 . 꽤 일반적인 Gradle 빌드 스크립트 및 구조.

APK가 해당 소스 코드에서 실제로 빌드되었는지 여부 를 확인 하고 싶습니다 .
확인하는 방법?

노트:

  • APK가 난독 처리되지 않았습니다.
  • 다른 사람의 서명을 믿을 이유가 없습니다. 소스 코드 만 신뢰합니다.
  • 나는 이미 나 자신을 위해 앱을 만들었지 만 APK가 정상인지 여부를 알고 싶다.
  • Linux 명령 줄 도구를 사용하는 것이 좋지만 모든 도구가 정상입니다.

2
나는 그것을 시도하지는 않았지만 Apktool 을이 목적 으로 사용할 수 있어야합니다 . 두 .apk파일을 리버스 엔지니어링 한 다음 결과 디렉토리에 대해 diff를 실행하십시오. 그러면 서명 만 있어야합니다 (명백한 이유로 일치 할 수 없음). 생각하기 : 단순히 .apk파일의 압축을 풀고 이진 diff를 수행하면 동일하게 수행됩니다. 물론 두 곳 모두 컴파일 할 때 같은 라이브러리 버전을 사용해야합니다. :)
— Izzy

@Izzy : " 같은 라이브러리 버전 ": API 버전은 Gradle 스크립트의 매니페스트 및 라이브러리 버전으로 작성되므로 해당 부분이 정상이어야합니다. 무시할 수있는 파일 / 폴더 목록을 사용하면 큰 대답을 얻을 수 있습니다 (실제 명령 줄의 보너스).
— Nicolas Raoul

1
집에있는 컴퓨터를 사용하고 있다면 현재 할 수 없습니다. 그러나 "명예로운 대답"이 되려면 먼저 직접 시도해야합니다. 8..10h :)
— Izzy

@Izzy diff방법은 깔끔한 것 같다 ...하지만 그것을 컴파일하는 동안 앱 스토어의 사람은 APK를 무엇 난독 경우?
— Grimoire

IMHO가 Apktool이 등장하는 곳입니다. 링크를 확인 했습니까? 이것을 사용하는 LibRadar도 살펴보십시오 . AFAIR는 난독 처리에 도움이됩니다 (필요한 것이 있거나 LibRadar가 해당 라이브러리를 감지하는 데 어려움이있을 수 있습니다).
— Izzy

답변:


2

재현 가능한 빌드 에서만이 작업을 수행 할 수 있습니다 .

"동일한 소스 코드, 빌드 환경 및 빌드 명령이 제공되면 모든 당사자가 지정된 모든 아티팩트의 비트 단위 동일한 사본을 다시 만들 수 있습니다."

따라서 앱 개발자 또는 앱 스토어가 작동하려면 보드에 있어야합니다.
그렇지 않으면 유일한 옵션은 직접 빌드하는 것입니다.

현재이를 수행하는 개발자의 한 예는 Open Whisper Systems입니다. https://github.com/WhisperSystems/Signal-Android/wiki/Reproducible-Builds


매우 흥미로운! 따라서 개발자가 탑승하지 않으면 비교를 할 수 없습니까? 불행히도 (그러나 당연하게도) 대부분의 오픈 소스 앱은 빌드에 Docker 또는 이와 유사한 것을 사용하지 않으며 유지 관리자가 실행하는 모든 시스템에서 빌드됩니다.
— 니콜라스 라울

소스에서 앱을 빌드하는 사람이 빌드 환경을 정확하게 다시 만들 수있는 한 개발자 일 필요는 없습니다. 이러한 유형의 빌드를 설정할 때 종속성은 큰 고통이 될 수 있습니다.
— andDevW

"빌드 환경을 정확하게 다시 작성하십시오": 추측 할 수 있습니까? 예를 들어, 어떤 이유로 Mac 또는 Linux에서 빌드 할 때 다른 APK가 생성되는 경우 앱 스토어의 APK가 Mac 또는 Linux에서 빌드되었는지 추측 할 수 있습니까?
— Nicolas Raoul

의미있는 결과를 추측하고 가질 수 없습니다. 결국 이것은 구현하기가 쉬워지고 점점 더 많은 오픈 소스 프로젝트를 보게 될 것입니다.
— andDevW

1

Java 및 APK의 장점 중 하나는 APK를 Java 소스 코드로 완전히 디 컴파일 할 수 있다는 것입니다.

그러나 결과 소스 코드는 동일하지 않을 수 있습니다.

결과 소스 코드를 알려진 개정판과 일치시키려는 한 가지 좋은 방법은 리포지토리에서 알려진 커밋 직전 및 직후에 어떤 수정 사항이 있는지 확인하고 이러한 수정 사항이 디 컴파일 된 소스에도 있는지 확인하는 것입니다.

디 컴파일하려면 dex2jar 및 JD-Gui를 사용하십시오 .

편집 방금 당신이 리눅스 도구를 원한다는 것을 알았습니다. 내 유일한 경험은 창문에 관한 것이지만 리눅스에는 비슷한 도구가 있다고 확신합니다.


올바르게 이해하면 소스 코드 저장소의 최신 변경 내용을 확인한 다음 APK를 디 컴파일하고 디 컴파일 된 코드에서도 최신 변경 사항이 있는지 수동으로 확인해야합니다. 재미있는 접근 방법이지만 콜홈 또는 임베디드 광고가 APK 버전에 추가되었는지 여부는 알 수 없습니다.
— 니콜라스 라울

1
이것은 사무실에서 알 수없는 APK를 소스 개정판과 일치시키기 위해 사용하는 접근법입니다. 개발자를 신뢰할 수 있다는 것을 알면 충분합니다. 그러나 당신이 말했듯이, 신뢰할 수없는 당사자가 무언가를 몰래 넣는 것이 여전히 가능합니다. 누군가가 더 확실한 대답을 제공하기를 기대하고 있습니다. 나에게도 유용 할 것입니다.
— Mark Ch

소스를 APK로 직접 컴파일 한 다음 다시 소스 코드로 디 컴파일하고이를 Play Store APK의 디 컴파일 된 소스와 비교하는 것은 어떻습니까? 누구든지 이것을 시도 했습니까?
— Sergiy Belozorov

1
@ SergiyBelozorov 죄송합니다.이 답변을 할 수 없습니다. 안드로이드와 더 이상 작동하지 않지만 매우 좋은 생각처럼 들립니다.
— Mark Ch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.