Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
unidbg — Consente di emulare una libreria nativa Android e un'emulazione iOS sperimentale. | Kitploit
Strumenti/GitHubGitHub/zhkl0228/unidbg
Sicurezza AndroidAnalisi Dinamica (Sandboxing)Sicurezza iOSReverse EngineeringDebuggerAnalisi di BinariApprendimento e FormazioneReverse Engineering Assistito dall'IA
GitHubzhkl0228/unidbg

unidbg

Consente di emulare una libreria nativa Android e un'emulazione iOS sperimentale.

Vedi Repository
5.1k1.2k14 giorni faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

unidbg

Consente di emulare una libreria nativa Android e una sperimentale emulazione iOS.

Questo è un progetto educativo per imparare di più sul formato file ELF/MachO e sull'assembly ARM.

Usalo a tuo rischio e pericolo!

Caratteristiche

  • Supporto MCP (Model Context Protocol) per il debug assistito dall'AI con Cursor e altri strumenti AI.
  • Emulazione dell'API JNI Invocation così che JNI_OnLoad possa essere chiamato.
  • Supporta JavaVM, JNIEnv.
  • Emulazione delle istruzioni syscall.
  • Supporta ARM32 e ARM64.
  • Hook inline, grazie a Dobby.
  • Hook delle importazioni Android, grazie a xHook.
  • Hook iOS con fishhook, substrate e whale.
  • Il backend unicorn supporta un semplice debugger da console, stub gdb, traccia delle istruzioni, traccia di lettura/scrittura della memoria.
  • Supporta il runtime objc e swift di iOS.
  • Supporta il backend veloce dynarmic.
  • Supporta l'hypervisor Apple M1, il backend ARM64 più veloce.
  • Supporta il backend Linux KVM con Raspberry Pi B4.
  • Rilevamento delle fughe di memoria per il codice nativo emulato con backtrace guest e stack trace host.

Debugger MCP (Integrazione AI)

unidbg supporta il Model Context Protocol (MCP) per il debug assistito dall'AI. Quando il debugger è attivo, digita mcp nella console per avviare un server MCP a cui gli strumenti AI (es. Cursor) possono connettersi.

Avvio rapido

L'MCP di unidbg ha due modalità operative:

Modalità 1: Debug con breakpoint — Collega il debugger ed esegui il tuo codice. Quando viene raggiunto un breakpoint, Breaker.debug() mette in pausa l'emulatore: digita mcp nella console per avviare il server MCP e lascia che l'AI assista con l'analisi. Tutti gli strumenti di debug sono disponibili (registri, memoria, disassembly, step, tracciamento, ecc.). Dopo la ripresa, se viene raggiunto un altro breakpoint, il debugger si mette di nuovo in pausa. Una volta che l'esecuzione termina senza raggiungere un breakpoint, il processo esce e l'MCP si spegne.

root@kitploit:~
Debugger debugger = emulator.attach();
debugger.addBreakPoint(address);
// run your emulation logic — debugger pauses when breakpoint is hit

Modalità 2: Strumenti personalizzati (ripetibili) — Usa McpToolkit per registrare strumenti personalizzati e lascia che l'AI riesegua le funzioni target con parametri diversi. La libreria nativa viene caricata una sola volta; dopo ogni esecuzione il processo resta attivo e l'MCP rimane disponibile per l'esecuzione successiva.

root@kitploit:~
McpToolkit toolkit = new McpToolkit();
toolkit.addTool(new McpTool() {
    @Override public String name() { return "encrypt"; }
    @Override public String description() { return "Run encryption"; }
    @Override public String[] paramNames() { return new String[]{"input"}; }
    @Override public void execute(String[] params) {
        String input = params.length > 0 ? params[0] : "default";
        // call encryption with input
    }
});
toolkit.run(emulator.attach());

Quando il debugger si ferma, digita mcp (oppure mcp 9239 per specificare la porta) nella console. Poi aggiungi nelle impostazioni MCP di Cursor:

root@kitploit:~
{
  "mcpServers": {
    "unidbg-mcp-server": {
      "url": "http://localhost:9239/sse"
    }
  }
}

Strumenti MCP disponibili

Stato e informazioni

Registri e disassembly

Memoria

Breakpoint ed esecuzione

Tracciamento

