PEViewerPE文件查看器编写

需要一点PE文件的知识,参考文章
https://blog.csdn.net/freeking101/article/details/102752048
按照这两张图片来的
在这里插入图片描述
在这里插入图片描述
一些主要的函数

//PE文件大部分地址以RVA形式存在,但是在文件中RVA需要转换才能定位到
DWORD RvaToRaw(DWORD rva,PIMAGE_SECTION_HEADER* pImage_Section_Header_Arr,int NumOfSections);
//判断dest目标区域的size个字节是否为空
bool ifZero(void* dest,int size);

//保存IMAGE_DOS_HEADER结构体到FilePath文件中
void SaveImageDosHeader(char* FilePath,IMAGE_DOS_HEADER* pImage_Dos_Header);
//保存IMAGE_NT_HEADERS结构体到FilePath文件中
void SaveImageNtHeaders(char* FilePath,IMAGE_NT_HEADERS* pImage_Nt_Headers);
//保存IMAGE_FILE_HEADER结构体到FilePath文件中
void SaveImageFileHeader(char* FilePath,IMAGE_FILE_HEADER* pImage_File_Header);

保存IMAGE_OPTIONAL_HEADER结构体到FilePath文件中
void SaveImageOptionalHeader(char* FilePath,IMAGE_OPTIONAL_HEADER* pImage_Optional_Header);
保存IMAGE_DATA_DIRECTORY结构体到FilePath文件中,因为有很多个,所以写成数组了
void SaveImageDataDirectoryArr(char* FilePath,IMAGE_DATA_DIRECTORY* pImage_Data_Directory_Arr,int NumOfImageDataDirectory);

//保存IMAGE_IMPORT_DESCRIPTOR结构体到FilePath文件中,因为也有很多个,所以写成数组了
void SaveImageImportDescriptorArr(char* FilePath,PIMAGE_IMPORT_DESCRIPTOR* pImage_Import_Descriptor_Arr,int NumOfImageImportDescriptor,char** Dll_Name_Arr,int NumOfImage_Import_Descriptor,char*** Dll_Functions_Name_Arr, int* NumOfFunctionsDllArr);

//保存IMAGE_SECTION_HEADER结构体到FilePath文件中,因为有很多哥所以写成数组了
void SaveImageSectionHeaderArr(char* FilePath,PIMAGE_SECTION_HEADER* pImage_Section_Header_Arr,int NumOfSections);
保存每一个IMAGE_DOS_HEADER结构体到FilePath文件中
void SavePerImageSectionHeader(FILE* file,IMAGE_SECTION_HEADER* pImage_Section_Header);

程序效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

完整思路

1.打开文件

    printf("请输入文件名:\n");
    char FilePath[256];
    scanf("%s",FilePath);
	FILE* file = fopen(FilePath,"r");
	if( !file ) {
        printf("无法打开文件!\n");
		return 0;
	}

2.获取相关信息

2.1 获取IMAGE_DOS_HEADER结构体
	//读取dos文件头
	IMAGE_DOS_HEADER* pImage_Dos_Header = new IMAGE_DOS_HEADER;
	fread(pImage_Dos_Header,sizeof(IMAGE_DOS_HEADER),1,file);

	if( pImage_Dos_Header->e_magic != (DWORD)('Z'*256+'M') ){
        printf("DOS开头不是MZ!\n");
		return 0;
	}
	
    SaveImageDosHeader("IMAGE_DOS_HEADER.txt",pImage_Dos_Header);

DOS头都是以MZ开头的,由于小段存放的缘故这里Z在高位,如果不是MZ开头的话直接退出

2.2 获取IMAGE_NT_HEADERS结构体
	//读取PE文件头
	fseek(file,pImage_Dos_Header->e_lfanew,SEEK_SET);
	IMAGE_NT_HEADERS* pImage_Nt_Headers = new IMAGE_NT_HEADERS;
	fread(pImage_Nt_Headers,sizeof(IMAGE_NT_HEADERS),1,file);

	if ( pImage_Nt_Headers->Signature != (DWORD)('E'*256+'P') ){
        printf("PE开头不是PE!\n");
		return 0;
	}
	
    SaveImageNtHeaders("IMAGE_NT_FILE_HEADERS.txt",pImage_Nt_Headers);

