banner(“PASO 6: búsqueda del COI en las cadenas desofuscadas”) PATTERNS = [
(“URL”, re.compile(r”https?://[^\s\”<>]+”)), (“IP”, re.compile(r”\b(?:\d{1,3}\.){3}\d{1,3}\b”)), (“PE/script”, re.compile(r”[A-Za-z0-9_]+\.(?:exe|dll|sys|ps1|bat)\b”, re.I)), (“API Win32″, re.compile(r”\b(?:Reg(?:Open|Set|Create|Delete)Key(?:Ex)?A?|VirtualAlloc(?:Ex)?|CreateRemoteThread|WinExec|LoadLibraryA?|GetProcAddress|InternetOpenA?)\b”)), (“Registry”, re.compile(r”SOFTWARE\\\\?[A-Za-z0-9_\\\\]+”, re.I)), (“similar a Base64″, re.compile(r”\b[A-Za-z0-9+/]{24,}={0,2}\b”)), ]visitas = []
para tipo, elementos en cubos.items(): para e en elementos: s = e.get(“string”,””) para etiqueta, toque en PATRONES: if pat.search(s): hits.append((kind, label, s)) if hits: print(f”{‘BUCKET’:<10}{'IOC':<14}STRING") print("-"*72) para tipo,lbl,s en hits[:40]: imprimir(f"{tipo:<10}{lbl:<14}{s[:80]}") print(f"\n→ {len(hits)} total de visitas del COI. Nota: la mayoría están dentro del depósito 'decodificado'") print(" - ¡éstas serían invisibles para las `cadenas`!") else: print("(no hay coincidencias de patrones del COI)") banner("PASO 7: Visualice los recuentos de tipos de cadenas y la distribución de longitud") import matplotlib.pyplot as plt fig, (ax1, ax2) = plt.subplots(1, 2, tamaño de figura = (13, 4.5)) etiquetas = lista (cubos =); [len(v) for v in buckets.values()] barras = ax1.bar(etiquetas, recuentos, color=["#5fa8d3","#62b6cb","#cae9ff","#ff7b7b"]) ax1.set_title("Cadenas FLOSS por tipo"); ax1.set_ylabel("count") para b,n en zip(bars,counts): ax1.text(b.get_x()+b.get_width()/2, n, str(n), ha="center", va="bottom") para artículos tipo, en buckets.items(): lens = [len(e.get("string","")) for e in items] if lens: ax2.hist(lens, bins=30, alpha=0.55, label=f"{kind} (n={len(lens)})") ax2.set_title("Distribución de longitud de cadena"); ax2.set_xlabel("caracteres") ax2.set_ylabel("frecuencia (registro)"); ax2.set_yscale("registro"); ax2.legend() plt.tight_layout(); plt.savefig("floss_summary.png", ppp=110); plt.show() print("\n ✓ Tutorial completo.") print(f" Artefactos: {WORK/'sample.exe'}, {WORK/'floss.json'}, {WORK/'floss_summary.png'}")
(“URL”, re.compile(r”https?://[^\s\”<>]+”)), (“IP”, re.compile(r”\b(?:\d{1,3}\.){3}\d{1,3}\b”)), (“PE/script”, re.compile(r”[A-Za-z0-9_]+\.(?:exe|dll|sys|ps1|bat)\b”, re.I)), (“API Win32″, re.compile(r”\b(?:Reg(?:Open|Set|Create|Delete)Key(?:Ex)?A?|VirtualAlloc(?:Ex)?|CreateRemoteThread|WinExec|LoadLibraryA?|GetProcAddress|InternetOpenA?)\b”)), (“Registry”, re.compile(r”SOFTWARE\\\\?[A-Za-z0-9_\\\\]+”, re.I)), (“similar a Base64″, re.compile(r”\b[A-Za-z0-9+/]{24,}={0,2}\b”)), ]visitas = []
para tipo, elementos en cubos.items(): para e en elementos: s = e.get(“string”,””) para etiqueta, toque en PATRONES: if pat.search(s): hits.append((kind, label, s)) if hits: print(f”{‘BUCKET’:<10}{'IOC':<14}STRING") print("-"*72) para tipo,lbl,s en hits[:40]: imprimir(f"{tipo:<10}{lbl:<14}{s[:80]}") print(f"\n→ {len(hits)} total de visitas del COI. Nota: la mayoría están dentro del depósito 'decodificado'") print(" - ¡éstas serían invisibles para las `cadenas`!") else: print("(no hay coincidencias de patrones del COI)") banner("PASO 7: Visualice los recuentos de tipos de cadenas y la distribución de longitud") import matplotlib.pyplot as plt fig, (ax1, ax2) = plt.subplots(1, 2, tamaño de figura = (13, 4.5)) etiquetas = lista (cubos =); [len(v) for v in buckets.values()] barras = ax1.bar(etiquetas, recuentos, color=["#5fa8d3","#62b6cb","#cae9ff","#ff7b7b"]) ax1.set_title("Cadenas FLOSS por tipo"); ax1.set_ylabel("count") para b,n en zip(bars,counts): ax1.text(b.get_x()+b.get_width()/2, n, str(n), ha="center", va="bottom") para artículos tipo, en buckets.items(): lens = [len(e.get("string","")) for e in items] if lens: ax2.hist(lens, bins=30, alpha=0.55, label=f"{kind} (n={len(lens)})") ax2.set_title("Distribución de longitud de cadena"); ax2.set_xlabel("caracteres") ax2.set_ylabel("frecuencia (registro)"); ax2.set_yscale("registro"); ax2.legend() plt.tight_layout(); plt.savefig("floss_summary.png", ppp=110); plt.show() print("\n ✓ Tutorial completo.") print(f" Artefactos: {WORK/'sample.exe'}, {WORK/'floss.json'}, {WORK/'floss_summary.png'}")