ToolDescription
trace_codeTraccia le istruzioni con i valori di lettura/scrittura dei registri (regs_read, prev_write)
trace_read / trace_writeTraccia letture/scritture di memoria in un intervallo di indirizzi

Chiamate di funzione

ToolDescription
call_functionChiama una funzione nativa per indirizzo con argomenti tipizzati (hex, stringa, byte, null). Restituisce il valore con risoluzione dei simboli e anteprima della memoria
call_symbolChiama una funzione esportata per modulo + nome del simbolo, es. libc.so + malloc

Solo iOS (disponibile quando Family=iOS)

Strumenti MCP personalizzati

Usa McpToolkit per registrare strumenti personalizzati, ognuno dei quali implementa l'interfaccia McpTool. Questo sostituisce la gestione manuale if-else con classi di strumenti pulite e autonome. A questo punto la libreria nativa è completamente caricata (JNI_OnLoad / punto di ingresso già eseguito), quindi il codice all'interno del metodo execute() di ogni strumento è la logica della funzione target da analizzare. L'AI può impostare breakpoint e tracce prima di attivare uno strumento personalizzato, quindi ispezionare i risultati dell'esecuzione su input diversi senza riavviare il processo.

Esempio Android — Vedi Utilities64.java per un esempio JNI Android con strumenti MCP personalizzati:

root@kitploit:~
DalvikModule dm = vm.loadLibrary(new File("libtmessages.29.so"), true);
dm.callJNI_OnLoad(emulator);
cUtilities = vm.resolveClass("org/telegram/messenger/Utilities");

McpToolkit toolkit = new McpToolkit();
toolkit.addTool(new McpTool() {
    @Override public String name() { return "aesCbc"; }
    @Override public String description() { return "Run AES-CBC encryption on input data"; }
    @Override public String[] paramNames() { return new String[]{"input"}; }
    @Override public void execute(String[] params) {
        byte[] input = params.length > 0 ? params[0].getBytes() : new byte[16];
        aesCbcEncryptionByteArray(input);
    }
});
toolkit.addTool(new McpTool() {
    @Override public String name() { return "aesCtr"; }
    @Override public String description() { return "Run AES-CTR decryption on input data"; }
    @Override public String[] paramNames() { return new String[]{"input"}; }
    @Override public void execute(String[] params) {
        byte[] input = params.length > 0 ? params[0].getBytes() : new byte[16];
        aesCtrDecryptionByteArray(input);
    }
});
toolkit.addTool(new McpTool() {
    @Override public String name() { return "pbkdf2"; }
    @Override public String description() { return "Run PBKDF2 key derivation"; }
    @Override public String[] paramNames() { return new String[]{"password", "iterations"}; }
    @Override public void execute(String[] params) {
        String password = params.length > 0 ? params[0] : "123456";
        int iterations = params.length > 1 ? Integer.parseInt(params[1]) : 100000;
        pbkdf2(password.getBytes(), iterations);
    }
});
toolkit.run(emulator.attach());

Esempio iOS — Vedi IpaLoaderTest.java per un esempio di caricamento IPA iOS con strumenti MCP personalizzati:

root@kitploit:~
IpaLoader ipaLoader = new IpaLoader64(ipa, new File("target/rootfs/ipa"));
LoadedIpa loader = ipaLoader.load(this);
emulator = loader.getEmulator();
loader.callEntry();
module = loader.getExecutable();

McpToolkit toolkit = new McpToolkit();
toolkit.addTool(new McpTool() {
    @Override public String name() { return "dumpClass"; }
    @Override public String description() { return "Dump an ObjC class definition by name"; }
    @Override public String[] paramNames() { return new String[]{"className"}; }
    @Override public void execute(String[] params) {
        String className = params.length > 0 ? params[0] : "AppDelegate";
        IClassDumper classDumper = ClassDumper.getInstance(emulator);
        System.out.println("dumpClass(" + className + "):\n" + classDumper.dumpClass(className));
    }
});
toolkit.addTool(new McpTool() {
    @Override public String name() { return "readVersion"; }
    @Override public String description() { return "Read the TelegramCoreVersionString from the executable"; }
    @Override public void execute(String[] params) {
        Symbol sym = module.findSymbolByName("_TelegramCoreVersionString");
        if (sym != null) {
            Pointer pointer = UnidbgPointer.pointer(emulator, sym.getAddress());
            if (pointer != null) {
                System.out.println("_TelegramCoreVersionString=" + pointer.getString(0));
            }
        }
    }
});
toolkit.run(emulator.attach());

