From b21002d483ad93487d0fbd0bca578366df18eabd Mon Sep 17 00:00:00 2001 From: "Wagner J. Kramer Vieira" <wjkv18@inf.ufpr.br> Date: Tue, 23 Feb 2021 10:43:43 -0300 Subject: [PATCH] Parte 2 concluida --- T2/Parte1/Parte1.py | 11 ++++++-- T2/Parte2/commonSections.py | 56 +++++++++++++++++++++++++++++++++++++ T2/Parte2/printSections.py | 36 ++++++++++++++++-------- 3 files changed, 88 insertions(+), 15 deletions(-) create mode 100644 T2/Parte2/commonSections.py diff --git a/T2/Parte1/Parte1.py b/T2/Parte1/Parte1.py index cc23066..f3a4375 100644 --- a/T2/Parte1/Parte1.py +++ b/T2/Parte1/Parte1.py @@ -7,11 +7,13 @@ Comandos:\n all : Imprime todas as permissões + permissões únicas + permissõ t : Imprime todas as permissões\n\ uc : Imprime permissões únicas + permissões comuns" + # Imprime todas as permissões por APK def imprime_permissoes_por_apk(objeto): print("\n==================\n\nPermissões por APK\n\n==================\n") for i in objeto: - print(re.findall(r'\_(.*?)\.xml', i)[0] + ": ",objeto[i]) + print(re.findall(r'_(.*?)\.xml', i)[0] + ": ",objeto[i]) + # Cria objeto com permissões únicas e compartilhadas def permissoes_unicas_compartilhadas(objeto): @@ -27,15 +29,17 @@ def permissoes_unicas_compartilhadas(objeto): objeto[i] = list(set(objeto[i]).difference(set(objeto[j]))) return {'shared': shared.copy(), 'unique': objeto.copy()} + # Imprime lista de permissões comuns das APKs e permissões únicas das mesmas def imprime_permissoes_unicas_compartilhadas(objeto): retorno = permissoes_unicas_compartilhadas(objeto) print("\n==========================\n\nPermissões únicas por APKs\n\n==========================\n") for el in retorno["unique"]: - print(re.findall(r'\_(.*?)\.xml', el)[0] + ": ",retorno["unique"][el]) + print(re.findall(r'_(.*?)\.xml', el)[0] + ": ",retorno["unique"][el]) print("\n=========================\n\nPermissões comuns das APK\n\n=========================\n") print(retorno["shared"]) + # Retorna a lista de permissões por APK baseada na pasta passada por parâmetro def create_permissions(): try: @@ -46,7 +50,7 @@ def create_permissions(): # Verifica se o arquivo atual segue o padrão "AndroidManifest_[...].xml" if re.match(r'AndroidManifest_(.*?).xml', file): # Abre o arquivo - with open(os.path.join(os.getcwd() + '/manifests/' + file)) as fd: + with open(os.path.join(sys.argv[2], file)) as fd: doc = fd.read() # Adiciona as permissões atuais a coleção full_permissions = " ".join(re.findall(r'<uses-permission android:name=\"(.*?)\"', doc)) @@ -63,6 +67,7 @@ def create_permissions(): print(utilizacao) exit() + def main(): try: if sys.argv[1] == "all": diff --git a/T2/Parte2/commonSections.py b/T2/Parte2/commonSections.py new file mode 100644 index 0000000..870119f --- /dev/null +++ b/T2/Parte2/commonSections.py @@ -0,0 +1,56 @@ +import pefile +import sys +import os + +files = [] + + +def print_usage(): + print("Utilização: python", os.path.basename(__file__), "<primeiro executável> <segundo executável>") + + +# Trata o input do usuário +def handle_input(): + try: + if os.path.isfile(sys.argv[1]) & os.path.isfile(sys.argv[2]): + files.append(os.path.realpath(sys.argv[1])) + files.append(os.path.realpath(sys.argv[2])) + else: + print("Arquivos inválidos!") + exit() + except IndexError: + print('ARQUIVOS NÃO INFORMADOS') + print_usage() + except FileNotFoundError: + print('ARQUIVO NÃO ENCONTRADO') + print_usage() + + +def print_common_sections(): + try: + # Lê arquivos + pe1 = pefile.PE(files[0]) + pe2 = pefile.PE(files[1]) + pe1sections = [] + pe2sections = [] + + # Separa as seções + for section in pe1.sections: + pe1sections.append(section.Name.decode('utf-8').rstrip('\x00')) + for section in pe2.sections: + pe2sections.append(section.Name.decode('utf-8').rstrip('\x00')) + + # Utiliza sets para imprimir interseção e elementos exclusivos + print('==========================\n\nSeções comuns aos arquivos\n\n==========================\n') + print(list(set(pe1sections) & set(pe2sections)), '\n') + print('=============================\n\nSeções exclusivas dos arquivos\n\n=============================\n') + print(os.path.basename(files[0]) + ': ', list(set(pe1sections).difference(pe2sections)), '\n') + print(os.path.basename(files[0]) + ': ', list(set(pe2sections).difference(pe1sections)), '\n') + except pefile.PEFormatError: + print("ARQUIVO INVÃLIDO!") + print_usage() + + +if __name__ == '__main__': + handle_input() + print_common_sections() diff --git a/T2/Parte2/printSections.py b/T2/Parte2/printSections.py index 25516eb..3b20102 100644 --- a/T2/Parte2/printSections.py +++ b/T2/Parte2/printSections.py @@ -5,6 +5,10 @@ import os files = [] +def print_usage(): + print("Utilização: python", os.path.basename(__file__), "<pasta com executáveis ou arquivo executável>") + + # Trata o input do usuário def handle_input(): try: @@ -12,24 +16,32 @@ def handle_input(): for file in os.listdir(sys.argv[1]): files.append(os.path.join(sys.argv[1], file)) elif os.path.isfile(sys.argv[1]): - files.append(sys.argv[1]) + files.append(os.path.realpath(sys.argv[1])) except IndexError: - print("ERROR") + print("PARÂMETROS FALTANTES") + print_usage() except FileNotFoundError: - print("ERROR") + print("ARQUIVO NÃO ENCONTRADO") + print_usage() # Encontra as seções executáveis e imprime na saida padrão def print_executable_sections(): - objeto = {} - for file in files: - pe = pefile.PE(file) - executable = [] - for section in pe.sections: - if section.IMAGE_SCN_MEM_EXECUTE: - executable.append(section.Name.decode('utf-8').rstrip('\x00')) - objeto[os.path.basename(file)] = executable - print(objeto) + try: + objeto = {} + for file in files: + pe = pefile.PE(file) + executable = [] + for section in pe.sections: + if section.IMAGE_SCN_MEM_EXECUTE: + executable.append(section.Name.decode('utf-8').rstrip('\x00')) + objeto[os.path.basename(file)] = executable + print(objeto) + except pefile.PEFormatError: + print('ARQUIVO INVÃLIDO!') + if len(files) > 1: + print("A pasta deve conter SOMENTE arquivos executáveis") + print_usage() if __name__ == '__main__': -- GitLab