rizin/examples/api/sign/sign_match_example.c
Maijin 3cd0d5d640
doc(sign): improve README and add examples (#5620)
Co-authored-by: Maijin <maijin21@gmail.com>
2025-12-16 02:57:59 +08:00

71 lines
2.1 KiB
C

// SPDX-FileCopyrightText: 2025 Maijin <Maijin21@gmail.com>
// SPDX-License-Identifier: LGPL-3.0-only
/**
* Example: Parsing and matching a FLIRT signature
*
* This example demonstrates how to parse a .pat format
* signature string and count the number of patterns/modules.
*/
#include <rz_flirt.h>
#include <rz_util.h>
#include <stdio.h>
// A simple .pat signature for testing
static const char *test_pat =
"5589E583EC..894DF8....................C745FC00000000 00 0000 0040 :0000 test_function\n"
"---\n";
int main(int argc, char **argv) {
printf("=== RzSign Match Example ===\n\n");
// Create a buffer from the test pattern
RzBuffer *pat_buf = rz_buf_new_with_bytes((const ut8 *)test_pat, strlen(test_pat));
if (!pat_buf) {
fprintf(stderr, "Failed to create buffer\n");
return 1;
}
printf("Parsing .pat signature:\n%s\n", test_pat);
// Parse the pattern
RzFlirtInfo info = { 0 };
RzFlirtNode *node = rz_sign_flirt_parse_string_pattern_from_buffer(pat_buf, RZ_FLIRT_NODE_OPTIMIZE_NONE, &info);
rz_buf_free(pat_buf);
if (!node) {
fprintf(stderr, "Failed to parse pattern\n");
return 1;
}
printf("Parsing successful!\n");
printf("File type: %s\n", info.type == RZ_FLIRT_FILE_TYPE_PAT ? "PAT" : "Unknown");
printf("Number of modules: %u\n", info.u.pat.n_modules);
// Count nodes
ut32 node_count = rz_sign_flirt_node_count_nodes(node);
printf("Total nodes in tree: %u\n", node_count);
// Verify structure
if (node->child_list && rz_list_length(node->child_list) > 0) {
RzFlirtNode *child = rz_list_first(node->child_list);
if (child && child->module_list && rz_list_length(child->module_list) > 0) {
RzFlirtModule *module = rz_list_first(child->module_list);
if (module && module->public_functions && rz_list_length(module->public_functions) > 0) {
RzFlirtFunction *func = rz_list_first(module->public_functions);
printf("\nFirst function in signature:\n");
printf(" Name: %s\n", func->name);
printf(" Offset: 0x%04x\n", func->offset);
printf(" Is local: %s\n", func->is_local ? "yes" : "no");
}
}
}
rz_sign_flirt_info_fini(&info);
rz_sign_flirt_node_free(node);
printf("\n=== Done ===\n");
return 0;
}