Una volta avviato il server MCP, l'AI può chiamare questi strumenti tramite MCP per eseguire emulazioni con parametri personalizzati, impostare breakpoint, tracciare l'esecuzione e ispezionare i risultati, il tutto senza riavviare il processo.

API di basso livello: puoi anche usare direttamente Debugger.addMcpTool() + Debugger.run(DebugRunnable) per il controllo completo. McpToolkit è un wrapper di livello superiore che elimina la gestione if-else.

Rilevamento delle fughe di memoria

Tieni traccia delle allocazioni di memoria lato guest (mmap/munmap/brk) per rilevare fughe di memoria nel codice nativo emulato. Usa try-with-resources: il tracciamento inizia alla creazione e il report delle fughe viene stampato automaticamente alla chiusura.

root@kitploit:~
try (MemoryTracker tracker = emulator.traceMemoryLeaks()) {
    module.callFunction(emulator, "targetFunction", arg1, arg2);
}

Ogni blocco leakato include il backtrace ARM guest (modulo+offset+simbolo) e lo stack trace Java host. Output di esempio:

root@kitploit:~
=== Memory Leak Report ===
Tracking duration: 42ms
Total allocations: 5
Total deallocations: 3
Leaked blocks: 2
Total leaked size: 32768 bytes (32.0 KB)

--- Leak #1 ---
Address: 0x40001000, Size: 16384 (16.0 KB), Perms: rw-
Guest Backtrace:
  #0 0x40123456 libexample.so+0x3456 (malloc+0x12)
  #1 0x40124000 libexample.so+0x4000 (doSomething+0x48)
Host Stack Trace:
  com.github.unidbg.linux.AndroidElfLoader.mmap2(AndroidElfLoader.java:785)
  ...

Puoi anche accedere al report a livello di codice prima della chiusura:

root@kitploit:~
try (MemoryTracker tracker = emulator.traceMemoryLeaks()) {
    module.callFunction(emulator, "targetFunction", arg1, arg2);
    List<AllocationRecord> leaks = tracker.getLeaks();
    assert leaks.isEmpty() : "Memory leak detected!";
}

Pool di worker

Un pool di oggetti thread-safe per riutilizzare le istanze dell'emulatore tra più thread, evitando l'overhead di un'inizializzazione ripetuta.

  • Inizializzazione lazy — I worker vengono creati on-demand solo quando il pool è vuoto, non in anticipo.
  • Limite massimo — Il numero totale di worker attivi (in prestito + idle) non supera mai il massimo configurato.
  • Pulizia degli idle — I worker inattivi per più del timeout (predefinito 10 minuti) vengono automaticamente distrutti dal thread di gestione.
  • Minimo idle — Un numero minimo di worker (predefinito 1) viene sempre mantenuto attivo, anche quando inattivo.

1. Implementare un Worker

root@kitploit:~
public class MyWorker implements Worker {
    private final AndroidEmulator emulator;

    public MyWorker() {
        emulator = AndroidEmulatorBuilder.for64Bit().build();
        // load .so, call JNI_OnLoad, etc.
    }

    @Override
    public void destroy() {
        emulator.close();
    }

    public byte[] doWork(byte[] input) {
        // call native methods and return the result
    }
}

2. Creare il pool, prendere in prestito e chiudere

root@kitploit:~
// Create a worker pool (max = CPU cores, lazy-initialized)
WorkerPool pool = WorkerPoolFactory.create(MyWorker::new);
// Or specify max workers explicitly
// WorkerPool pool = WorkerPoolFactory.create(MyWorker::new, 4);

// Optional: customize idle timeout (default 10 minutes, minimum 1 minute)
pool.setIdleTimeout(30); // idle workers destroyed after 30 minutes
// Optional: customize minimum kept-alive workers (default 1, minimum 1)
pool.setMinIdle(2); // always keep at least 2 workers alive
// Optional: pre-create workers eagerly (default 0, fully lazy)
pool.setInitialSize(4); // eagerly create 4 workers on startup

