駆動中にpeファイルを解析するpdb
3769 ワード
ドライバの中でpeファイルのpdbを解析して、すべてコードの中で、本ブログは科学普及を担当しないで、すぐに使うことができるコードはあなたはすべて持っていて、ヘッダファイル、構造体、注釈はすべて整理してあなたはまた何がほしいですか?
CreateMapFileAndGetBaseAddr()の定義は私の次の文章を見てください.
このブログは、安定性とスタイルの高いコードを提供することを目的としています.
CreateMapFileAndGetBaseAddr()の定義は私の次の文章を見てください.
#include
#include
#include "ntimage.h"
#define NB10_SIG '01BN'
#define RSDS_SIG 'SDSR'
typedef struct CV_HEADER
{
DWORD Signature;
DWORD Offset;
}CV_HEADER;
typedef struct CV_INFO_PDB20
{
CV_HEADER CvHeader;
DWORD Signature;
DWORD Age;
BYTE PdbFileName[1];
}CV_INFO_PDB20;
typedef struct CV_INFO_PDB70
{
DWORD CvSignature;
GUID Signature;
DWORD Age;
BYTE PdbFileName[1];
}CV_INFO_PDB70;
BOOL PeIsRegionValid(PVOID Base, DWORD Size, PVOID Addr, DWORD RegionSize)
{
return ((PBYTE)Addr >= (PBYTE)Base && ((PBYTE)Addr + RegionSize) <= ((PBYTE)Base + Size));
}
// TRUE PdbStr PDB
BOOLEAN PeGetPdb(PVOID ImageBase, DWORD ImageSize, PCHAR PdbStr)
{
PBYTE Base = (PBYTE)ImageBase;
BOOLEAN Result = FALSE;
CV_HEADER* CvInfo;
PIMAGE_DEBUG_DIRECTORY DbgDir;
ULONG PdbNameSize = 0;
__try
{
do
{
PIMAGE_DOS_HEADER DosHeader = (PIMAGE_DOS_HEADER)Base;
PIMAGE_NT_HEADERS NtHeader = (PIMAGE_NT_HEADERS)(Base + DosHeader->e_lfanew);
PIMAGE_OPTIONAL_HEADER OptionalHeader;
PIMAGE_OPTIONAL_HEADER64 OptionalHeader64;
PIMAGE_OPTIONAL_HEADER32 OptionalHeader32;
DWORD DbgDirRva = 0;
//PE
OptionalHeader = (PIMAGE_OPTIONAL_HEADER)(Base + DosHeader->e_lfanew + FIELD_OFFSET(IMAGE_NT_HEADERS, OptionalHeader));
if (OptionalHeader->Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC) // PE32+ x64
{
OptionalHeader64 = (PIMAGE_OPTIONAL_HEADER64)OptionalHeader;
DbgDirRva = OptionalHeader64->DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress;
}
else // PE32 x86
{
OptionalHeader32 = (PIMAGE_OPTIONAL_HEADER32)OptionalHeader;
DbgDirRva = OptionalHeader32->DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress;
}
DbgDir = (PIMAGE_DEBUG_DIRECTORY)(Base + DbgDirRva);
if (!DbgDir)
break;
ProbeForRead(DbgDir, sizeof(IMAGE_DEBUG_DIRECTORY), 1);
Result = TRUE;// PDB
if (!DbgDir->AddressOfRawData || DbgDir->Type != IMAGE_DEBUG_TYPE_CODEVIEW)
break;
CvInfo = (CV_HEADER*)(Base + DbgDir->AddressOfRawData);
if (!PeIsRegionValid(Base, ImageSize, CvInfo, sizeof(CV_HEADER)))
break;
if (CvInfo->Signature == NB10_SIG) //VC6.0 (GBK)
{
if (!PeIsRegionValid(Base, ImageSize, CvInfo, sizeof(CV_INFO_PDB20)+MAX_PATH))
break;
PdbNameSize = strlen((CHAR*)((CV_INFO_PDB20*)CvInfo)->PdbFileName);
if (!PdbNameSize || PdbNameSize >= MAX_PATH)
break;
RtlCopyMemory(PdbStr, (CHAR*)((CV_INFO_PDB20*)CvInfo)->PdbFileName, PdbNameSize);
}
else if (CvInfo->Signature == RSDS_SIG) //VS2003+ (UTF-8)
{
if (!PeIsRegionValid(Base, ImageSize, CvInfo, sizeof(CV_INFO_PDB70)+MAX_PATH))
break;
PdbNameSize = strlen((CHAR*)((CV_INFO_PDB70*)CvInfo)->PdbFileName);
if (!PdbNameSize || PdbNameSize >= MAX_PATH)
break;
RtlCopyMemory(PdbStr, (CHAR*)((CV_INFO_PDB70*)CvInfo)->PdbFileName, PdbNameSize);
}
} while (0);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
KdPrint(("EXCEPTION_EXECUTE_HANDLER
"));
Result = FALSE;
}
return Result;
}
BOOLEAN PeGetFilePdb(PUNICODE_STRING pFilePath, PCHAR PdbStr)
{
BOOLEAN Result = FALSE;
SIZE_T Size = 0;
PVOID BaseAddress = CreateMapFileAndGetBaseAddr(pFilePath, &Size);
if (NULL == BaseAddress)
return FALSE;
Result = PeGetPdb(BaseAddress, Size, PdbStr);
ZwUnmapViewOfSection(ZwCurrentProcess(), BaseAddress);
return Result;
}
このブログは、安定性とスタイルの高いコードを提供することを目的としています.