IMAGE_DOS_HEADER结构体中的e_lfanew指向了IMAGE_NT_HEADERS,这里利用它定位IMAGE_NT_HEADERS

PE头结构体一定是以PE开头的,与上文的MZ同理验证

2.2.1读取IMAGE_FILE_HEADER结构体
	//读取IMAGE_FILE_HEADER结构体
	IMAGE_FILE_HEADER* pImage_File_Header = new IMAGE_FILE_HEADER;
	fseek(file,pImage_Dos_Header->e_lfanew+4,SEEK_SET);
	fread(pImage_File_Header,sizeof(IMAGE_FILE_HEADER),1,file);
	
    SaveImageFileHeader("IMAGE_FILE_HEADER.txt",pImage_File_Header);

	//区块数量
	int NumberOfSections = pImage_File_Header->NumberOfSections;

这里的fseek是为了跳过IMAGE_NT_HEADERS的前4个字节的Signature数据,NumberOfSections是区块表的数量,后面会用到的

2.2.2读取IMAGE_OPTIONAL_HEADER结构体
	//读取IMAGE_OPTIONAL_HEADER
	IMAGE_OPTIONAL_HEADER* pImage_Optional_Header = new IMAGE_OPTIONAL_HEADER;
	fread(pImage_Optional_Header,sizeof(IMAGE_OPTIONAL_HEADER),1,file);
    
    SaveImageOptionalHeader("IMAGE_OPTIONAL_HEADER.txt",pImage_Optional_Header);

    //IMAGE_OPTIONAL_HEADER大小
    int SizeOfOptionalHeader = pImage_File_Header->SizeOfOptionalHeader;
2.2.2.1读取IMAGE_DATA_DIRECTORY数据目录表
    //读取IMAGE_DATA_DIRETORY数据目录表
    SaveImageDataDirectoryArr("IMAGE_DATA_DIRECTORY_ARR.txt",pImage_Optional_Header->DataDirectory,IMAGE_NUMBEROF_DIRECTORY_ENTRIES);
2.2.2.1.1读取导入表IMAGE_IMPORT_DESCRIPTOR(重点)
    //读取导入表IMAGE_DIRECTORY_ENTRY_IMPORT 1
    DWORD raw = RvaToRaw(pImage_Optional_Header->DataDirectory[1].VirtualAddress,pImage_Section_Header_Arr,NumberOfSections);
    fseek(file,raw,SEEK_SET);
    PIMAGE_IMPORT_DESCRIPTOR* pImage_Import_Descriptor_Arr = new PIMAGE_IMPORT_DESCRIPTOR;
    int NumOfImage_Import_Descriptor = 0;
    do{
        pImage_Import_Descriptor_Arr[NumOfImage_Import_Descriptor] = new IMAGE_IMPORT_DESCRIPTOR;
        fread(pImage_Import_Descriptor_Arr[NumOfImage_Import_Descriptor],sizeof(IMAGE_IMPORT_DESCRIPTOR),1,file);
        if(ifZero(pImage_Import_Descriptor_Arr[NumOfImage_Import_Descriptor],sizeof(IMAGE_IMPORT_DESCRIPTOR)/2)){
            break;
        }
        NumOfImage_Import_Descriptor++;
    }while(true);

    //导入表中dll的name数组
    char** Dll_Name_Arr = new char*[NumOfImage_Import_Descriptor];
    //导入表中每个dll的函数名字数组
    char*** Dll_Functions_Name_Arr = new char**[NumOfImage_Import_Descriptor];
    char temp[256] = {0};
    int NumOfFunctionsDllArr[256] = {0};
    for(int i = 0;i < NumOfImage_Import_Descriptor; i++){
        DWORD raw = RvaToRaw(pImage_Import_Descriptor_Arr[i]->Name,pImage_Section_Header_Arr,NumberOfSections);
        fseek(file,raw,SEEK_SET);
        //fscanf(file,"%s",temp);
        fgets(temp,32,file);
        Dll_Name_Arr[i] = new char[strlen(temp)+1];
        strcpy(Dll_Name_Arr[i],temp);
        NumOfFunctionsDllArr[i] = 0;
        raw = RvaToRaw(pImage_Import_Descriptor_Arr[i]->FirstThunk,pImage_Section_Header_Arr,NumberOfSections);
        //temp2记录OriginalFirstThunk的Import_Thunk_Data的地址
        DWORD temp2 = 0;
        DWORD pos = raw;
        const int max_funcions_per_dll = 100;
        Dll_Functions_Name_Arr[i] = new char*[max_funcions_per_dll];
        do{
            fseek(file,pos,SEEK_SET);
            fread(&temp2,sizeof(DWORD),1,file);
            if(!temp2) break;
            raw = RvaToRaw(temp2,pImage_Section_Header_Arr,NumberOfSections);
            fseek(file,raw,SEEK_SET);
            fgets(temp,256,file);
            Dll_Functions_Name_Arr[i][NumOfFunctionsDllArr[i]] =  new char[strlen(temp)+1];
            strcpy(Dll_Functions_Name_Arr[i][NumOfFunctionsDllArr[i]],temp+2);
            NumOfFunctionsDllArr[i]++;
            pos = pos + sizeof(DWORD);
        }while(temp2);
    }
    SaveImageImportDescriptorArr("IMAGE_IMPORT_DESCRIPTOR_ARR.txt",pImage_Import_Descriptor_Arr,NumOfImage_Import_Descriptor,Dll_Name_Arr,NumOfImage_Import_Descriptor,Dll_Functions_Name_Arr,NumOfFunctionsDllArr);
