-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpe.cpp
90 lines (73 loc) · 1.94 KB
/
pe.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "pe.h"
/** 求一个值经过一定粒度对齐后的值 */
DWORD ToAligentSize(DWORD nSize , DWORD nAligent)
{
// 超出了多少倍的内存对齐,超出多少倍,就有多少倍内存对齐单位 ;
// 零头是否超出内存对齐,超出则是一个内存对齐单位
if(nSize%nAligent != 0)
return (nSize / nAligent + 1)*nAligent;
return nSize;
}
PE::PE(void *pFileData, bool bIsFileAlign)
:m_pData(pFileData)
,m_bIsFileAlign(bIsFileAlign)
{
}
pe_DosHeader *PE::dosHeader()
{
return (pe_DosHeader*)m_pData;
}
pe_NtHeader *PE::ntHeader()
{
if(m_pData==nullptr)
return nullptr;
return (pe_NtHeader*)(dosHeader()->e_lfanew + (int)m_pData);
}
pe_FileHeader *PE::fileHeader()
{
if(m_pData==nullptr)
return nullptr;
return &ntHeader()->FileHeader;
}
pe_OptionHeader *PE::optionHeader()
{
if(m_pData==nullptr)
return nullptr;
return &ntHeader()->OptionalHeader;
}
pe_DataDirectroy *PE::dataDirectory()
{
if(m_pData == nullptr )
return nullptr;
return optionHeader()->DataDirectory;
}
DWORD PE::RVAToOfs(DWORD dwRVA)
{
if(m_pData==nullptr)
return 0;
//开始遍历区段查找包含RVA地址的区段
//获取标准头指针,以获取区段数目
//获取区段数目
DWORD dwSecTotal = fileHeader()->NumberOfSections;
//获取第一个区段
PIMAGE_SECTION_HEADER pScn = sectionHeader();
//遍历区段
for(DWORD i = 0; i < dwSecTotal; i++)
{
if(dwRVA >= pScn->VirtualAddress
&& dwRVA < pScn->VirtualAddress + pScn->Misc.VirtualSize)
{
// rva 转 文件偏移公式:
// rva - 区段所在rva + 区段所在文件偏移
return dwRVA - pScn->VirtualAddress + pScn->PointerToRawData;
}
++pScn;
}
return 0;
}
pe_SectionHeader* PE::sectionHeader()
{
if(m_pData == nullptr)
return nullptr;
return IMAGE_FIRST_SECTION(ntHeader());
}