DWORD getReloadBase() {
/
/
1.
获取FileHeader和OptionHeader的一些关键变量
HANDLE hfile
=
CreateFileA(targetName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
LPDWORD receiveSize
=
NULL;
if
(hfile
=
=
INVALID_HANDLE_VALUE || GetLastError()
=
=
ERROR_FILE_NOT_FOUND)
{
std::cout <<
"找不到目标文件"
<< GetLastError() << std::endl;
return
NULL;
}
/
/
读取dos头
IMAGE_DOS_HEADER dosHeader;
DWORD dosHeaderSize
=
sizeof(dosHeader);
BOOL
dosReadResult
=
ReadFile(hfile, &dosHeader, dosHeaderSize, receiveSize, NULL);
if
(!dosReadResult)
{
std::cout <<
"读取dos头错误"
<< GetLastError() << std::endl;
return
NULL;
}
/
/
读取NT头
IMAGE_NT_HEADERS32 ntHeader;
DWORD pointerResult
=
SetFilePointer(hfile, dosHeader.e_lfanew, NULL, FILE_BEGIN);
if
(pointerResult
=
=
INVALID_SET_FILE_POINTER)
{
std::cout <<
"设置读取指针为NT头时错误"
<< GetLastError() << std::endl;
return
NULL;
}
BOOL
ntHeaderResult
=
ReadFile(hfile, &ntHeader, sizeof(ntHeader), receiveSize, NULL);
if
(!dosReadResult)
{
std::cout <<
"读取NT头错误"
<< GetLastError() << std::endl;
return
NULL;
}
WORD peHeaderSize
=
ntHeader.OptionalHeader.SizeOfHeaders;
WORD setctionNums
=
ntHeader.FileHeader.NumberOfSections;
DWORD imageSize
=
ntHeader.OptionalHeader.SizeOfImage;
DWORD sectionAlign
=
ntHeader.OptionalHeader.SectionAlignment;
/
/
2.
对齐镜像并载入PE头
int
mImageSize
=
alignSize(imageSize, sectionAlign);
mImageBase
=
new char[mImageSize];
memset(mImageBase,
0
, mImageSize);
SetFilePointer(hfile,
0
, NULL, FILE_BEGIN);
ReadFile(hfile, mImageBase, peHeaderSize, receiveSize, NULL);
/
/
将文件头写入
/
/
3.
计算并获取区块表起始地址
PIMAGE_NT_HEADERS mpNtheader
=
(PIMAGE_NT_HEADERS)((DWORD)mImageBase
+
dosHeader.e_lfanew);
int
mNtHeadersSize
=
sizeof(ntHeader.FileHeader)
+
sizeof(ntHeader.Signature)
+
ntHeader.FileHeader.SizeOfOptionalHeader;
PIMAGE_SECTION_HEADER mpSectionHeader
=
(PIMAGE_SECTION_HEADER)((DWORD)mpNtheader
+
mNtHeadersSize);
DWORD keyBaseAddress
=
NULL;
/
/
4.
遍历区块表加载区块
for
(
int
index
=
0
; index < setctionNums;
+
+
index)
{
DWORD va
=
mpSectionHeader
-
>VirtualAddress;
if
(index
=
=
0
)
{
keyBaseAddress
=
va;
}
DWORD rawSize
=
mpSectionHeader
-
>SizeOfRawData;
DWORD vaSize
=
mpSectionHeader
-
>Misc.VirtualSize;
DWORD rawOffset
=
mpSectionHeader
-
>PointerToRawData;
if
(rawSize
=
=
0
)
{
continue
;
}
else
{
SetFilePointer(hfile, rawOffset, NULL, FILE_BEGIN);
ReadFile(hfile, &mImageBase[va], rawSize, receiveSize, NULL);
}
mpSectionHeader
+
+
;
}
keyBaseAddress
-
=
4
;
CloseHandle(hfile);
return
keyBaseAddress;
}