2.3 读取区块表Section Table
	//读取IMAGE_SECTION_TABLE
	PIMAGE_SECTION_HEADER* pImage_Section_Header_Arr = new PIMAGE_SECTION_HEADER[NumberOfSections];
	for(int i = 0;i < NumberOfSections;i++ ) {
        pImage_Section_Header_Arr[i] = new IMAGE_SECTION_HEADER;
		fread(pImage_Section_Header_Arr[i],sizeof(IMAGE_SECTION_HEADER),1,file);
	}

    SaveImageSectionHeaderArr("IMAGE_SECTION_HEADER_ARR.txt",pImage_Section_Header_Arr,NumberOfSections);

完整代码

#include <stdio.h>
#include <windows.h>
#include <winnt.h>

DWORD RvaToRaw(DWORD rva,PIMAGE_SECTION_HEADER* pImage_Section_Header_Arr,int NumOfSections);
bool ifZero(void* dest,int size);

void SaveImageDosHeader(char* FilePath,IMAGE_DOS_HEADER* pImage_Dos_Header);
void SaveImageNtHeaders(char* FilePath,IMAGE_NT_HEADERS* pImage_Nt_Headers);
void SaveImageFileHeader(char* FilePath,IMAGE_FILE_HEADER* pImage_File_Header);

void SaveImageOptionalHeader(char* FilePath,IMAGE_OPTIONAL_HEADER* pImage_Optional_Header);
void SaveImageDataDirectoryArr(char* FilePath,IMAGE_DATA_DIRECTORY* pImage_Data_Directory_Arr,int NumOfImageDataDirectory);

void SaveImageImportDescriptorArr(char* FilePath,PIMAGE_IMPORT_DESCRIPTOR* pImage_Import_Descriptor_Arr,int NumOfImageImportDescriptor,char** Dll_Name_Arr,int NumOfImage_Import_Descriptor,char*** Dll_Functions_Name_Arr, int* NumOfFunctionsDllArr);

void SaveImageSectionHeaderArr(char* FilePath,PIMAGE_SECTION_HEADER* pImage_Section_Header_Arr,int NumOfSections);
void SavePerImageSectionHeader(FILE* file,IMAGE_SECTION_HEADER* pImage_Section_Header);


