PeTools开发(五)

功能:

01:展示输出表信息

02: 展示输入表信息

03:资源表信息

04:重定位表信息

05:绑定导入表信息


难点:

01: 定义全局变量, 区别每个点击按钮, 使用一个对话框,分别对消息进行接收

02: 读取PE信息, 对每个表的信息进行展示

03: 字符串的使用方法 sprintf  strcat  的用法

04 SendMessage


实例展示:

360截图20171224232343740.jpg


主要代码:


VOID SetPeFileInfo(HWND hwndDlg,LPSTR lpszFile)
{
	HWND hInfoMation = GetDlgItem(hwndDlg,IDC_EDIT_INFOMATION);
	TCHAR InfoStr[200240]={0};
	TCHAR rn[100] = {0};
	
	LPVOID pFileBuffer = NULL;
	pFileBuffer= ReadPEFile(lpszFile);
	if(!pFileBuffer)
	{
		printf("文件读取失败\n");
		return;
	}

	PIMAGE_DOS_HEADER pDosHeader = NULL;
	PIMAGE_NT_HEADERS pNTHeader = NULL;
	PIMAGE_FILE_HEADER pPEHeader = NULL;
	PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL;
	PIMAGE_SECTION_HEADER pSectionHeader = NULL;
	PIMAGE_DATA_DIRECTORY DataDirectory=NULL;
	
	//Header信息
	pDosHeader = (PIMAGE_DOS_HEADER)pFileBuffer;
	pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pFileBuffer+pDosHeader->e_lfanew);
	pPEHeader = (PIMAGE_FILE_HEADER)(((DWORD)pNTHeader)+4);
	pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)pPEHeader+IMAGE_SIZEOF_FILE_HEADER);
	pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader+pPEHeader->SizeOfOptionalHeader);

	//定位Directory_Data;
	DataDirectory = pOptionHeader->DataDirectory;
	DWORD FoA = 0;

	/*
	TCHAR rn[100] = TEXT("www.gyarmy.com");
	sprintf(InfoStr,"\r\n%d\r\n%d\r\n%d",InfoNum,InfoNum,InfoNum);
	strcat(InfoStr,rn);
	SendMessage(hInfoMation,WM_SETTEXT,0,(long)InfoStr);
	*/
	
	switch(InfoNum)
	{
	case INFO_EXPORT:
		{	
			
			//确定导出表信息
			//printf("%x \n",FoA);
			DWORD Export_Directory_Address = DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
			DWORD Export_Directory_Size = DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
			
			if(Export_Directory_Size == 0)
			{
				haveDirectory = FALSE;
				MessageBox(0,TEXT("没有输出表"),TEXT("错误"),0);
				return;
			}else{
				haveDirectory = TRUE;

			}

			FoA = RVAToFileOffset(pFileBuffer,Export_Directory_Address);
			//定位导出表的位置
			PIMAGE_EXPORT_DIRECTORY pExDirectory = NULL;
			pExDirectory = (PIMAGE_EXPORT_DIRECTORY)((DWORD)pFileBuffer + FoA);
			
			//基本信息
			sprintf(rn,"输出表基本信息 : \r\n");
			strcat(InfoStr,rn);

			sprintf(rn,"Characteristics: %08X\r\n",pExDirectory->Characteristics);
			strcat(InfoStr,rn);
			sprintf(rn,"TimeDateStamp: %08X\r\n",pExDirectory->TimeDateStamp);
			strcat(InfoStr,rn);
			sprintf(rn,"MajorVersion: %08X\r\n",pExDirectory->MajorVersion);
			strcat(InfoStr,rn);
			sprintf(rn,"MinorVersion: %08X\r\n",pExDirectory->MinorVersion);
			strcat(InfoStr,rn);
			sprintf(rn,"Name: %08X\r\n",pExDirectory->Name);
			strcat(InfoStr,rn);
			sprintf(rn,"Base: %08X\r\n",pExDirectory->Base);
			strcat(InfoStr,rn);
			sprintf(rn,"NumberOfFunctions: %08X\r\n",pExDirectory->NumberOfFunctions);
			strcat(InfoStr,rn);
			sprintf(rn,"NumberOfNames: %08X\r\n",pExDirectory->NumberOfNames);
			strcat(InfoStr,rn);
			sprintf(rn,"AddressOfFunctions: %08X\r\n",pExDirectory->AddressOfFunctions);
			strcat(InfoStr,rn);
			sprintf(rn,"AddressOfNames: %08X\r\n",pExDirectory->AddressOfNames);
			strcat(InfoStr,rn);
			sprintf(rn,"AddressOfNameOrdinals: %08X\r\n-------------\r\n",pExDirectory->AddressOfNameOrdinals);
			strcat(InfoStr,rn);
	
			//输出函数地址表信息
			//AddressOfFunctions
			DWORD ExAddressOfFunctions = pExDirectory->AddressOfFunctions;
			DWORD ExAddressOfFunctionsFoA = RVAToFileOffset(pFileBuffer,ExAddressOfFunctions);
			DWORD ExNumberOfFunctions = pExDirectory->NumberOfFunctions;
			
			PDWORD pExAddressOfFunctions = NULL;
			pExAddressOfFunctions = (PDWORD)((DWORD)pFileBuffer + ExAddressOfFunctionsFoA);

			
			sprintf(rn,"每个函数地址表信息: \r\n");
			strcat(InfoStr,rn);

			//输出每个函数地址表信息
			DWORD k =0;
			for(k=0;k<ExNumberOfFunctions;k++)
			{
				//printf("%d : %x \n",k,);
				sprintf(rn,"%d : %08X\r\n",k,*pExAddressOfFunctions);
				strcat(InfoStr,rn);

				pExAddressOfFunctions++;
			}
			sprintf(rn,"-----------------\r\n");
			strcat(InfoStr,rn);

			
			sprintf(rn,"函数名称表: \r\n");
			strcat(InfoStr,rn);

			//函数名称表
			DWORD ExAddressOfNames = pExDirectory->AddressOfNames;
			DWORD ExAddressOfNamesFoA = RVAToFileOffset(pFileBuffer,ExAddressOfNames);
			DWORD ExNumberOfNames = pExDirectory->NumberOfNames;
			
			PDWORD pExAddressOfNames = NULL;
			pExAddressOfNames = (PDWORD)((DWORD)pFileBuffer + ExAddressOfNamesFoA);

			for(k=0;k<ExNumberOfNames;k++)
			{
				//printf("%d : %x   \n",k,*pExAddressOfNames);
				
				sprintf(rn,"%d : %08X\r\n",k,*pExAddressOfNames);
				strcat(InfoStr,rn);

				//函数名的地址转换为FoA ,输出函数名
				PDWORD NameAddress = (PDWORD)RVAToFileOffset(pFileBuffer,*pExAddressOfNames);
				//输出函数名
				printf("%s \n",(char*)((DWORD)pFileBuffer + (DWORD)NameAddress));

				sprintf(rn,"%s \r\n",(char*)((DWORD)pFileBuffer + (DWORD)NameAddress));
				strcat(InfoStr,rn);

				pExAddressOfNames++;
			}

			sprintf(rn,"-----------------\r\n");
			strcat(InfoStr,rn);

			
			//函数序号表

			sprintf(rn,"函数序号表: \r\n");
			strcat(InfoStr,rn);
			
			DWORD ExAddressOfNameOrdinals = pExDirectory->AddressOfNameOrdinals;
			DWORD ExAddressOfNameOrdinalsFoA = RVAToFileOffset(pFileBuffer,ExAddressOfNameOrdinals);
			ExNumberOfNames = pExDirectory->NumberOfNames;
			PWORD pExAddressOfNameOrdinals = NULL;
			pExAddressOfNameOrdinals = (PWORD)((DWORD)pFileBuffer + ExAddressOfNameOrdinalsFoA);

			for(k=0;k<ExNumberOfNames;k++)
			{
				//printf("%d : %x   \n",k,*pExAddressOfNameOrdinals);	
				sprintf(rn,"%d : %08X \r\n",k,*pExAddressOfNameOrdinals);
				strcat(InfoStr,rn);

				pExAddressOfNameOrdinals++;
			}


			sprintf(rn,"-----------------\r\n");
			strcat(InfoStr,rn);
			SendMessage(hInfoMation,WM_SETTEXT,0,(long)InfoStr);

			break;
		}
	case INFO_IMPORT:
		{
			//基本信息
			//sprintf(rn,"%d : %08X \r\n",k,*pExAddressOfNameOrdinals);

			

			sprintf(rn,"输入表基本信息 : \r\n");
			strcat(InfoStr,rn);

			//确定导入表
			//pImportDirectory = NULL;
			IMAGE_DATA_DIRECTORY pImportDirectory = DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
			
			DWORD ImportVirtualAddress = pImportDirectory.VirtualAddress;
			DWORD ImportFoa = RVAToFileOffset(pFileBuffer,ImportVirtualAddress);
			
			if(pImportDirectory.Size == 0)
			{
				haveDirectory = FALSE;
				MessageBox(0,TEXT("没有输入表"),TEXT("错误"),0);
				return;
			}else{
				haveDirectory = TRUE;

			}
			
			sprintf(rn,"ImportVirtualAddress: %08X \r\n",ImportVirtualAddress);
			strcat(InfoStr,rn);
			sprintf(rn,"Size: %08X \r\n",pImportDirectory.Size);
			strcat(InfoStr,rn);
			sprintf(rn,"ImportFoa: %08X \r\n",ImportFoa);
			strcat(InfoStr,rn);

			//输出所有的导入表
			//PIMAGE_THUNK_DATA32 pThunkData = NULL;
			//第一个导入表
			PIMAGE_IMPORT_DESCRIPTOR pImportDes = NULL;
			pImportDes = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)pFileBuffer + ImportFoa);
			
			while(pImportDes->OriginalFirstThunk != 0x0 && pImportDes->FirstThunk != 0x0 )
			{
				//输出所有的dll
				sprintf(rn,"OriginalFirstThunk: %08X \r\n",pImportDes->OriginalFirstThunk);
				strcat(InfoStr,rn);
				DWORD pNameAddress =  RVAToFileOffset(pFileBuffer,pImportDes->Name);
				PSTR pDllName = (PSTR)((DWORD)pFileBuffer + pNameAddress);
				
				sprintf(rn,"name: %s \r\n",pDllName);
				strcat(InfoStr,rn);
				sprintf(rn,"------------------------------- : \r\n");
				strcat(InfoStr,rn);
				//输出OriginalFirstThunk的信息
				DWORD Thunk_Address = RVAToFileOffset(pFileBuffer,pImportDes->OriginalFirstThunk);
				PIMAGE_THUNK_DATA32 pThunkData = (PIMAGE_THUNK_DATA32)((DWORD)pFileBuffer + Thunk_Address);
				
				//根据pThunkData 的最高为来判断
				DWORD ImportOrdinal = pThunkData->u1.Ordinal;
				while(ImportOrdinal)
				{
					//输出所有所有的信息
					//#define IMAGE_ORDINAL_FLAG32 0x80000000
					if(ImportOrdinal & IMAGE_ORDINAL_FLAG32)
					{
						sprintf(rn,"按序号导入: %08X \r\n",ImportOrdinal&0x0FFF);
						strcat(InfoStr,rn);
					}else
					{
						DWORD ImageNameAddress  = RVAToFileOffset(pFileBuffer,ImportOrdinal);
						PIMAGE_IMPORT_BY_NAME pImageName = (PIMAGE_IMPORT_BY_NAME)(DWORD(pFileBuffer)+ImageNameAddress);
						//printf("按名字导入:%x - %s \n",pImageName->Hint,pImageName->Name);
						sprintf(rn,"按名字导入: %08X  -- %s \r\n",pImageName->Hint,pImageName->Name);
						strcat(InfoStr,rn);
					}
					//向下移动
					pThunkData = (PIMAGE_THUNK_DATA32)((DWORD)pThunkData + 4);
					ImportOrdinal = pThunkData->u1.Ordinal;
				}

				sprintf(rn,"------------------------------- : \r\n");
				strcat(InfoStr,rn);
				//printf("FirstThunk:%x \n",pImportDes->FirstThunk);
				DWORD pFirstThunk = (DWORD)pImportDes->FirstThunk;
				printf("FirstThunk:%x \n",pImportDes->FirstThunk);
				
				sprintf(rn,"FirstThunk:%08X \r\n",pImportDes->FirstThunk);
				strcat(InfoStr,rn);
				sprintf(rn,"------------------------------- : \r\n");
				strcat(InfoStr,rn);
				
				DWORD FirstThunk_Address = RVAToFileOffset(pFileBuffer,pFirstThunk);
				PIMAGE_THUNK_DATA32 pNewThunkData = (PIMAGE_THUNK_DATA32)((DWORD)pFileBuffer + FirstThunk_Address);

				
				DWORD newImportOrdinal = pNewThunkData->u1.Ordinal;

				while(newImportOrdinal)
				{
					//输出所有所有的信息
					//#define IMAGE_ORDINAL_FLAG32 0x80000000
					if(newImportOrdinal & IMAGE_ORDINAL_FLAG32)
					{
						//printf("按序号导入:%x\n",newImportOrdinal&0x0FFF);
						sprintf(rn,"按序号导入:%08X \r\n",newImportOrdinal&0x0FFF);
						strcat(InfoStr,rn);

					}else
					{
						DWORD newImageNameAddress  = RVAToFileOffset(pFileBuffer,newImportOrdinal);
						PIMAGE_IMPORT_BY_NAME pNewImageName = (PIMAGE_IMPORT_BY_NAME)(DWORD(pFileBuffer)+newImageNameAddress);
						//printf("按名字导入:%x - %s \n",pNewImageName->Hint,pNewImageName->Name);
						sprintf(rn,"按名字导入::%08X - %s  \r\n",pNewImageName->Hint,pNewImageName->Name);
						strcat(InfoStr,rn);

					}
					//向下移动
					pNewThunkData = (PIMAGE_THUNK_DATA32)((DWORD)pNewThunkData + 4);
					newImportOrdinal = pNewThunkData->u1.Ordinal;
				}
				
				
				sprintf(rn,"-------------------------------  \r\n");
				strcat(InfoStr,rn);
				pImportDes = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)pImportDes + 20);

				//getchar();
			}
			
			SendMessage(hInfoMation,WM_SETTEXT,0,(long)InfoStr);
			break;
		}

	case INFO_RES:
		{
			sprintf(rn,"资源表基本信息 : \r\n");
			strcat(InfoStr,rn);

			IMAGE_DATA_DIRECTORY ResourceDirectory = DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE];
	
			DWORD ResourceVirtualAddress = ResourceDirectory.VirtualAddress;
			DWORD ResourceSize = ResourceDirectory.Size;

			if(ResourceSize== 0)
			{
				haveDirectory = FALSE;
				MessageBox(0,TEXT("没有资源表"),TEXT("错误"),0);
				return;
			}else{
				haveDirectory = TRUE;

			}

			sprintf(rn,"ResourceVirtualAddress :%08X \r\n",ResourceVirtualAddress);
			strcat(InfoStr,rn);
			sprintf(rn,"ResourceSize :%08X \r\n",ResourceSize);
			strcat(InfoStr,rn);

			DWORD dwFoa = RVAToFileOffset(pFileBuffer,ResourceVirtualAddress);
			PIMAGE_RESOURCE_DIRECTORY  pResource = (PIMAGE_RESOURCE_DIRECTORY)((DWORD)pFileBuffer + dwFoa);
			
			//输出PIMAGE_RESOURCE_DIRECTORY 的信息

			sprintf(rn,"NumberOfNamedEntries :%08X \r\n",pResource->NumberOfNamedEntries);
			strcat(InfoStr,rn);
			sprintf(rn,"NumberOfIdEntries :%08X \r\n",pResource->NumberOfIdEntries);
			strcat(InfoStr,rn);

			//第一层类型的解析
			//第一个资源表
			PIMAGE_RESOURCE_DIRECTORY_ENTRY pResdirectoryEntry = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((DWORD)pResource + sizeof(IMAGE_RESOURCE_DIRECTORY));
			DWORD NumberOfResType  =  pResource->NumberOfNamedEntries + pResource->NumberOfIdEntries;

			//找到图标资源
			PIMAGE_RESOURCE_DIRECTORY pResICODir=NULL;
			

			for(DWORD i=0;i<NumberOfResType;i++)
			{
				//解析内容:
				DWORD NameIsString = pResdirectoryEntry->NameIsString;
				DWORD ResName = pResdirectoryEntry->Name;
				DWORD OffsetToData = pResdirectoryEntry->OffsetToData;
				DWORD DataIsDirectory = pResdirectoryEntry->DataIsDirectory;
				
				//printf("Info: %d -NameIsString: %d - Name: %x -- OffToDa: %x - IsD - %d \n",i+1,
				//NameIsString,ResName,OffsetToData,DataIsDirectory);
				sprintf(rn,"Info: %08X -NameIsString: %08X - Name: %08X -- OffToDa: %08X :  IsD - %08X \r\n",i+1,NameIsString,ResName,OffsetToData,DataIsDirectory);
				strcat(InfoStr,rn);

				if(ResName == 0x3)
				{
					//PIMAGE_RESOURCE_DIRECTORY  pResource = (PIMAGE_RESOURCE_DIRECTORY)((DWORD)pFileBuffer + dwFoa);
					pResICODir = (PIMAGE_RESOURCE_DIRECTORY)((DWORD)pResource +pResdirectoryEntry->OffsetToDirectory);
					break;
				}

				pResdirectoryEntry  = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((DWORD)pResdirectoryEntry + 8);
			}
			
			//确定图标的地址,找第二层
			DWORD NumberOffICO = pResICODir->NumberOfIdEntries + pResICODir->NumberOfNamedEntries;
			//printf("NumberOffICO : %d \n",NumberOffICO);
			sprintf(rn,"NumberOffICO :%08X \r\n",NumberOffICO);
			strcat(InfoStr,rn);
			
			//第一个图标描述
			PIMAGE_RESOURCE_DIRECTORY_ENTRY pICOEntry = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((DWORD)pResICODir + sizeof(IMAGE_RESOURCE_DIRECTORY));
			
			PIMAGE_RESOURCE_DIRECTORY pICOContent = NULL;

			for(DWORD j = 0;j<NumberOffICO;j++)
			{
				//解析内容:
				DWORD NameIsString = pICOEntry->NameIsString;
				DWORD ResName = pICOEntry->Name;
				DWORD OffsetToData = pICOEntry->OffsetToData;
				DWORD DataIsDirectory = pICOEntry->DataIsDirectory;
				
				//printf("Info: %d -NameIsString: %d - Name: %x -- OffToDa: %x - IsD - %d \n",i+1,
				//	NameIsString,ResName,OffsetToData,DataIsDirectory);

				sprintf(rn,"Info: %d -NameIsString: %d - Name: %08X -- OffToDa: %08X - IsD - %08X \n",i+1,
					NameIsString,ResName,OffsetToData,DataIsDirectory);
				strcat(InfoStr,rn);
			
				//依次解析页码表
				pICOContent = (PIMAGE_RESOURCE_DIRECTORY)((DWORD)pResource +pICOEntry->OffsetToDirectory);
				//页码表解析
				DWORD NumberOfICOContent = pICOContent->NumberOfIdEntries + pICOContent->NumberOfNamedEntries;
				//printf("NumberOfICOContent: %d \n",NumberOfICOContent);
				sprintf(rn,"NumberOfICOContent :%08X \r\n",NumberOfICOContent);
				strcat(InfoStr,rn);

				//图标测试只有一个,不循环测试
				//找到关键点:
				PIMAGE_RESOURCE_DIRECTORY_ENTRY pICOGetVS =  (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((DWORD)pICOContent + sizeof(IMAGE_RESOURCE_DIRECTORY));
				//找到图标资源的VistrualAddress 和 Size
				PIMAGE_DATA_DIRECTORY pDataIco = (PIMAGE_DATA_DIRECTORY)((DWORD)pResource + pICOGetVS->OffsetToDirectory);
				//输出每个图标信息
				//printf("VirtualAddress: %x, Size: %x \n",pDataIco->VirtualAddress,pDataIco->Size);
				sprintf(rn,"VirtualAddress: %08X, Size: %08X \n",pDataIco->VirtualAddress,pDataIco->Size);
				strcat(InfoStr,rn);
				pICOEntry  = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)((DWORD)pICOEntry + 8);
			}
			SendMessage(hInfoMation,WM_SETTEXT,0,(long)InfoStr);
			break;
		}
		
	case INFO_RELOC:
		{
			sprintf(rn,"重定位表的基本信息 : \r\n");
			strcat(InfoStr,rn);

			DWORD BaseReloc_Directory_Address = DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress;
			DWORD BaseReloc_Directory_Size = DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size;
			FoA = RVAToFileOffset(pFileBuffer,BaseReloc_Directory_Address);
			
			if(BaseReloc_Directory_Size == 0)
			{
				haveDirectory = FALSE;
				MessageBox(0,TEXT("没有重定位表"),TEXT("错误"),0);
				return;
			}else{
				haveDirectory = TRUE;

			}

			//定位到第一个重定位块
			PIMAGE_BASE_RELOCATION pRelocData = (PIMAGE_BASE_RELOCATION)((DWORD)pFileBuffer + FoA);
			
			//输出所有的标信息
			while(pRelocData->VirtualAddress||pRelocData->SizeOfBlock)
			{
				DWORD RelocVirtualAddress = pRelocData->VirtualAddress;
				DWORD RelocSize = pRelocData->SizeOfBlock;

				sprintf(rn,"VirtualSize: %08X ,Size: %08X , Number: %08X  \r\n",RelocVirtualAddress,RelocSize,(RelocSize-8)/2);
				strcat(InfoStr,rn);
				
				int k = (RelocSize-8)/2;
				PWORD pMyRelocAddress = NULL;
				pMyRelocAddress = (PWORD)((DWORD)pRelocData+8);
				
				for(int i=0;i<k;i++)
				{
					//printf();
					sprintf(rn,"第%04X个 : 标志 : %08X 偏移 : %08X\r\n",i+1,pMyRelocAddress[i]&0xF000,RelocVirtualAddress+(pMyRelocAddress[i]&0x0FFF));
					strcat(InfoStr,rn);
				}
				pRelocData = (PIMAGE_BASE_RELOCATION)((DWORD)pRelocData + RelocSize);
			}

			SendMessage(hInfoMation,WM_SETTEXT,0,(long)InfoStr);
			break;
		}
	case INFO_BIND:
		{
			sprintf(rn,"绑定导入表的基本信息 : \r\n");
			strcat(InfoStr,rn);

			IMAGE_DATA_DIRECTORY pBindImportDirectory = DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT];
	
			DWORD BindImportVirtualAddress = pBindImportDirectory.VirtualAddress;
			DWORD BindImportFoa = BindImportVirtualAddress;

			PIMAGE_BOUND_IMPORT_DESCRIPTOR pBindImport = (PIMAGE_BOUND_IMPORT_DESCRIPTOR)((DWORD)pFileBuffer + BindImportFoa);

			if(pBindImportDirectory.Size == 0)
			{
				haveDirectory = FALSE;
				MessageBox(0,TEXT("没有绑定导入表"),TEXT("错误"),0);
				return;
			}else{
				haveDirectory = TRUE;

			}


			while(pBindImport->TimeDateStamp !=0x0)
			{
				//输出第一个绑定
				DWORD bindTime = pBindImport->TimeDateStamp;
				WORD ModuleName = pBindImport->OffsetModuleName;
				WORD numberModule = pBindImport->NumberOfModuleForwarderRefs;
				
				//输出名字
				PSTR pModuleName = (PSTR)((DWORD)pFileBuffer+(DWORD)BindImportVirtualAddress+ModuleName);

				sprintf(rn,"ModuleName:%s \r\n",pModuleName);
				strcat(InfoStr,rn);
				//printf("ModuleName:%s \n",pModuleName);
				//printf("--numberModule:%x \n",numberModule);
				sprintf(rn,"--numberModule:%08X \r\n",numberModule);
				strcat(InfoStr,rn);

				for(int i=0;i<numberModule;i++)
				{
					PIMAGE_BOUND_FORWARDER_REF pBoundRef = (PIMAGE_BOUND_FORWARDER_REF)((DWORD)pBindImport+i*8);
					pBindImport =  (PIMAGE_BOUND_IMPORT_DESCRIPTOR)((DWORD)pBindImport+i*8);

					//输出名字
					DWORD refTime = pBoundRef->TimeDateStamp;
					WORD refName = pBoundRef->OffsetModuleName;
					PSTR pRefName = (PSTR)((DWORD)pFileBuffer+(DWORD)BindImportVirtualAddress+refName);	
					//printf("        RefName:%s \r\n",pRefName);
					sprintf(rn,"        RefName:%s \r\n",pRefName);
					strcat(InfoStr,rn);
				}

				pBindImport =  (PIMAGE_BOUND_IMPORT_DESCRIPTOR)((DWORD)pBindImport+8);
			}

			SendMessage(hInfoMation,WM_SETTEXT,0,(long)InfoStr);
			break;
		}
	case INFO_IAT:
		{
			sprintf(rn,"绑定导入表的基本信息 : \r\n");
			strcat(InfoStr,rn);
			
			sprintf(rn,"测试使用,未实现 : \r\n");
			strcat(InfoStr,rn);
			SendMessage(hInfoMation,WM_SETTEXT,0,(long)InfoStr);
			break;
		}

	}
	
	
	//释放内存
	free(pFileBuffer);
}



原文链接: PeTools开发(五) 版权所有,转载时请注明出处,违者必究。
注明出处格式:流沙团 ( https://gyarmy.com/post-343.html )

发表评论

0则评论给“PeTools开发(五)”