设为首页 加入收藏

TOP

图解VC++版PE文件解析器源码分析(六)
2016-07-14 15:02:55 】 浏览:4740
Tags:图解 文件 解析 源码 分析
zeof(DWORD),1,pFile); //第10个是TLSDirectory fread(&m_stExtPeHeader.DataDirectory[9].VirtualAddress,sizeof(DWORD),1,pFile); fread(&m_stExtPeHeader.DataDirectory[9].Size,sizeof(DWORD),1,pFile); //第11个是LoadConfigationDirectory fread(&m_stExtPeHeader.DataDirectory[10].VirtualAddress,sizeof(DWORD),1,pFile); fread(&m_stExtPeHeader.DataDirectory[10].Size,sizeof(DWORD),1,pFile); //第12个是BoundImport fread(&m_stExtPeHeader.DataDirectory[11].VirtualAddress,sizeof(DWORD),1,pFile); fread(&m_stExtPeHeader.DataDirectory[11].Size,sizeof(DWORD),1,pFile); //第13个是ImportAddressTable fread(&m_stExtPeHeader.DataDirectory[12].VirtualAddress,sizeof(DWORD),1,pFile); fread(&m_stExtPeHeader.DataDirectory[12].Size,sizeof(DWORD),1,pFile); //第14个是DelayImportDescriptor fread(&m_stExtPeHeader.DataDirectory[13].VirtualAddress,sizeof(DWORD),1,pFile); fread(&m_stExtPeHeader.DataDirectory[13].Size,sizeof(DWORD),1,pFile); //第15个是CLIHeader fread(&m_stExtPeHeader.DataDirectory[14].VirtualAddress,sizeof(DWORD),1,pFile); fread(&m_stExtPeHeader.DataDirectory[14].Size,sizeof(DWORD),1,pFile); //第16个是Reserved fread(&m_stExtPeHeader.DataDirectory[15].VirtualAddress,sizeof(DWORD),1,pFile); fread(&m_stExtPeHeader.DataDirectory[15].Size,sizeof(DWORD),1,pFile); }
解析可选头;逐个读入数据目录;

void CPEToolDlg::ParseSectionHeder()
{
	//偏移到节表位置
	iLocation = m_stMsDos.e_lfanew + sizeof(stPE_HEADER) + m_stPeHeader.SizeOfOptionalHeader;//PE头+PE头的大小(IMAGE_FILE_HEADER)_+PE可选头的大小(IMAGE_OPTION_HEADER)
	fseek(pFile,iLocation,SEEK_SET);
	for (WORD i=0;i
  
   

解析节头;读入对应内容到m_stSectionHeader;
   

DWORD CPEToolDlg :: RVAtoFileOffset(int iThe_Section,const DWORD& RVAOffset)
{
	DWORD dwFileOffset = 0;
	//传入的RavOffset先要转换成相对于节(比如.idata 或.text)的偏移RVA
	//第iThe_Section个节中
	DWORD dwVrk_TheSection = vct_SectionHeader.at(iThe_Section).VirtualAddress - vct_SectionHeader.at(iThe_Section).PointerToRawData;//虚拟地址和物理地址之间的差值
	dwFileOffset = RVAOffset - dwVrk_TheSection;
	return dwFileOffset;
}

RVA转换;

void CPEToolDlg::OnBnClickedBTN_DATADIC()
{
	//数据目录
	dlgDirectoryDate = new Cdialog1;
	dlgDirectoryDate->Create(IDD_DIALOG1,this);	
	dlgDirectoryDate->OnInitCtrlList();
	dlgDirectoryDate->ShowWindow(SW_SHOW);	
	//输出可选头里的数据目录IMAGE_DATA_DIRECTORY
	//1导出表
	CString strExportSymbol,strExportSymbolSize;
	strExportSymbol.Format(L"0x%08x/%d(十进制)",m_stExtPeHeader.DataDirectory[0].VirtualAddress,m_stExtPeHeader.DataDirectory[0].VirtualAddress);
	strExportSymbolSize.Format(L"0x%08x/%d(十进制)",m_stExtPeHeader.DataDirectory[0].Size,m_stExtPeHeader.DataDirectory[0].Size);
	dlgDirectoryDate->AddToCtrlList(L"01 .edata 导出表",L"偏移"+strExportSymbol,L"IMAGE_OPTION_HEADER--IMAGE_DATA_DIRECTORY",L"偏移大小为:"+strExportSymbolSize);

	//2导入表
	CString strImportSymbol,strImportSymbolSize;
	strExportSymbol.Format(L"0x%08x/%d(十进制)",m_stExtPeHeader.DataDirectory[1].VirtualAddress,m_stExtPeHeader.DataDirectory[1].VirtualAddress);
	strImportSymbolSize.Format(L"0x%08x/%d(十进制)",m_stExtPeHeader.DataDirecto
首页 上一页 3 4 5 6 7 下一页 尾页 6/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇VC实现注册表监控 下一篇MVC和MVVM详解

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目