C语言中如何获取char*类型变量PE的实际内存大小?
问题分析与解决方案
核心原因
PE是char*类型的指针,在64位系统中,指针本身的大小固定为8字节,所以sizeof(PE)永远返回8,和你malloc分配的内存块大小无关。sizeof(mycode)能返回正确的270,是因为mycode是数组类型,sizeof会计算整个数组的字节数,但一旦退化为指针(比如赋值给char*变量),sizeof就只会计算指针本身的大小。
解决方法
直接复用已有的
size变量
你已经在代码开头获取了正确的大小size_t size = sizeof(mycode);,后续需要用到大小时直接用这个变量即可,比如修改打印语句:printf("Shellcode size before return : %zu\n", size);(
%zu是格式化size_t类型的标准写法)封装指针与大小为结构体返回
如果需要在返回指针的同时携带大小信息,可以定义一个结构体:typedef struct { char* data; size_t size; } Buffer; // 在函数中返回这个结构体 Buffer get_shellcode() { size_t size = sizeof(mycode); char* PE = malloc(size); memcpy(PE, mycode, size); // 用memcpy替代手动循环更高效 Buffer buf = {PE, size}; printf("Shellcode size before return : %zu\n", buf.size); return buf; }调用函数后,就能通过结构体的
size字段拿到正确的内存块大小。禁止用
strlen计算大小
shellcode二进制数据中很可能包含\0字节(ASCII空字符),strlen会在遇到第一个\0时停止计数,导致得到的长度远小于实际大小,绝对不能用它来计算二进制数据的长度。
内容的提问来源于stack exchange,提问作者Brozovitch
相关产品推荐
相关产品推荐

