我正在重新编译和调试 Yara,但由于某种原因,当 Yara 的 yr_rules_save
时会引发访问冲突。函数尝试执行 hdr
的 fwrite结构到文件中。
typedef struct _YR_STREAM
{
void* user_data;
YR_STREAM_READ_FUNC read;
YR_STREAM_WRITE_FUNC write;
} YR_STREAM;
typedef size_t (*YR_STREAM_WRITE_FUNC)(
const void* ptr,
size_t size,
size_t count,
void* user_data);
YR_API int yr_rules_save(
YR_RULES* rules,
const char* filename)
{
int result;
YR_STREAM stream;
FILE* fh = fopen(filename, "wb");
if (fh == NULL)
return ERROR_COULD_NOT_OPEN_FILE;
stream.user_data = fh;
stream.write = (YR_STREAM_WRITE_FUNC) fwrite; // As write method, uses fwrite
result = yr_rules_save_stream(rules, &stream); // Here the error
fclose(fh);
return result;
}
事实上,如果我们进入 yr_rules_save_stream
在显示的函数中,是抛出异常的行: [...]
if (yr_stream_write(&hdr, sizeof(hdr), 1, stream) != 1)
return ERROR_WRITING_FILE;
[...]
有什么异常(exception):Exception thrown at 0x00007FFED05072A6 (ntdll.dll) in ubi-yarac64.exe: 0xC0000005: Access violation writing location 0x00007FF653018A46.
有关行和调用堆栈等详细信息,请查看屏幕截图。 该文件未锁定(没有软件使用它),它不存在(即使我在 fopen 上放置了“w+b”)并且如果我手动检查 HxD,指向缓冲区的指针似乎存在。
有人知道这里发生了什么吗?
最佳答案
原因是,因为 YR_STREAM_WRITE_FUNC
包裹的 fwrite 函数接受一个指向 FILE
的指针输入,而在函数 yr_stream_write
它传递一个指向 YR_STREAM
的指针结构而不是 YR_STREAM->user_data
(FILE
之前由 yr_rules_save
保存的句柄)
关于c++ - 为什么 fwrite 向我抛出访问冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63507972/