⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 analydlg.cpp

📁 EXE文件格式分析:包括调用文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
memmove(&dos_header,ptr,sizeof(dos_header));
memmove(&nt_header,ptr+dos_header.e_lfanew,sizeof(nt_header));	
CString inf1;
inf1.Format("目录结构数量=%d",nt_header.OptionalHeader.NumberOfRvaAndSizes);
m_List.AddString(inf1);
inf1.Format("dos_header大小=%d  nt_header大小=%d",sizeof(dos_header),sizeof(nt_header));
m_List.AddString(inf1);
inf1.Format("目录结构数量=%d",nt_header.OptionalHeader.NumberOfRvaAndSizes);
m_List.AddString(inf1);
inf1.Format("目录结构数量=%d",nt_header.OptionalHeader.NumberOfRvaAndSizes);
m_List.AddString(inf1);

inf1.Format("   ------------------------");
m_List.AddString(inf1);
inf1.Format("1. 导出表的RVA=%X  块大小=%X",nt_header.OptionalHeader.DataDirectory[0].VirtualAddress,
			nt_header.OptionalHeader.DataDirectory[0].Size);
m_List.AddString(inf1);

m_List.AddString(inf1);
inf1.Format("2. 导入表的RVA=%X  块大小=%X",nt_header.OptionalHeader.DataDirectory[0].VirtualAddress,
			nt_header.OptionalHeader.DataDirectory[0].Size);
m_List.AddString(inf1);
inf1.Format("3. 资源的RVA=%X  块大小=%X",nt_header.OptionalHeader.DataDirectory[0].VirtualAddress,
			nt_header.OptionalHeader.DataDirectory[0].Size);
m_List.AddString(inf1);
inf1.Format("4. 异常的RVA=%X  块大小=%X",nt_header.OptionalHeader.DataDirectory[0].VirtualAddress,
			nt_header.OptionalHeader.DataDirectory[0].Size);
m_List.AddString(inf1);
inf1.Format("5. 安全的RVA=%X  块大小=%X",nt_header.OptionalHeader.DataDirectory[0].VirtualAddress,
			nt_header.OptionalHeader.DataDirectory[0].Size);
m_List.AddString(inf1);
inf1.Format("6. 重定位表=%X  块大小=%X",nt_header.OptionalHeader.DataDirectory[0].VirtualAddress,
			nt_header.OptionalHeader.DataDirectory[0].Size);
m_List.AddString(inf1);
inf1.Format("7. 调试信息RVA=%X  块大小=%X",nt_header.OptionalHeader.DataDirectory[0].VirtualAddress,
			nt_header.OptionalHeader.DataDirectory[0].Size);
m_List.AddString(inf1);
inf1.Format("8. 版权信息=%X  块大小=%X",nt_header.OptionalHeader.DataDirectory[0].VirtualAddress,
			nt_header.OptionalHeader.DataDirectory[0].Size);
m_List.AddString(inf1);
inf1.Format("9. 未知道信息=%X  块大小=%X",nt_header.OptionalHeader.DataDirectory[0].VirtualAddress,
			nt_header.OptionalHeader.DataDirectory[0].Size);
m_List.AddString(inf1);
inf1.Format("10.Thread Local Storage=%X  块大小=%X",nt_header.OptionalHeader.DataDirectory[0].VirtualAddress,
			nt_header.OptionalHeader.DataDirectory[0].Size);
m_List.AddString(inf1);
inf1.Format("11.资料不详信息=%X  块大小=%X",nt_header.OptionalHeader.DataDirectory[0].VirtualAddress,
			nt_header.OptionalHeader.DataDirectory[0].Size);
m_List.AddString(inf1);
inf1.Format("12.资料不详信息=%X  块大小=%X",nt_header.OptionalHeader.DataDirectory[0].VirtualAddress,
			nt_header.OptionalHeader.DataDirectory[0].Size);
m_List.AddString(inf1);
inf1.Format("13.导入函数地址表=%X  块大小=%X",nt_header.OptionalHeader.DataDirectory[0].VirtualAddress,
			nt_header.OptionalHeader.DataDirectory[0].Size);
