📄 analydlg.cpp
字号:
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(§ion_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(§ion_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 + -