#include static main() { auto ea, func_end, curr_inst, func_name, disasm, file; auto last_inst, xref, ref, label_name; Message("Aguardando fim da analise...\n"); Wait(); file = fopen("output.json", "w"); if (file == 0) { Message("Erro ao criar arquivo de output!\n"); Exit(1); } fprintf(file, "[\n"); ea = NextFunction(0); while (ea != BADADDR) { func_name = GetFunctionName(ea); fprintf(file, " {\n"); fprintf(file, " \"function\": \"%s\",\n", func_name); fprintf(file, " \"address\": \"0x%08X\",\n", ea); // --- XREFS TO (Simplificado e direto para o IDA 5) --- fprintf(file, " \"xrefs\": \""); xref = RfirstB(ea); while (xref != BADADDR) { if (GetFunctionName(xref) != "") { fprintf(file, "%s ", GetFunctionName(xref)); } xref = RnextB(ea, xref); } fprintf(file, "\",\n"); // --- ASSEMBLY BRUTO (com offset) --- fprintf(file, " \"assembly\": \""); func_end = FindFuncEnd(ea); curr_inst = ea; last_inst = 0; while (curr_inst < func_end) { if (curr_inst == last_inst) { break; } last_inst = curr_inst; disasm = GetDisasm(curr_inst); if (disasm != "") { fprintf(file, "0x%08X %s\\n", curr_inst, disasm); } curr_inst = curr_inst + ItemSize(curr_inst); } fprintf(file, "\",\n"); // --- LABELS (code references from instructions) --- fprintf(file, " \"labels\": \""); curr_inst = ea; last_inst = 0; while (curr_inst < func_end) { if (curr_inst == last_inst) { break; } last_inst = curr_inst; ref = Rfirst(curr_inst); while (ref != BADADDR) { label_name = Name(ref); if (label_name != "") { fprintf(file, "%s:0x%08X ", label_name, ref); } ref = Rnext(curr_inst, ref); } curr_inst = curr_inst + ItemSize(curr_inst); } fprintf(file, "\"\n }"); ea = NextFunction(ea); if (ea != BADADDR) { fprintf(file, ",\n"); } } fprintf(file, "\n]\n"); fclose(file); Message("Extracao concluida com sucesso!\n"); Exit(0); }