rizin/librz/core/cmd/cmd_flirt.c

81 lines
2.5 KiB
C

// SPDX-FileCopyrightText: 2021-2022 RizinOrg <info@rizin.re>
// SPDX-FileCopyrightText: 2021-2022 deroad <wargio@libero.it>
// SPDX-License-Identifier: LGPL-3.0-only
#include <rz_core.h>
#include <rz_cons.h>
#include <rz_flirt.h>
RZ_IPI RzCmdStatus rz_flirt_create_handler(RzCore *core, int argc, const char **argv) {
const char *filename = argv[1];
ut32 written_nodes = 0;
if (!rz_core_flirt_create_file(core, filename, &written_nodes)) {
RZ_LOG_ERROR("core: failed to create FLIRT file '%s'\n", filename);
return RZ_CMD_STATUS_ERROR;
}
rz_cons_printf("%u FLIRT signatures were written in '%s'\n", written_nodes, filename);
return RZ_CMD_STATUS_OK;
}
RZ_IPI RzCmdStatus rz_flirt_dump_handler(RzCore *core, int argc, const char **argv) {
rz_core_flirt_dump_file(argv[1]);
return RZ_CMD_STATUS_OK;
}
RZ_IPI RzCmdStatus rz_flirt_scan_handler(RzCore *core, int argc, const char **argv) {
int new, old;
int depth = rz_config_get_i(core->config, "dir.depth");
const char *arch = rz_config_get(core->config, "asm.arch");
char *file = NULL;
RzListIter *iter = NULL;
RzList *files = rz_file_globsearch(argv[1], depth);
ut8 arch_id = rz_core_flirt_arch_from_name(arch);
old = rz_flag_count(core->flags, "flirt");
rz_list_foreach (files, iter, file) {
rz_sign_flirt_apply(core->analysis, file, arch_id);
}
rz_list_free(files);
new = rz_flag_count(core->flags, "flirt");
rz_cons_printf("Found %d FLIRT signatures via %s\n", new - old, argv[1]);
return RZ_CMD_STATUS_OK;
}
RZ_IPI RzCmdStatus rz_flirt_function_handler(RzCore *core, int argc, const char **argv) {
RzAnalysisFunction *func = rz_analysis_get_function_at(core->analysis, core->offset);
if (!func) {
RZ_LOG_ERROR("core: Cannot find function at 0x%08" PFMT64x "\n", core->offset);
return RZ_CMD_STATUS_ERROR;
}
RzFlirtNode *node = rz_sign_flirt_node_from_function(core->analysis, func, true);
if (!node) {
return RZ_CMD_STATUS_ERROR;
}
RzBuffer *buffer = rz_buf_new_empty(0);
if (!buffer) {
RZ_LOG_ERROR("core: Cannot allocate RzBuffer for writing FLIRT signature\n");
rz_sign_flirt_node_free(node);
return RZ_CMD_STATUS_ERROR;
}
if (!rz_sign_flirt_write_string_pattern_to_buffer(node, buffer)) {
rz_buf_free(buffer);
rz_sign_flirt_node_free(node);
return RZ_CMD_STATUS_ERROR;
}
rz_buf_seek(buffer, 0, RZ_BUF_SET);
char *pat = rz_buf_to_string(buffer);
rz_buf_free(buffer);
if (pat) {
rz_cons_print(pat);
rz_cons_flush();
}
rz_sign_flirt_node_free(node);
return RZ_CMD_STATUS_OK;
}