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