10 std::ifstream file(filename, std::ios::binary | std::ios::ate);
11 std::vector<uint8_t> buffer;
13 if (!file.is_open()) {
14 std::cerr <<
"Error: Could not open file " << filename <<
" for reading." << std::endl;
19 std::streamsize size = file.tellg();
20 file.seekg(0, std::ios::beg);
26 if (!file.read(
reinterpret_cast<char*
>(buffer.data()), size)) {
27 std::cerr <<
"Error: Failed to read data from file " << filename << std::endl;
68 std::vector<string>* detectedRules = (std::vector<string>*)user_data;
71 yrx_rule_namespace(rule, &ns, &ns_len);
72 yrx_rule_identifier(rule, &ident, &ident_len);
74 detectedRules->push_back(std::string(ns, ns + ns_len) +
"::" +
75 std::string(ident, ident + ident_len));
83 std::vector<string> detectedRules;
84 YRX_RESULT
result = YRX_SUCCESS;
85 YRX_SCANNER* scanner =
nullptr;
87 if (g_yaraRules ==
nullptr) {
88 throw std::runtime_error(
"YARA rules not initialized");
92 result = yrx_scanner_create(g_yaraRules, &scanner);
93 if (
result != YRX_SUCCESS) {
94 throw std::runtime_error(
"Failed to create YARA scanner");
98 if (
result != YRX_SUCCESS) {
99 if (scanner !=
nullptr) {
100 yrx_scanner_destroy(scanner);
102 throw std::runtime_error(
"Failed to set matching rule callback");
106 if (scanBuffer.empty()) {
107 if (scanner !=
nullptr) {
108 yrx_scanner_destroy(scanner);
110 throw std::runtime_error(
"Failed to read file for scanning");
113 result = yrx_scanner_scan(scanner, scanBuffer.data(), scanBuffer.size());
114 if (
result != YRX_SUCCESS) {
115 if (scanner !=
nullptr) {
116 yrx_scanner_destroy(scanner);
118 throw std::runtime_error(
"Failed to scan file");
122 if (scanner !=
nullptr) {
123 yrx_scanner_destroy(scanner);
129 if (scanner !=
nullptr) {
130 yrx_scanner_destroy(scanner);
133 return detectedRules;