Extensão de Decompilação do Windbg via LLM


Este projeto é um esqueleto de extensão WinDbg para Windows x64 que resolve uma função por nome ou endereço, reconstrói uma visão determinística de fluxo de controle e consulta diretamente um LLM a partir da extensão para produzir pseudocódigo.
Layout
src/extension: DLL de extensão do WinDbg e comando !decomp.
src/shared: código JSON, analisador, protocolo e verificador compartilhado pela extensão.
scripts: auxiliares de build e cópia de fornecedores.
third_party/dbgeng: cópia opcional embutida de dbgeng.h e dbgeng.lib.
third_party/zydis: árvore de origem estável do Zydis embutida, usada por padrão quando presente.
Escopo Atual
- premissas somente para x64
- análise de memória ao vivo por meio do DbgEng
- desmontagem estruturada baseada em Zydis para recuperação estável de mnemônicos/operandos
- recuperação de região de símbolo, unwind e intervalo de função heurístico
- recuperação estilo SSA-lite para argumentos de registradores recebidos, locais de slot de pilha, candidatos a mesclagem e condições de desvio normalizadas
- fatos de valor IR de baixo nível com dicas de def-uso, expressões de cópia/constante canonizadas e marcadores de definição morta
- fatos de estado de valor em nível de bloco para definições alcançadas live-in/live-out convergidas entre registradores e locais de pilha
- fatos de região de fluxo de controle apoiados por dominância para laços naturais, candidatos if/else, candidatos switch, metadados de indução de laço e metadados de intervalo/padrão de switch
- fatos ABI x64 para slots shadow/home, deltas de ponteiro de pilha, reconhecimento de prólogo/epílogo, chamadas sem retorno, chamadas de cauda, thunks, candidatos a wrapper de importação e argumentos de chamada recuperados de registradores/pilha
- recuperação de argumentos x64 da Microsoft ciente de SIMD/FP para
xmm0 até xmm3, com guardas de idioma vetorial zero para evitar argumentos recebidos falsos
- dicas de recuperação de tipo para valores semelhantes a ponteiros, locais de pilha, deslocamentos de campo, arrays de índice escalado, comparações semelhantes a enum, testes de bitflag e candidatos a vtable
- fatos de idioma e padrão de biblioteca para auxiliares de memória/string, cookies de segurança, sondas de pilha, alocadores, inicializadores agregados e cargas RIP-relativas de global/importação
- fatos de alvo de chamada para chamadas diretas, chamadas indiretas por registrador/memória, candidatos a chamada virtual/deslocamento de vtable, tipo de retorno, modelo de parâmetros, efeitos colaterais, efeitos de memória, dicas de propriedade e confiança
- fatos de ofuscação estilo OLLVM para dispatchers de achatamento de fluxo de controle, arestas semânticas recuperadas, arestas mortas de predicado opaco e idiomas de substituição escalar de instrução
- fatos de prontidão para desofuscação além do controle
/deobf:on|off sobre se os fatos de ofuscação recuperados podem guiar a reescrita de pseudo-C
- fatos de grafo de evidência que vinculam fatos de alta confiança do analisador, PDB e comportamento observado de volta ao ancoramento de instrução/bloco
- prompting refine-first com um esqueleto de pseudocódigo gerado pelo analisador, resumos cientes de grafo para regiões de CFG, condições e blocos importantes, seleção ranqueada de fatos de alto sinal e amostragem distribuída para grandes conjuntos de fatos
- links DML do WinDbg para navegação de entrada/bloco básico/evidência/alvo de chamada quando o callback de saída suporta DML
- modos de resultado separados para resumo breve, explicação de evidência, somente fatos, prompt de depuração, JSON e saída estilo modelo de dados
- interruptores de correção do usuário para dicas de sem retorno, tipo, campo e renomeação
- fatos de política de análise cientes de sessão para sessões ao vivo, despejo, kernel e semelhantes a TTD
- fatos de comportamento observado do contexto atual do depurador, incluindo amostras de argumentos de registradores, pontos quentes de memória e sugestões de consulta TTD quando disponíveis
- classificação de string/global/IAT RIP-relativa e dicas de assinatura de alvo de chamada para prompting de LLM
- dicas de protótipo, parâmetro/local com escopo, campo, enum e linha de origem cientes de PDB carregado para prompting de LLM
- chamadas LLM diretas no processo a partir da extensão
- adaptador HTTP compatível com OpenAI ou fallback simulado determinístico
- passe de verificação sobre a saída do LLM
Uso no WinDbg
Carregue a extensão a partir da saída do build e então execute !decomp contra um símbolo ou um endereço:```text
.load C:\path\to\decomp.dll
!decomp /doctor
!decomp module!FunctionName
!decomp 0x7ffb`12345678
Use `/doctor` quando a configuração parecer errada ou antes de ativar um provedor de LLM:```text
!decomp /doctor
!decomp /doctor:net
/doctor não requer um alvo e não chama o provedor. Ele relata o caminho de configuração/estado de carregamento, resumo de provedor/modelo/endpoint, presença de autenticação sem segredos, configurações de timeout/token/chunking, suporte a DML, classe/qualificador de sessão, tipo de processador e ressalvas do PDB.
/doctor:net é aceito como uma solicitação explícita de verificação de rede, mas atualmente relata que o ping do provedor é ignorado. A extensão não realiza uma sondagem de rede no modo doctor.
- Valores secretos, como chaves de API, tokens de acesso, tokens de atualização e strings de consulta de URL, não são impressos.
Alvos podem ser símbolos públicos/privados, nomes de funções exportadas ou endereços. Se o alvo resolver para um endereço dentro de uma função, a extensão tenta recuperar o intervalo da função que o contém a partir de símbolos, dados de unwind e heurísticas de fluxo de controle. Coloque aspas em alvos que contenham espaços:```text
!decomp "my module!Function With Spaces"
O caminho de comando normal realiza análise local, constrói fatos do analisador, opcionalmente chama o endpoint de LLM configurado, verifica a resposta contra as evidências recuperadas e imprime pseudo-C mais confiança, avisos e notas de incerteza:```text
!decomp ntdll!RtlAllocateHeap
!decomp kernel32!Sleep
!decomp game.exe!CheckIntegrity
A saída normal, brief e explain inclui um fluxo de progresso compacto mesmo sem /verbose. Execuções longas de LLM mostram a conclusão da análise local, o progresso dos blocos, avisos de nova tentativa, início da mesclagem, verificação e a dica de cancelamento Ctrl+Break. Modos legíveis por máquina, como /view:json, /view:facts, /view:prompt e /view:data, suprimem linhas de progresso e links auxiliares de DML, para que os scripts recebam apenas o payload solicitado.