Last active
July 19, 2022 20:05
-
-
Save coreyphillips/38c35623be4b6241cfe7623e301437b0 to your computer and use it in GitHub Desktop.
Compares two apk files for differences.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
from zipfile import ZipFile | |
#Source: https://github.com/DrKLO/Telegram/blob/master/apkdiff.py | |
def compareFiles(first, second): | |
while True: | |
firstBytes = first.read(4096); | |
secondBytes = second.read(4096); | |
if firstBytes != secondBytes: | |
return False | |
if firstBytes == b"": | |
break | |
return True | |
def compare(first, second): | |
FILES_TO_IGNORE = ["META-INF/MANIFEST.MF", "META-INF/CERT.RSA", "META-INF/CERT.SF", "META-INF/GOOGPLAY.RSA", "META-INF/GOOGPLAY.SF", "AndroidManifest.xml"] | |
firstZip = ZipFile(first, 'r') | |
secondZip = ZipFile(second, 'r') | |
firstList = list(filter(lambda firstInfo: firstInfo.filename not in FILES_TO_IGNORE, firstZip.infolist())) | |
secondList = list(filter(lambda secondInfo: secondInfo.filename not in FILES_TO_IGNORE, secondZip.infolist())) | |
if len(firstList) != len(secondList): | |
print("APKs has different amount of files (%d != %d)" % (len(firstList), len(secondList))) | |
return False | |
for firstInfo in firstList: | |
found = False | |
for secondInfo in secondList: | |
if firstInfo.filename == secondInfo.filename: | |
found = True | |
firstFile = firstZip.open(firstInfo, 'r') | |
secondFile = secondZip.open(secondInfo, 'r') | |
if compareFiles(firstFile, secondFile) != True: | |
print("APK file %s does not match" % firstInfo.filename) | |
return False | |
secondList.remove(secondInfo) | |
break | |
if found == False: | |
print("file %s not found in second APK" % firstInfo.filename) | |
return False | |
if len(secondList) != 0: | |
for secondInfo in secondList: | |
print("file %s not found in first APK" % secondInfo.filename) | |
return False | |
return True | |
if __name__ == '__main__': | |
if len(sys.argv) != 3: | |
print("Usage: apkdiff <pathToFirstApk> <pathToSecondApk>") | |
sys.exit(1) | |
if sys.argv[1] == sys.argv[2] or compare(sys.argv[1], sys.argv[2]) == True: | |
print("APKs are the same!") | |
else: | |
print("APKs are different!") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment