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()
|