주어진 소스 코드에서 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 소스 코드로 완전히 디 컴파일 할 수 있다는 것입니다.

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

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

디 컴파일하려면 dex2jarJD-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.