龙空技术网

在C语言中如何使用二级指针

秋风技术 111

前言:

现在你们对“c语言二级程序题怎么运行”大致比较关怀,姐妹们都需要了解一些“c语言二级程序题怎么运行”的相关资讯。那么小编同时在网摘上汇集了一些关于“c语言二级程序题怎么运行””的相关资讯,希望大家能喜欢,咱们快快来了解一下吧!

前言

最近在闲暇的时候, 拾起 Windows PE文件解析.上次写PE已是去年的事情了,上次解析没有使用到指针,这次使用了指针,不过在指针使用上,还是有了一些认识,还有就是学了东西就要去用,不然时间长了容易忘记.要加以练习.

这篇博文是较早之前写的,因为去公司上下班花的时间较长,还没来得急写新的.

二级指针的使用

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <Windows.h>//加载文件到内存//由于不知道文件大小int load_file_to_memory(char* file_name, char** buf){	if (file_name == NULL)	{		return -1;	}	FILE* fp = fopen(file_name, "rb");	if (fp == NULL)	{		return -1;	}	//先将文件指针移动到结尾,通过ftell计算文件大小,再将文件指针移动开始未知,方便下边读取	fseek(fp, 0, SEEK_END);	long size = ftell(fp);	fseek(fp, 0, SEEK_SET);	//根据获取文件大小,分配并初始化为0	void* temp_buf = calloc(size, sizeof(char));	//读取size大小到temp_buf中	int read_size = fread(temp_buf, sizeof(char), size, fp);	//buf为二级指针,*buf指向temp_buf指向的内容	*buf = (char*)temp_buf;	if (fp != NULL)	{		fclose(fp);	}	return read_size;}//image_buf也是二级指针,因为不解析file_buf中的内容,不知道该为image_buf分配多少空间int file_to_image(char** file_buf, char** image_buf){	//获取二级指针file_buf指向的内容 	char* buf = *file_buf;	//这里对image_buf,不多说明,后期在pe中进行说明	int write_size = 0;	return  write_size;}int main(int argc, char* argv[]){	char* file_name = "h1.exe";	int file_size;	int write_size;	char* buf;	char* image_buf;	//由于不知道文件大小,所以只声明一个buf,在函数内部读取文件后,确定文件大小,进行分配	//并将文件内容读取分配的内存中,然后二级参数buf指向内存分配的指针上	file_size = load_file_to_memory(file_name, &buf);	write_size = file_to_image(&buf, &image_buf);	//buf和image_buf在不使用的时候,要进行手动释放	if (buf != NULL)	{		free(buf);	}	if (image_buf != NULL)	{		free(image_buf);	}	return 0;}
在指针上移动,要看指针类型
int main(int argc, char* argv[]){	char* txt = "hello world,hello c!";	printf("%c\n", *(txt + 1));  //输出e	printf("%c\n", *(txt + 2));  //输出l	printf("==========================\n");	int size = strlen(txt);	for (int i=0;i<size;i++)	{		printf("%c\n", *(txt + i));  	}	//发现txt+1,就移动1个字节,是因为char类型占一个直接	return 0;}

打印字符指针:

指针 偏移是跟指针类型有关系,char类型指针加1,就移动1个直接

再看下面这个,再解析PE格式

PIMAGE_SECTION_HEADER temp_section_header = section_header;for (int i = 0; i < file_header->NumberOfSections; i++){		void* des = (void*)((unsigned long)temp_buffer + temp_section_header->VirtualAddress);  	//temp_section_header + 1,移动多少呢?		void* src = (void*)((unsigned long)ptemp +(temp_section_header + i)->PointerToRawData);  		memcpy(des, src, temp_section_header->SizeOfRawData);}

是 sizeof(IMAGE_SECTION_HEADER),PIMAGE_SECTION_HEADER是IMAGE_SECTION_HEADER类型的指针.

标签: #c语言二级程序题怎么运行