m_List.AddString(inf1);
inf1.Format("14.资料不详信息=%X  块大小=%X",nt_header.OptionalHeader.DataDirectory[0].VirtualAddress,
			nt_header.OptionalHeader.DataDirectory[0].Size);

inf1.Format("15.资料不详信息=%X  块大小=%X",nt_header.OptionalHeader.DataDirectory[0].VirtualAddress,
			nt_header.OptionalHeader.DataDirectory[0].Size);
m_List.AddString(inf1);
inf1.Format("16.没有使用项=%X  块大小=%X",nt_header.OptionalHeader.DataDirectory[0].VirtualAddress,
			nt_header.OptionalHeader.DataDirectory[0].Size);
m_List.AddString(inf1);

}

void CAnalyDlg::OnOffset() 
{
if(!ptr)return;
memmove(&dos_header,ptr,sizeof(dos_header));
memmove(&nt_header,ptr+dos_header.e_lfanew,sizeof(nt_header));	
CString inf="",inf1;
inf1.Format("PE文件头文件偏移=%XH",dos_header.e_lfanew);
m_List.AddString(inf1);
inf1.Format("IMAGE_FILE_HEADER文件偏移=%XH",dos_header.e_lfanew+4);
m_List.AddString(inf1);
inf1.Format("IMAGE_OPTIONAL_HEADER文件偏移=%XH",dos_header.e_lfanew+4+sizeof(nt_header.FileHeader));
m_List.AddString(inf1);
inf1.Format("IMAGE_DATA_DIRECTORY文件偏移=%XH",
			dos_header.e_lfanew+sizeof(nt_header)-16*sizeof(IMAGE_DATA_DIRECTORY));
m_List.AddString(inf1);
inf1.Format("PE中节表的数目为=%XH",nt_header.FileHeader.NumberOfSections);
m_List.AddString(inf1);
inf1.Format("PE中节表(IMAGE_SECTION_HEADER)的文件偏移=%XH 共%d字节",dos_header.e_lfanew+sizeof(nt_header),
			nt_header.FileHeader.NumberOfSections*sizeof(IMAGE_SECTION_HEADER));
m_List.AddString(inf1);

}

void CAnalyDlg::OnSection() 
{
if(!ptr)return;
m_List.ResetContent();
memmove(&dos_header,ptr,sizeof(dos_header));
memmove(&nt_header,ptr+dos_header.e_lfanew,sizeof(nt_header));	
CString inf1;
DWORD pos=dos_header.e_lfanew+sizeof(nt_header);
DWORD num=nt_header.FileHeader.NumberOfSections;
inf1.Format("PE节表文件偏移=%XH,共%d个节表",dos_header.e_lfanew,nt_header.FileHeader.NumberOfSections);
m_List.AddString(inf1);	

for(DWORD i=0;i<num;i++){
inf1.Format("   ---------------------");
m_List.AddString(inf1);
   memmove(&section_header,ptr+dos_header.e_lfanew+sizeof(nt_header)
	   +i*sizeof(section_header),
	   sizeof(section_header));
inf1.Format("第%d节名称:%s 文件偏移=%XH",i+1,section_header.Name,\
	dos_header.e_lfanew+sizeof(nt_header)+i*sizeof(section_header));
m_List.AddString(inf1);
inf1.Format("第%d节的实际大小=%XH",i+1,section_header.Misc.VirtualSize);
m_List.AddString(inf1);
inf1.Format("第%d节的内存偏移=%XH",i+1,section_header.VirtualAddress);
m_List.AddString(inf1);
inf1.Format("第%d节的文件偏移=%XH",i+1,section_header.PointerToRawData);
m_List.AddString(inf1);
inf1.Format("第%d节占用磁盘空间大小=%XH",1+i,section_header.SizeOfRawData);
m_List.AddString(inf1);
inf1.Format("第%d节属性=%XH",i+1,section_header.Characteristics);
m_List.AddString(inf1);
}
inf1.Format("  ------------------- ");
m_List.AddString(inf1);
inf1.Format("程序执行入口 RVA:   0x %X",nt_header.OptionalHeader.AddressOfEntryPoint);
m_List.AddString(inf1);
inf1.Format("内存中整个文件映像尺寸:0x %X",nt_header.OptionalHeader.SizeOfImage);
m_List.AddString(inf1);
inf1=fileName;
inf1+="各种偏移量计算";
//MessageBox(inf,inf1,MB_OK);	

}