int main(){

	//打开文件
    printf("请输入文件名:\n");
    char FilePath[256];
    scanf("%s",FilePath);

	//获取相关信息
	FILE* file = fopen(FilePath,"r");
	if( !file ) {
        printf("无法打开文件!\n");
		return 0;
	}
	//读取dos文件头
	IMAGE_DOS_HEADER* pImage_Dos_Header = new IMAGE_DOS_HEADER;
	fread(pImage_Dos_Header,sizeof(IMAGE_DOS_HEADER),1,file);

	if( pImage_Dos_Header->e_magic != (DWORD)('Z'*256+'M') ){
        printf("DOS开头不是MZ!\n");
		return 0;
	}
	
    SaveImageDosHeader("IMAGE_DOS_HEADER.txt",pImage_Dos_Header);

	//读取PE文件头
	fseek(file,pImage_Dos_Header->e_lfanew,SEEK_SET);
	IMAGE_NT_HEADERS* pImage_Nt_Headers = new IMAGE_NT_HEADERS;
	fread(pImage_Nt_Headers,sizeof(IMAGE_NT_HEADERS),1,file);

	if ( pImage_Nt_Headers->Signature != (DWORD)('E'*256+'P') ){
        printf("PE开头不是PE!\n");
		return 0;
	}
	
    SaveImageNtHeaders("IMAGE_NT_FILE_HEADERS.txt",pImage_Nt_Headers);

	//读取IMAGE_FILE_HEADER结构体
	IMAGE_FILE_HEADER* pImage_File_Header = new IMAGE_FILE_HEADER;
	fseek(file,pImage_Dos_Header->e_lfanew+4,SEEK_SET);
	fread(pImage_File_Header,sizeof(IMAGE_FILE_HEADER),1,file);
	
    SaveImageFileHeader("IMAGE_FILE_HEADER.txt",pImage_File_Header);

	//区块数量
	int NumberOfSections = pImage_File_Header->NumberOfSections;
	
	//读取IMAGE_OPTIONAL_HEADER
	IMAGE_OPTIONAL_HEADER* pImage_Optional_Header = new IMAGE_OPTIONAL_HEADER;
	fread(pImage_Optional_Header,sizeof(IMAGE_OPTIONAL_HEADER),1,file);
    
    SaveImageOptionalHeader("IMAGE_OPTIONAL_HEADER.txt",pImage_Optional_Header);

    //IMAGE_OPTIONAL_HEADER大小
    int SizeOfOptionalHeader = pImage_File_Header->SizeOfOptionalHeader;

    //读取IMAGE_DATA_DIRETORY数据目录表
    SaveImageDataDirectoryArr("IMAGE_DATA_DIRECTORY_ARR.txt",pImage_Optional_Header->DataDirectory,IMAGE_NUMBEROF_DIRECTORY_ENTRIES);

	//读取IMAGE_SECTION_TABLE
	PIMAGE_SECTION_HEADER* pImage_Section_Header_Arr = new PIMAGE_SECTION_HEADER[NumberOfSections];
	for(int i = 0;i < NumberOfSections;i++ ) {
        pImage_Section_Header_Arr[i] = new IMAGE_SECTION_HEADER;
		fread(pImage_Section_Header_Arr[i],sizeof(IMAGE_SECTION_HEADER),1,file);
	}

    SaveImageSectionHeaderArr("IMAGE_SECTION_HEADER_ARR.txt",pImage_Section_Header_Arr,NumberOfSections);

    //读取导出表IMAGE_DIRECTORY_ENTRY_EMPORT 0

    //读取导入表IMAGE_DIRECTORY_ENTRY_IMPORT 1
    DWORD raw = RvaToRaw(pImage_Optional_Header->DataDirectory[1].VirtualAddress,pImage_Section_Header_Arr,NumberOfSections);
    fseek(file,raw,SEEK_SET);
    PIMAGE_IMPORT_DESCRIPTOR* pImage_Import_Descriptor_Arr = new PIMAGE_IMPORT_DESCRIPTOR;
    int NumOfImage_Import_Descriptor = 0;
    do{
        pImage_Import_Descriptor_Arr[NumOfImage_Import_Descriptor] = new IMAGE_IMPORT_DESCRIPTOR;
        fread(pImage_Import_Descriptor_Arr[NumOfImage_Import_Descriptor],sizeof(IMAGE_IMPORT_DESCRIPTOR),1,file);
        if(ifZero(pImage_Import_Descriptor_Arr[NumOfImage_Import_Descriptor],sizeof(IMAGE_IMPORT_DESCRIPTOR)/2)){
            break;
        }
        NumOfImage_Import_Descriptor++;
    }while(true);

    //导入表中dll的name数组
    char** Dll_Name_Arr = new char*[NumOfImage_Import_Descriptor];
    //导入表中每个dll的函数名字数组
    char*** Dll_Functions_Name_Arr = new char**[NumOfImage_Import_Descriptor];
    char temp[256] = {0};
    int NumOfFunctionsDllArr[256] = {0};
    for(int i = 0;i < NumOfImage_Import_Descriptor; i++){
        DWORD raw = RvaToRaw(pImage_Import_Descriptor_Arr[i]->Name,pImage_Section_Header_Arr,NumberOfSections);
        fseek(file,raw,SEEK_SET);
        //fscanf(file,"%s",temp);
        fgets(temp,32,file);
        Dll_Name_Arr[i] = new char[strlen(temp)+1];
        strcpy(Dll_Name_Arr[i],temp);
        NumOfFunctionsDllArr[i] = 0;
        raw = RvaToRaw(pImage_Import_Descriptor_Arr[i]->FirstThunk,pImage_Section_Header_Arr,NumberOfSections);
        //temp2记录OriginalFirstThunk的Import_Thunk_Data的地址
        DWORD temp2 = 0;
        DWORD pos = raw;
        const int max_funcions_per_dll = 100;
        Dll_Functions_Name_Arr[i] = new char*[max_funcions_per_dll];
        do{
            fseek(file,pos,SEEK_SET);
            fread(&temp2,sizeof(DWORD),1,file);
            if(!temp2) break;
            raw = RvaToRaw(temp2,pImage_Section_Header_Arr,NumberOfSections);
            fseek(file,raw,SEEK_SET);
            fgets(temp,256,file);
            Dll_Functions_Name_Arr[i][NumOfFunctionsDllArr[i]] =  new char[strlen(temp)+1];
            strcpy(Dll_Functions_Name_Arr[i][NumOfFunctionsDllArr[i]],temp+2);
            NumOfFunctionsDllArr[i]++;
            pos = pos + sizeof(DWORD);
        }while(temp2);
    }
    SaveImageImportDescriptorArr("IMAGE_IMPORT_DESCRIPTOR_ARR.txt",pImage_Import_Descriptor_Arr,NumOfImage_Import_Descriptor,Dll_Name_Arr,NumOfImage_Import_Descriptor,Dll_Functions_Name_Arr,NumOfFunctionsDllArr);
    //读取导入函数地址表IMAGE_DIRECTORY_ENTRY_IAT 12
    fclose(file);
    return 0;
}

DWORD RvaToRaw(DWORD rva,PIMAGE_SECTION_HEADER* pImage_Section_Header_Arr,int NumOfSections){
    int pos_in_sections = NumOfSections - 1;
    //查找在第几个SECTION里
    for(int i = 0;i < NumOfSections - 1;i++ ){
        if(pImage_Section_Header_Arr[i]->VirtualAddress <= rva && rva <= pImage_Section_Header_Arr[i+1]->VirtualAddress){
            pos_in_sections = i;
        }
    }
    DWORD raw = rva - pImage_Section_Header_Arr[pos_in_sections]->VirtualAddress + pImage_Section_Header_Arr[pos_in_sections]->PointerToRawData;
    return raw;
}
bool ifZero(void* dest,int size){
    for(int i = 0;i < size;i++ ){
        if(((BYTE*)dest)[i]){
            return false;
        }
    }
    return true;
}
void SaveImageDosHeader(char* FilePath,IMAGE_DOS_HEADER* pImage_Dos_Header){
    FILE* file = fopen(FilePath,"w");
    fputs("IMAGE_DOS_HEADER:\n",file);
    fprintf(file,"\t->e_magic\t = 0x%08X\n",pImage_Dos_Header->e_magic);
    fprintf(file,"\t->e_cblp\t = 0x%08X\n",pImage_Dos_Header->e_cblp);
    fprintf(file,"\t->e_cp\t = 0x%08X\n",pImage_Dos_Header->e_cp);
    fprintf(file,"\t->e_crlc\t = 0x%08X\n",pImage_Dos_Header->e_crlc);
    fprintf(file,"\t->e_cparhdr\t = 0x%08X\n",pImage_Dos_Header->e_cparhdr);
    fprintf(file,"\t->e_minalloc\t = 0x%08X\n",pImage_Dos_Header->e_minalloc);
    fprintf(file,"\t->e_maxalloc\t = 0x%08X\n",pImage_Dos_Header->e_maxalloc);
    fprintf(file,"\t->e_ss\t = 0x%08X\n",pImage_Dos_Header->e_ss);
    fprintf(file,"\t->e_sp\t = 0x%08X\n",pImage_Dos_Header->e_sp);
    fprintf(file,"\t->e_csum\t = 0x%08X\n",pImage_Dos_Header->e_csum);
    fprintf(file,"\t->e_ip\t = 0x%08X\n",pImage_Dos_Header->e_ip);
    fprintf(file,"\t->e_cs\t = 0x%08X\n",pImage_Dos_Header->e_cs);
    fprintf(file,"\t->e_lfarlc\t = 0x%08X\n",pImage_Dos_Header->e_lfarlc);
    fprintf(file,"\t->e_ovno\t = 0x%08X\n",pImage_Dos_Header->e_ovno);
    fprintf(file,"\t->e_res[4]\t = 0x%08X\n",pImage_Dos_Header->e_res);
    fprintf(file,"\t->e_oemid\t = 0x%08X\n",pImage_Dos_Header->e_oemid);
    fprintf(file,"\t->e_oeminfo\t = 0x%08X\n",pImage_Dos_Header->e_oeminfo);
    fprintf(file,"\t->e_res2[10]\t = 0x%08X\n",pImage_Dos_Header->e_res2);
    fprintf(file,"\t->e_lfanew\t = 0x%08X\n",pImage_Dos_Header->e_lfanew);
    fclose(file);
}
void SaveImageNtHeaders(char* FilePath,IMAGE_NT_HEADERS* pImage_Nt_Headers){
    FILE* file = fopen(FilePath,"w");
    fprintf(file,"IMAGE_NT_HEADERS\n");
    fprintf(file,"\t->Signature\t = 0x%08X\n",pImage_Nt_Headers->Signature);
    fprintf(file,"\t->IMAGE_FILE_HEADER\t = 0x%08X\n",pImage_Nt_Headers->FileHeader);
    fprintf(file,"\t->IMAGE_OPTIONAL_HEADER32\t = 0x%08X\n",pImage_Nt_Headers->OptionalHeader);
    fclose(file);
}
void SaveImageFileHeader(char* FilePath,IMAGE_FILE_HEADER* pImage_File_Header){
    FILE* file = fopen(FilePath,"w");
    fprintf(file,"IMAGE_FILE_HEADER\n");
    fprintf(file,"\t->Machine\t = 0x%08X\n",pImage_File_Header->Machine);
    fprintf(file,"\t->NumberOfSections\t = 0x%08X\n",pImage_File_Header->NumberOfSections);
    fprintf(file,"\t->TimeDateStamp\t = 0x%08X\n",pImage_File_Header->TimeDateStamp);
    fprintf(file,"\t->PointerToSymbolTable\t = 0x%08X\n",pImage_File_Header->PointerToSymbolTable);
    fprintf(file,"\t->NumberOfSymbols\t = 0x%08X\n",pImage_File_Header->NumberOfSymbols);
    fprintf(file,"\t->SizeOfOptionalHeader\t = 0x%08X\n",pImage_File_Header->SizeOfOptionalHeader);
    fprintf(file,"\t->Characteristics\t = 0x%08X\n",pImage_File_Header->Characteristics);
    fclose(file);
}
void SaveImageOptionalHeader(char* FilePath,IMAGE_OPTIONAL_HEADER* pImage_Optional_Header){
    FILE* file = fopen(FilePath,"w");
    fprintf(file,"IMAGE_OPTIONAL_HEADER\n");
    fprintf(file,"\t->Magic\t = 0x%08X\n",pImage_Optional_Header->Magic);
    fprintf(file,"\t->MajorLinkerVersion\t = 0x%08X\n",pImage_Optional_Header->MajorLinkerVersion);
    fprintf(file,"\t->MinorLinkerVersion\t = 0x%08X\n",pImage_Optional_Header->MinorLinkerVersion);
    fprintf(file,"\t->SizeOfCode\t = 0x%08X\n",pImage_Optional_Header->SizeOfCode);
    fprintf(file,"\t->SizeOfInitializedData\t = 0x%08X\n",pImage_Optional_Header->SizeOfInitializedData);
    fprintf(file,"\t->SizeOfUninitializedData\t = 0x%08X\n",pImage_Optional_Header->SizeOfUninitializedData);
    fprintf(file,"\t->AddressOfEntryPoint\t = 0x%08X\n",pImage_Optional_Header->AddressOfEntryPoint);
    fprintf(file,"\t->BaseOfCode\t = 0x%08X\n",pImage_Optional_Header->BaseOfCode);
    fprintf(file,"\t->ImageBase\t = 0x%08X\n",pImage_Optional_Header->ImageBase);
    fprintf(file,"\t->SectionAlignment\t = 0x%08X\n",pImage_Optional_Header->SectionAlignment);
    fprintf(file,"\t->FileAlignment\t = 0x%08X\n",pImage_Optional_Header->FileAlignment);
    fprintf(file,"\t->MajorOperatingSystemVersion\t = 0x%08X\n",pImage_Optional_Header->MajorOperatingSystemVersion);
    fprintf(file,"\t->MinorOperatingSystemVersion\t = 0x%08X\n",pImage_Optional_Header->MinorOperatingSystemVersion);
    fprintf(file,"\t->MajorImageVersion\t = 0x%08X\n",pImage_Optional_Header->MajorImageVersion);
    fprintf(file,"\t->MinorImageVersion\t = 0x%08X\n",pImage_Optional_Header->MinorImageVersion);
    fprintf(file,"\t->MajorSubsystemVersion\t = 0x%08X\n",pImage_Optional_Header->MajorSubsystemVersion);
    fprintf(file,"\t->MinorSubsystemVersion\t = 0x%08X\n",pImage_Optional_Header->MinorSubsystemVersion);
    fprintf(file,"\t->Win32VersionValue\t = 0x%08X\n",pImage_Optional_Header->Win32VersionValue);
    fprintf(file,"\t->SizeOfImage\t = 0x%08X\n",pImage_Optional_Header->SizeOfImage);
    fprintf(file,"\t->SizeOfHeaders\t = 0x%08X\n",pImage_Optional_Header->SizeOfHeaders);
    fprintf(file,"\t->CheckSum\t = 0x%08X\n",pImage_Optional_Header->CheckSum);
    fprintf(file,"\t->Subsystem\t = 0x%08X\n",pImage_Optional_Header->Subsystem);
    fprintf(file,"\t->DllCharacteristics\t = 0x%08X\n",pImage_Optional_Header->DllCharacteristics);
    fprintf(file,"\t->SizeOfStackReserve\t = 0x%08X\n",pImage_Optional_Header->SizeOfStackCommit);
    fprintf(file,"\t->SizeOfStackCommit\t = 0x%08X\n",pImage_Optional_Header->SizeOfStackReserve);
    fprintf(file,"\t->SizeOfHeapReserve\t = 0x%08X\n",pImage_Optional_Header->SizeOfHeapReserve);
    fprintf(file,"\t->SizeOfHeapCommit\t = 0x%08X\n",pImage_Optional_Header->SizeOfHeapCommit);
    fprintf(file,"\t->LoaderFlags\t = 0x%08X\n",pImage_Optional_Header->LoaderFlags);
    fprintf(file,"\t->NumberOfRvaAndSizes\t = 0x%08X\n",pImage_Optional_Header->NumberOfRvaAndSizes);
    fprintf(file,"\t->DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]\t = 0x%08X\n",pImage_Optional_Header->DataDirectory);
    fclose(file);
}
void SaveImageDataDirectoryArr(char* FilePath,IMAGE_DATA_DIRECTORY* pImage_Data_Directory_Arr,int NumOfImageDataDirectory){
    FILE* file = fopen(FilePath,"w");
    fprintf(file,"IMAGE_DATA_DIRECTORY_ARR\n");
    for(int i = 0;i < NumOfImageDataDirectory;i++ ){
        fprintf(file,"IMAGE_DATA_DIRECTORY_ARR[%d]\n",i);
        fprintf(file,"IMAGE_DATA_DIRECTORY:\n");
        fprintf(file,"\t->VirtualAddress\t = 0x%08X\n",(pImage_Data_Directory_Arr+i)->VirtualAddress);
        fprintf(file,"\t->Size\t = 0x%08X\n",(pImage_Data_Directory_Arr+i)->Size);
        fprintf(file,"\n");
    }
    fclose(file);
}
void SaveImageSectionHeaderArr(char* FilePath,PIMAGE_SECTION_HEADER* pImage_Section_Header_Arr,int NumOfSections){
    FILE* file = fopen(FilePath,"w");
    fprintf(file,"IMAGE_SECTION_HEADER_ARR\n");
    for( int i = 0;i < NumOfSections;i++ ){
        fprintf(file,"IMAGE_SECTION_HEADER_ARR[%d]\n",i);
        SavePerImageSectionHeader(file,pImage_Section_Header_Arr[i]);
        fprintf(file,"\n");
    }
    fclose(file);
}

