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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
// TestCpp.cpp : Defines the entry point for the console application.
//
#include <windows.h>
#include <iostream>
typedef struct _MemPage
{
LPVOID PageAdress; // RVA de la page.
DWORD Size; // taille de la page.
}MemPage, *PMemPage;
bool GetIatPage(LPVOID pMapping, PMemPage aPage);
int _tmain(int argc, _TCHAR* argv[])
{
// ouverture du fichier PE.
HANDLE hFile = CreateFile(_T("C:\\Program Files\\Internet Explorer\\iexplore.exe"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
return -1;
}
HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY | SEC_IMAGE, 0, 0, NULL);
if(hMap == NULL)
{
return -1;
}
LPVOID pMap = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
if(pMap == NULL)
{
return -1;
}
PMemPage IeIatPage = new MemPage();
if(GetIatPage(pMap, IeIatPage))
std::cout << "IAT page address: 0x" << std::hex << IeIatPage->PageAdress \
<< std::endl << "IAT section page size : 0x" << IeIatPage->Size << std::endl;
CloseHandle(hFile);
UnmapViewOfFile(pMap);
CloseHandle(hMap);
return 0;
}
bool GetIatPage(LPVOID pMapping, PMemPage IePage)
{
BOOL bRet = FALSE;
// transtypage vers IMAGE_DOS_HEADER*
PIMAGE_DOS_HEADER pIDH = static_cast<PIMAGE_DOS_HEADER>(pMapping);
// check si "MZ" signature.
if(pIDH->e_magic != IMAGE_DOS_SIGNATURE)
{
return false;
}
PIMAGE_NT_HEADERS pINH = reinterpret_cast<PIMAGE_NT_HEADERS>(static_cast<BYTE*>(pMapping) + pIDH->e_lfanew);
if(pINH->Signature != IMAGE_NT_SIGNATURE)
{
return false;
}
//vérifie si PE (32 bits) ou PE+ (64 bits)
if(pINH->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC)
{
return false;
}
//obtient l'imagebase.
DWORD ImageBase = pINH->OptionalHeader.ImageBase;
// obtient l'IMAGE_DATA_DIRECTORY de l'IAT.
IMAGE_DATA_DIRECTORY IDH = pINH->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IAT];
// On prend l'adresse de l'IAT
DWORD IatRva = IDH.VirtualAddress;
// obtient l'adresse du premier IMAGE_SECTION_HEADER
PIMAGE_SECTION_HEADER pISH = IMAGE_FIRST_SECTION(pINH);
// on cherche un IMAGE_SECTION_HEADER avec la même adresse.
bool bFoundISH = false;
int i = 0;
for (i = 0; i < pINH->FileHeader.NumberOfSections; i++)
{
if(pISH->VirtualAddress == IatRva)
{
bFoundISH = true;
break;
}
else
pISH++;
}
if(!bFoundISH)
return false;
// Calcule taille de la section.
DWORD SecAlign = pINH->OptionalHeader.SectionAlignment;
DWORD PageSize = (pISH[i].Misc.VirtualSize / SecAlign) * SecAlign;
PageSize += SecAlign;
// rempli la struct de retour.
IePage->PageAdress = reinterpret_cast<LPVOID>(pISH[i].VirtualAddress + ImageBase);
IePage->Size = PageSize;
return true;
} |
Partager