File size: 6,193 Bytes
f49bd67
 
3c561f4
f49bd67
9a95689
f49bd67
 
 
3c561f4
f49bd67
 
9ac14e6
996c621
9ac14e6
b6bc3bc
 
 
 
3c561f4
9ac14e6
3c561f4
b6bc3bc
 
9ac14e6
f49bd67
996c621
f49bd67
a4064b7
 
35c5659
9ac14e6
4d5e0ae
3c561f4
f49bd67
3c561f4
f49bd67
 
b6bc3bc
 
f49bd67
cb5c0a0
f49bd67
4d5e0ae
3c561f4
a4064b7
f49bd67
3c561f4
f49bd67
 
b6bc3bc
 
f49bd67
cb5c0a0
f49bd67
a4064b7
cb5c0a0
 
4d5e0ae
3c561f4
f49bd67
 
 
 
 
3c561f4
 
35c5659
f49bd67
 
3c561f4
f49bd67
a4064b7
 
 
 
f49bd67
3c561f4
f49bd67
a4064b7
 
 
 
f49bd67
3c561f4
f49bd67
 
 
 
 
 
 
3c561f4
f49bd67
 
 
 
 
 
 
3c561f4
f49bd67
 
 
3c561f4
f49bd67
a4064b7
3c561f4
f49bd67
3c561f4
f49bd67
 
 
 
cb5c0a0
f49bd67
 
 
 
 
 
3c561f4
f49bd67
 
 
 
 
 
 
 
3c561f4
 
f49bd67
 
 
3c561f4
f49bd67
 
 
3c561f4
f49bd67
3c561f4
 
f49bd67
 
 
 
3c561f4
 
 
 
f49bd67
 
3c561f4
f49bd67
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
import os
import subprocess
import tempfile
from androguard.misc import AnalyzeAPK
from transformers import pipeline
from sentence_transformers import SentenceTransformer, util
import gradio as gr

# Contexto global para armazenar dados do APK
apk_context = {"smali": {}, "java": {}, "info": ""}

def check_java():
    """Função para verificar se o Java está instalado e acessível."""
    try:
        result = subprocess.run(
            ["java", "-version"], 
            check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE
        )
        print("Java está disponível:", result.stderr.decode())  # Exibe informações sobre a versão do Java
    except FileNotFoundError:
        raise EnvironmentError("Java não está instalado ou não foi encontrado no PATH.")
    except subprocess.CalledProcessError as e:
        raise EnvironmentError(f"Erro ao tentar verificar o Java: {e.stderr.decode()}")

def install_tools():
    """Instalar ferramentas como Baksmali e JADX."""
    baksmali_path = "/usr/local/bin/baksmali.jar"
    jadx_path = "/usr/local/bin/jadx/bin/jadx"

    # Verificar se o Java está disponível
    check_java()

    # Instalar o Baksmali caso não esteja presente
    if not os.path.exists(baksmali_path):
        print("Instalando o Baksmali...")
        subprocess.run(
            [
                "curl", "-L", "-o", baksmali_path,
                "https://bitbucket.org/JesusFreke/smali/downloads/baksmali-2.5.2.jar"
            ],
            check=True,
        )

    # Instalar o JADX caso não esteja presente
    jadx_zip_path = "/usr/local/bin/jadx.zip"
    if not os.path.exists(jadx_path):
        print("Instalando o JADX...")
        subprocess.run(
            [
                "curl", "-L", "-o", jadx_zip_path,
                "https://github.com/skylot/jadx/releases/download/v1.4.7/jadx-1.4.7.zip"
            ],
            check=True,
        )
        subprocess.run(["unzip", "-o", jadx_zip_path, "-d", "/usr/local/bin/jadx"], check=True)
        if os.path.exists(jadx_path):
            subprocess.run(["chmod", "+x", jadx_path], check=True)
        else:
            raise FileNotFoundError("Executável do JADX não encontrado no caminho esperado.")

install_tools()

def decompile_apk(apk_file):
    if apk_file is None:
        return "Nenhum arquivo enviado. Por favor, envie um arquivo APK."

    temp_apk_path = apk_file.name  # Usar o caminho do arquivo diretamente
    output_dir = tempfile.mkdtemp()
    try:
        # Decompilar usando o Baksmali
        smali_output = os.path.join(output_dir, "smali")
        subprocess.run(
            ["java", "-jar", "/usr/local/bin/baksmali.jar", "d", temp_apk_path, "-o", smali_output], 
            check=True
        )

        # Decompilar usando o JADX
        java_output = os.path.join(output_dir, "java")
        subprocess.run(
            ["/usr/local/bin/jadx/bin/jadx", "-d", java_output, temp_apk_path], 
            check=True
        )

        # Coletar arquivos Smali decompilados
        smali_files = {}
        for root, _, files in os.walk(smali_output):
            for file in files:
                if file.endswith(".smali"):
                    with open(os.path.join(root, file), "r") as f:
                        smali_files[file] = f.read()

        # Coletar arquivos Java decompilados
        java_files = {}
        for root, _, files in os.walk(java_output):
            for file in files:
                if file.endswith(".java"):
                    with open(os.path.join(root, file), "r") as f:
                        java_files[file] = f.read()

        # Armazenar resultados no contexto global
        apk_context["smali"] = smali_files
        apk_context["java"] = java_files

        return f"Decompilação bem-sucedida. Extraídos {len(smali_files)} arquivos Smali e {len(java_files)} arquivos Java."

    except subprocess.CalledProcessError as e:
        return f"Erro durante a decompilação: {e.stderr.decode('utf-8') if e.stderr else str(e)}"
    except Exception as e:
        return f"Erro durante a decompilação: {str(e)}"

def build_search_index():
    smali_texts = [f"{k}\n{v}" for k, v in apk_context["smali"].items()]
    java_texts = [f"{k}\n{v}" for k, v in apk_context["java"].items()]
    model = SentenceTransformer("all-MiniLM-L6-v2")
    smali_embeddings = model.encode(smali_texts, convert_to_tensor=True)
    java_embeddings = model.encode(java_texts, convert_to_tensor=True)
    return model, smali_texts, smali_embeddings, java_texts, java_embeddings

def query_apk_chat(user_message):
    if not apk_context["smali"] and not apk_context["java"]:
        return "Nenhum APK decompilado disponível. Por favor, envie e decompile um APK primeiro."

    try:
        model, smali_texts, smali_embeddings, java_texts, java_embeddings = build_search_index()
        query_embedding = model.encode(user_message, convert_to_tensor=True)
        smali_scores = util.pytorch_cos_sim(query_embedding, smali_embeddings).squeeze(0)
        java_scores = util.pytorch_cos_sim(query_embedding, java_embeddings).squeeze(0)
        smali_result = smali_texts[smali_scores.argmax().item()]
        java_result = java_texts[java_scores.argmax().item()]
        response = f"**Código Smali relevante:**\n\n{smali_result[:1000]}\n\n"
        response += f"**Código Java relevante:**\n\n{java_result[:1000]}"
        return response

    except Exception as e:
        return f"Erro durante a busca: {str(e)}"

apk_upload_interface = gr.Interface(
    fn=decompile_apk,
    inputs=gr.File(label="Enviar arquivo APK", file_types=[".apk"]),
    outputs="text",
    title="Analisador de APK",
    description="Envie um arquivo APK para decompilá-lo em código Smali e Java.",
)

chat_interface = gr.Interface(
    fn=query_apk_chat,
    inputs=gr.Textbox(lines=3, placeholder="Faça uma pergunta sobre o código do APK..."),
    outputs=gr.Textbox(lines=10, label="Resposta do AI"),
    title="Chat com APK",
    description="Faça perguntas sobre o código-fonte do APK em Smali ou Java.",
)

iface = gr.TabbedInterface([apk_upload_interface, chat_interface], ["Enviar & Analisar", "Conversar com AI"])
iface.launch()