void SaveImageImportDescriptorArr(char* FilePath,PIMAGE_IMPORT_DESCRIPTOR* pImage_Import_Descriptor_Arr,int NumOfImageImportDescriptor,char** Dll_Name_Arr,int NumOfImage_Import_Descriptor,char*** Dll_Functions_Name_Arr, int* NumOfFunctionsDllArr){
    FILE* file = fopen(FilePath,"w");
    fprintf(file,"IMAGE_IMPORT_DESCRIPTOR_ARR\n");
    for(int i = 0; i < NumOfImageImportDescriptor; i++){
        fprintf(file,"IMAGE_IMPORT_DESCRIPTOR_ARR[%d]:\n",i);
        fprintf(file,"\t->OriginalFirstThunk\t = 0x%08X\n",pImage_Import_Descriptor_Arr[i]->OriginalFirstThunk);
        for(int j = 0;j < NumOfFunctionsDllArr[i];j++ ){
            fprintf(file,"\t->     \t %s \n",Dll_Functions_Name_Arr[i][j]);
        }
        fprintf(file,"\n");
        fprintf(file,"\t->TimeDateStamp\t = 0x%08X\n",pImage_Import_Descriptor_Arr[i]->TimeDateStamp);
        fprintf(file,"\t->ForwarderChain\t = 0x%08X\n",pImage_Import_Descriptor_Arr[i]->ForwarderChain);
        fprintf(file,"\t->Name\t = 0x%08X\n",pImage_Import_Descriptor_Arr[i]->Name);
        fprintf(file,"\t      \t = %s\n\n",Dll_Name_Arr[i]);
        fprintf(file,"\t->FirstThunk\t = 0x%08X\n",pImage_Import_Descriptor_Arr[i]->FirstThunk);
        fprintf(file,"\n");
    }
    fclose(file);
}

