Файлы APK начинаются с тех же байтов, что и файлы Doc

#python #io #byte #file-type

#python #io #байт #тип файла

Вопрос:

У меня есть механизм анализа вредоносных программ, над которым я работал месяцами, я начинаю внедрять файлы APK и doc (docm, docx, pdf и т.д.). Один из способов проверить, является ли файл файлом doc, — это запустить его через анализатор, который считывает первые 2-4 байта и проверяет, что это такое. Если они соответствуют файлу doc или PDF, я возвращаю true. Недавно я просматривал файлы APK и заметил, что при чтении первых нескольких байтов (до 10 из того, что я заметил) байты APK совпадают с байтами doc. Например, вот мой список тестов:

 print(is_doc("H:\tests\malware\doc\ds7002.pdf"))
print(is_doc("H:\tests\malware\doc\doc1.docm.doc"))
print(is_doc("H:\tests\malware\doc\stuff1.docx"))
print(is_doc("H:\test\malware\doc\GreyEner&yDropper.doc"))
print(is_doc("samples\wildfire-test-elf-file"))
print(is_doc("samples\binary.bin"))
print(is_doc("samples\RR.apk"))
print(is_doc("h:\tests\apks\Official Trump 2020 App_v2.3.0_apkpure.com.apk"))
  

И вот код, который я использую, чтобы отличить их друг от друга:

 def is_doc(filename):
    with open(filename, "rb") as f:
        if f.read(4) in [b"%PDF"]:
            return True
        if f.read(2) in [b"xD0xCF", b"PK", "x14x00"]:
            return True
        return False
  

Теперь это работает действительно хорошо, и мне это действительно нравится, однако последние два файла должны завершиться ошибкой. Но это не так, поэтому я пошел дальше и проверил первые 10 байтов в файлах:

 first 10 of ds7002.pdf: ('%PDF-1.6r%')
first 10 of doc1.docm.doc: ('PKx03x04x14x00x06x00x08x00')
first 10 of stuff1.docx: ('PKx03x04x14x00x06x00x08x00')
first 10 of GreyEner&yDropper.doc: ('PKx03x04x14x00x06x00x08x00')
first 10 of wildfire-test-elf-file: ('x7fELFx02x01x01x00x00xfd')
first 10 of binary.bin: ('MZx90x00x03x00x00x00x04x00')
first 10 of RR.apk: ('PKx03x04x14x00x00x00x00x00')
first 10 of Official Trump 2020 App_v2.3.0_apkpure.com.apk: ('PKx03x04x14x00x00x00x08x00')
  

Как вы можете видеть, файлы doc соответствуют файлам APK, что в долгосрочной перспективе вызывает у меня некоторые проблемы. Как я могу успешно проверить, является ли файл APK, если первые 10 байтов одинаковы и для файлов doc?

Ответ №1:

Сразу после публикации этого я увидел, что есть разница в байтах:

APK: PKx03x04x14x00x00x00x00x00

Doc: PKx03x04x14x00x06x00x08x00

Потребуется некоторая работа, но я думаю, что смогу просто прочитать первые 7 байтов и успешно определить различия