94 lines
2.5 KiB
C
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);
|
|
}
|