2,640
社区成员
发帖
与我相关
我的任务
分享
int Translate(LPBYTE lpBuffer)
{
//
PIMAGE_DOS_HEADER pidhOrig = (PIMAGE_DOS_HEADER)lpBuffer;
PIMAGE_NT_HEADERS pinhOrig = (PIMAGE_NT_HEADERS)(lpBuffer + pidhOrig->e_lfanew);
//SECTION NAME
LPBYTE lpszSectionHeader = (LPBYTE)(lpBuffer + pidhOrig->e_lfanew + sizeof(IMAGE_NT_HEADERS));
{
//计算PE文件大小
if (pinhOrig->FileHeader.NumberOfSections <= 0)
{
return -1;
}
int i = pinhOrig->FileHeader.NumberOfSections -1;
PIMAGE_SECTION_HEADER pish = (PIMAGE_SECTION_HEADER)(lpszSectionHeader + i * sizeof(IMAGE_SECTION_HEADER));
DWORD dwResPESize = pish->SizeOfRawData + pish->PointerToRawData;
return dwResPESize;
}
return -1;
}
DWORD GetPEFileRealSize(LPCTSTR lpszFile)
{
DWORD dwSize = 0;
HANDLE hFile = CreateFile(lpszFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
LPBYTE lpBuffer = (LPBYTE)MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
PIMAGE_DOS_HEADER pImgDosHeader = (PIMAGE_DOS_HEADER)lpBuffer;
PIMAGE_NT_HEADERS32 pImgNtHeaders = (PIMAGE_NT_HEADERS32) (lpBuffer + pImgDosHeader->e_lfanew);
PIMAGE_SECTION_HEADER pImgSecHeader = (PIMAGE_SECTION_HEADER) (pImgNtHeaders + 1);
dwSize = pImgDosHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS32) + pImgNtHeaders->FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER);
// 512字节对齐
if (dwSize%512)
dwSize = (dwSize / 512) * 512 + 512;
for (int i = 0; i < pImgNtHeaders->FileHeader.NumberOfSections; i++)
dwSize += pImgSecHeader[i].SizeOfRawData;
UnmapViewOfFile(lpBuffer);
CloseHandle(hMap);
CloseHandle(hFile);
}
return dwSize;
}