backend/engines/ida5/extract.idc

94 lines
2.5 KiB
C

#include <idc.idc>
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);
}