void SavePerImageSectionHeader(FILE* file,IMAGE_SECTION_HEADER* pImage_Section_Header){
    fprintf(file,"IMAGE_SECTION_HEADER\n");
    fprintf(file,"\t->Name[IMAGE_SIZEOF_SHORT_NAME]\t = %s\n",pImage_Section_Header->Name);
    fprintf(file,"\t->VirtualSize\t = 0x%08X\n",pImage_Section_Header->Misc);
    fprintf(file,"\t->VirtualAddress\t = 0x%08X\n",pImage_Section_Header->VirtualAddress);
    fprintf(file,"\t->SizeOfRawData\t = 0x%08X\n",pImage_Section_Header->SizeOfRawData);
    fprintf(file,"\t->PointerToRawData\t = 0x%08X\n",pImage_Section_Header->PointerToRawData);
    fprintf(file,"\t->PointerToRelocations\t = 0x%08X\n",pImage_Section_Header->PointerToRelocations);
    fprintf(file,"\t->PointerToLinenumbers\t = 0x%08X\n",pImage_Section_Header->PointerToLinenumbers);
    fprintf(file,"\t->NumberOfRelocations\t = 0x%08X\n",pImage_Section_Header->NumberOfRelocations);
    fprintf(file,"\t->NumberOfLinenumbers\t = 0x%08X\n",pImage_Section_Header->NumberOfLinenumbers);
    fprintf(file,"\t->Characteristics\t = 0x%08X\n",pImage_Section_Header->Characteristics);
    fprintf(file,"\t->Characteristics\t = 0x%08X\n",pImage_Section_Header->Characteristics);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值