void CAnalyDlg::OnCharacter() 
{
m_List.ResetContent();
CString inf1;
DWORD sig;
sig=0x20;
inf1.Format("属性值为 000000%XH,包含代码",sig);
//m_List.AddString(inf1);
m_List.AddString(inf1);
sig=0x40;
inf1.Format("属性值为 000000%XH,包含已经初始化数据",sig);
m_List.AddString(inf1);
sig=0x80;
inf1.Format("属性值为 000000%XH,包含没有初始化数据",sig);
m_List.AddString(inf1);
sig=0x02000000;
inf1.Format("属性值为 0%XH,包含数据到内存后被丢弃(如重定位.reloc)",sig);
m_List.AddString(inf1);
sig=0x04000000;
inf1.Format("属性值为 0%XH,数据不会经过缓存",sig);
m_List.AddString(inf1);
sig=0x08000000;
inf1.Format("属性值为 0%XH,数据不会被交换到磁盘",sig);
m_List.AddString(inf1);
sig=0x10000000;
inf1.Format("属性值为 %XH,数据可为不同进程共享(如钩子程序)",sig);
m_List.AddString(inf1);	
sig=0x20000000;
inf1.Format("属性值为 %XH,映射到内存后包含可执行属性",sig);
m_List.AddString(inf1);
sig=0x40000000;
inf1.Format("属性值为 %XH,映射到内存后包含可读属性",sig);
m_List.AddString(inf1);
sig=0x80000000;
inf1.Format("属性值为 %XH,映射到内存后包含可写属性",sig);
m_List.AddString(inf1);

}

void CAnalyDlg::OnEntry() 
{
if(!ptr)return;
m_List.ResetContent();
memmove(&dos_header,ptr,sizeof(dos_header));
memmove(&nt_header,ptr+dos_header.e_lfanew,sizeof(nt_header));	
CString inf1;
DWORD peRVA=nt_header.OptionalHeader.AddressOfEntryPoint;//程序入口 RVA
DWORD peSize=nt_header.OptionalHeader.SizeOfImage;//内存中整个文件映像尺寸
DWORD sectionNum=nt_header.FileHeader.NumberOfSections;//节的个数	
DWORD fileOffset[20];   //节的文件中偏移
DWORD rvaOffset[20];    //节的内存中偏移
DWORD realSize[20];     //节的实际大小
for(DWORD i=0;i<sectionNum;i++){   //获取若干参数
   memmove(&section_header,ptr+dos_header.e_lfanew+sizeof(nt_header)
	   +i*sizeof(section_header),sizeof(section_header));
realSize[i]=section_header.Misc.VirtualSize;
rvaOffset[i]=section_header.VirtualAddress;
fileOffset[i]=section_header.PointerToRawData;
}
for(i=0;i<sectionNum;i++){ 
	if(peRVA>=rvaOffset[i]&&peRVA<(rvaOffset[i]+realSize[i])){
      DWORD Offset=peRVA-rvaOffset[i];  //Offset为入口地址相对于该节的偏移值
	  Offset+=fileOffset[i];    //加上该节在文件中的偏移值就是程序入口地址在文件中偏移值
	  DWORD value;
	  memmove(&value,ptr,4);
      inf1.Format("该程序入口地址在文件中偏移为 %X, 值为 %XH",Offset,value);
	  m_List.AddString(inf1);
      inf1.Format("该程序入口地址在内存中偏移为 %X, 值为 ",rvaOffset[i]);
	  m_List.AddString(inf1);
      return;
	}
}
m_List.AddString("没有发现");
}

void CAnalyDlg::OnSelchangeList1() 
{
	// TODO: Add your control notification handler code here
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -