调用memcpy函数时触发Access Violation访问违规错误的原因是什么?
错误原因
- 结构体强转取值异常:你初始化的
data数组全为字符'A'(ASCII值为0x41),将其强制转换为phear*类型后,读取到的payload->length实际值为0x41414141(十进制1094795585),远大于data数组的总大小27136,memcpy读取源地址时直接超出data数组边界,触发读取访问违规。 - 内存分配失败无校验:申请10余GB的内存几乎必然失败,
malloc会返回NULL,后续向空指针写入数据也会触发访问违规。
修复方案
- 按照结构体内存布局正确初始化
data数组,不要直接使用全'A'的字符数组强转使用,示例如下:
// 先定义并初始化合法的phear结构体变量 phear valid_payload = {0}; valid_payload.length = 1024; // 按需设置不超过DATA_SIZE的合理长度 memcpy(valid_payload.payload, "实际待加载的payload内容", valid_payload.length); // 再将结构体内容拷贝到data数组 memcpy(data, &valid_payload, sizeof(phear));
- 在
start函数中增加参数合法性校验和内存分配结果校验:
void start(HINSTANCE mhandle) { phear * payload = (phear *)data; char * buffer; // 校验length取值合法性 if (payload->length <= 0 || payload->length > DATA_SIZE) { return; } buffer = (char *)malloc(payload->length); // 校验内存分配结果 if (buffer == NULL) { return; } memcpy(buffer, payload->payload, payload->length); /* execute our code */ spawn(buffer, payload->length, payload->key); /* clean up after ourselves */ free(buffer); }
内容的提问来源于stack exchange,提问作者jplain
相关产品推荐
相关产品推荐