// Concurrent invocation from multiple threads
ExecutorService executor = Executors.newFixedThreadPool(100);
for (int i = 0; i < 100; i++) {
    executor.submit(() -> {
        try (WorkerLoan<MyWorker> loan = pool.borrow(1, TimeUnit.MINUTES)) {
            if (loan != null) {
                byte[] result = loan.get().doWork(input);
            }
        } // worker is automatically returned to the pool
    });
}

executor.shutdown();
executor.awaitTermination(10, TimeUnit.MINUTES);
pool.close(); // destroy all workers and release resources

Vedi TTEncryptWorker.java per un esempio completo.

Esempi

Test semplici nella directory src/test:

  • TTEncrypt.java


  • JniDispatch32.java

  • JniDispatch64.java

  • Utilities32.java

  • Utilities64.java

Altri test:

  • QDReaderJni.java
  • SignUtil.java

Licenza

  • unidbg utilizza librerie software della Apache Software Foundation.

Ringraziamenti

  • unicorn
  • dynarmic
  • HookZz
  • xHook
  • AndroidNativeEmu
  • usercorn
  • keystone
  • capstone
  • idaemu
  • jelf
  • whale
  • kaitai_struct
  • fishhook
  • runtime_class-dump
  • mman-win32

Stargazers nel tempo

Stargazers over time

Scarica lo strumento
ToolDescription
check_connectionStato dell'emulatore: famiglia, architettura, capacità del backend, isRunning, moduli caricati
list_modules / get_module_infoElenca i moduli caricati, ottieni dettagli incluso il conteggio dei simboli esportati e le dipendenze
list_exportsElenca i simboli esportati/dinamici di un modulo con filtro opzionale e demangling C++
find_symbolTrova un simbolo per nome o trova il simbolo più vicino a un indirizzo
get_threadsElenca tutti i thread/attività nell'emulatore
ToolDescription
get_registers / get_register / set_registerLegge/scrive i registri della CPU
disassembleDisassembla le istruzioni all'indirizzo (le destinazioni dei branch sono annotate automaticamente con i nomi dei simboli)
assembleAssembla il testo delle istruzioni in codice macchina
get_callstackOttieni lo stack di chiamate corrente (backtrace)
ToolDescription
read_memory / write_memoryLegge/scrive byte grezzi di memoria
read_string / read_std_stringLegge una stringa C o std::string C++ (con rilevamento SSO)
read_pointerLegge una catena di puntatori con risoluzione dei simboli
read_typedLegge la memoria come valori tipizzati (int8–int64, float, double, pointer)
search_memoryCerca nella memoria pattern di byte con filtri di ambito/autorizzazioni
list_memory_mapElenca tutte le mappature di memoria con le autorizzazioni
allocate_memory / free_memory / list_allocationsAlloca (malloc/mmap) con dati iniziali opzionali, libera e traccia i blocchi di memoria
patchScrive istruzioni assemblate in memoria
ToolDescription
add_breakpoint / add_breakpoint_by_symbol / add_breakpoint_by_offsetAggiunge breakpoint per indirizzo, simbolo o modulo+offset
remove_breakpoint / list_breakpointsRimuove o elenca i breakpoint (con disassembly)
continue_executionRiprende l'esecuzione. Usa poll_events per attendere breakpoint_hit o execution_completed
step_over / step_into / step_outEsegue passo su, dentro (N istruzioni) o fuori dalla funzione
next_blockInterrompe al prossimo blocco di base (solo Unicorn)
step_until_mnemonicInterrompe alla prossima istruzione che corrisponde al mnemonico, es. bl, ret (solo Unicorn)
poll_eventsEsegue il polling di breakpoint_hit, execution_completed, eventi di traccia
ToolDescription
inspect_objc_msgIspeziona la chiamata objc_msgSend: mostra il nome della classe del ricevente e il selettore, es. -[NSString length]
get_objc_class_nameOttiene il nome della classe ObjC di un oggetto a un determinato indirizzo (pura analisi della memoria, nessuna modifica dello stato)
dump_objc_classEstrae la definizione della classe ObjC (proprietà, metodi, protocolli, ivars)
dump_gpb_protobufEstrae lo schema del messaggio protobuf GPB in formato .proto (solo 64-bit)