/******************************************************************/
/* 函数功能:多字节转宽字节,使用后需要delete */
/* 参数: 多字节 */
/* 返回值:WCHAR* */
/*******************************************************************/
WCHAR* MultiByte2WideChar(CHAR* multiChar)
{
DWORD dwNum = MultiByteToWideChar(CP_ACP,0,multiChar,-1,NULL,0);
WCHAR *wideChar = new WCHAR[dwNum];
MultiByteToWideChar (CP_ACP, 0, multiChar, -1, wideChar, dwNum);
return
wideChar;
}
/*******************************************************************/
/* 函数功能:宽字节转多字节,使用后需要delete */
/* 参数: 多字节 */
/* 返回值:CHAR* */
/*******************************************************************/
CHAR* WideChar2MultiByte(WCHAR *wcChar )
{
//
宽字节转换多字节
DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,wcChar,-1,NULL,0,NULL,FALSE);
char *psText;
psText = new char[dwNum];
WideCharToMultiByte (CP_OEMCP,NULL,wcChar,-1,psText,dwNum,NULL,FALSE);
return
psText;
}
/*******************************************************************/
/* 函数功能:判断是否为PE文件 */
/* 参数:lpImage文件映像基址、文件大小 */
/* 返回值:TURE或FALSE */
/*******************************************************************/
BOOL IsPE_File(PVOID lpImage)
{
PIMAGE_DOS_HEADER pDos = (PIMAGE_DOS_HEADER)lpImage;
if
( pDos->e_magic != IMAGE_DOS_SIGNATURE )
return
FALSE;
PIMAGE_NT_HEADERS32 pNT32 = (PIMAGE_NT_HEADERS32)((LONG)lpImage+pDos->e_lfanew);
if
( pNT32->Signature != IMAGE_NT_SIGNATURE )
return
FALSE;
return
TRUE;
}
/*******************************************************************/
/* 函数功能:获取真正内存地址 */
/* 参数:RVA相对虚地址、装入内存基址、PE文件头 */
/* 返回值:真正内存地址 */
/*******************************************************************/
DWORD RVA2Offset( DWORD dwRVA, PVOID lpImage, PIMAGE_NT_HEADERS32 pNT32 )
{
PIMAGE_SECTION_HEADER pSection = IMAGE_FIRST_SECTION(pNT32);
for
( DWORD i=0; i<pNT32->FileHeader.NumberOfSections; i++ )
{
if
( dwRVA>=pSection[i].VirtualAddress && dwRVA<pSection[i].VirtualAddress+pSection[i].Misc.VirtualSize )
{
DWORD dwR_Offset = dwRVA - pSection[i].VirtualAddress;
DWORD dwOffset =(DWORD)lpImage+ dwR_Offset+ pSection[i].PointerToRawData;
return
dwOffset;
}
}
return
0;
}
/*******************************************************************/
/* 函数功能:判断在哪个区段 */
/* 参数:lpImage文件映像基址 */
/* 返回值:所在区段的RVA */
/*******************************************************************/
DWORD GetRvaInWhitchSection( DWORD dwRVA,PVOID lpImage,PIMAGE_NT_HEADERS32 pNT32)
{
PIMAGE_SECTION_HEADER pSection = IMAGE_FIRST_SECTION(pNT32);
for
(DWORD i=0; i<pNT32->FileHeader.NumberOfSections; i++)
{
if
(dwRVA>=pSection[i].VirtualAddress && dwRVA<pSection[i].VirtualAddress+pSection[i].Misc.VirtualSize)
{
return
(DWORD)&pSection[i];
}
}
return
0;
}
/*******************************************************************/
/* 函数功能:获取PIMAGE_NT_HEADERS32 */
/* 参数:lpImage文件映像基址 */
/* 返回值:PIMAGE_NT_HEADERS32 */
/*******************************************************************/
PIMAGE_NT_HEADERS GetNtHeaders(LPVOID lpImage)
{
PIMAGE_DOS_HEADER pDos = (PIMAGE_DOS_HEADER)lpImage;
PIMAGE_NT_HEADERS32 pNT32 = (PIMAGE_NT_HEADERS32)((LONG)lpImage+pDos->e_lfanew);
return
pNT32;
}
/*******************************************************************/
/* 函数功能:获取PIMAGE_FILE_HEADER */
/* 参数:lpImage文件映像基址 */
/* 返回值:PIMAGE_FILE_HEADER */
/*******************************************************************/
PIMAGE_FILE_HEADER GetFileHeader(LPVOID lpImage)
{
if
(!IsPE_File(lpImage))
return
NULL;
PIMAGE_NT_HEADERS32 pNT32 = GetNtHeaders(lpImage);
PIMAGE_FILE_HEADER pImageHeader = &(pNT32->FileHeader);
return
pImageHeader;
}
/*******************************************************************/
/* 函数功能:获取文件扩展头 */
/* 参数:lpImage文件映像基址 */
/* 返回值:PIMAGE_OPTIONAL_HEADER */
/*******************************************************************/
PIMAGE_OPTIONAL_HEADER GetOptionalHeader(LPVOID lpImage)
{
if
(!IsPE_File(lpImage))
return
NULL;
PIMAGE_NT_HEADERS32 pNT32 = GetNtHeaders(lpImage);
PIMAGE_OPTIONAL_HEADER pOH=&pNT32->OptionalHeader;
return
pOH;
}
/*******************************************************************/
/* 函数功能:获取数据目录表 */
/* 参数:lpImage文件映像基址 */
/* 返回值:PIMAGE_DATA_DIRECTORY */
/*******************************************************************/
PIMAGE_DATA_DIRECTORY GetDataDirctory(LPVOID lpImage)
{
PIMAGE_NT_HEADERS32 pNT32 = GetNtHeaders(lpImage);
PIMAGE_DATA_DIRECTORY pDir = (PIMAGE_DATA_DIRECTORY)pNT32->OptionalHeader.DataDirectory;
return
pDir;
}
/*******************************************************************/
/* 函数功能:获取导入表 */
/* 参数:lpImage文件映像基址 */
/* 返回值:PIMAGE_IMPORT_DESCRIPTOR */
/*******************************************************************/
PIMAGE_IMPORT_DESCRIPTOR GetImportTable(LPVOID lpImage)
{
PIMAGE_NT_HEADERS32 pNT32 = GetNtHeaders(lpImage);
PIMAGE_DATA_DIRECTORY pDir = GetDataDirctory(lpImage);
PIMAGE_DATA_DIRECTORY pImportDir = pDir+IMAGE_DIRECTORY_ENTRY_IMPORT;
PIMAGE_IMPORT_DESCRIPTOR pImport = (PIMAGE_IMPORT_DESCRIPTOR)RVA2Offset(pImportDir->VirtualAddress, lpImage, pNT32);
return
pImport;
}
/*******************************************************************/
/* 函数功能:获得第一个节头 */
/* 参数:lpImage文件映像基址 */
/* 返回值:PIMAGE_SECTION_HEADER */
/*******************************************************************/
PIMAGE_SECTION_HEADER GetFirstSectionHeader(LPVOID lpImage)
{
PIMAGE_NT_HEADERS pNtHeader=GetNtHeaders(lpImage);
if
(pNtHeader!=NULL)
{
return
IMAGE_FIRST_SECTION(pNtHeader);
//
根据NT头得到首个SECTION的宏
}
return
NULL;
}
/*******************************************************************/
/* 函数功能:关闭打开的文件 */
/* 参数:MAP文件结构体 */
/* 返回值:无 */
/*******************************************************************/
void UnLoadFile(PMAP_FILE_STRUCT pstMapFile)
{
if
(pstMapFile->ImageBase)
UnmapViewOfFile(pstMapFile->ImageBase);
if
(pstMapFile->hMapping)
CloseHandle(pstMapFile->hMapping);
if
(pstMapFile->hFile)
CloseHandle(pstMapFile->hFile);
}
/*******************************************************************/
/* 函数功能:加载文件 */
/* 参数:文件绝对地址, MAP文件结构体 */
/* 返回值:无 */
/*******************************************************************/
BOOL LoadFileR(LPTSTR lpFilename,PMAP_FILE_STRUCT pstMapFile)
{
HANDLE hFile;
HANDLE hMapping;
LPVOID ImageBase;
memset(pstMapFile,0,sizeof(MAP_FILE_STRUCT));
hFile=CreateFile(lpFilename,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,0);
if
(!hFile)
return
FALSE;
hMapping=CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
if
(!hMapping)
{
CloseHandle(hFile);
return
FALSE;
}
ImageBase=MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0);
if
(!ImageBase)
{
CloseHandle(hMapping);
CloseHandle(hFile);
return
FALSE;
}
pstMapFile->hFile=hFile;
pstMapFile->hMapping=hMapping;
pstMapFile->ImageBase=ImageBase;
return
TRUE;
}