编码实现PE文件解析(C源代码)

#include #include LPTSTR lpcTheFile = TEXT("c:\\i.exe");int main(void){HANDLE hMapFile;HANDLE hFile;DWORD dwFileSize;DWORD dwSysGran;SYSTEM_INFO SysInfo;HANDLE lpMapAddress;
摘要由CSDN通过智能技术生成
// GetPEInfo.cpp : Defines the entry point for the console application.
//




#include <windows.h>
#include <stdio.h>


DWORD NumberOfSections=0;//global
DWORD difK=0;//file offset
DWORD *difA=NULL;//virtual address
DWORD *difS=NULL;//offset
int exportFlag=1;
int debugFlag=1;


BOOL IsPEFile(HANDLE ImageBase)
{
PIMAGE_DOS_HEADER pDH=NULL;
PIMAGE_NT_HEADERS pNtH=NULL;


if(ImageBase==NULL)
return FALSE;


pDH=(PIMAGE_DOS_HEADER)ImageBase;
if(IMAGE_DOS_SIGNATURE!=pDH->e_magic)
return FALSE;


pNtH=(PIMAGE_NT_HEADERS)((DWORD)pDH+pDH->e_lfanew);//
if(IMAGE_NT_SIGNATURE!=pNtH->Signature)
return FALSE;


return TRUE;
}


PIMAGE_NT_HEADERS GetNtHeaders(HANDLE ImageBase)
{
PIMAGE_DOS_HEADER pDH=NULL;
PIMAGE_NT_HEADERS pNtH=NULL;


if(!IsPEFile(ImageBase))
return NULL;


pDH=(PIMAGE_DOS_HEADER)ImageBase;
pNtH=(PIMAGE_NT_HEADERS)((DWORD)pDH+pDH->e_lfanew);


return pNtH;
}


PIMAGE_FILE_HEADER WINAPI GetFileHeader(HANDLE ImageBase)
{
PIMAGE_NT_HEADERS pNtH=NULL;
pNtH=GetNtHeaders(ImageBase);
if(!pNtH)
return NULL;
PIMAGE_FILE_HEADER pFH=NULL;
pFH=&pNtH->FileHeader;
return pFH;
}


PIMAGE_OPTIONAL_HEADER WINAPI GetOptionalHeader(HANDLE ImageBase)
{
PIMAGE_NT_HEADERS pNtH=NULL;
pNtH=GetNtHeaders(ImageBase);
if(!pNtH)
return NULL;
PIMAGE_OPTIONAL_HEADER pOH=NULL;
pOH=&pNtH->OptionalHeader;
return pOH;
}


void ShowFileHeaderInfo(HANDLE ImageBase)
{
PIMAGE_FILE_HEADER pFH=NULL;
pFH=GetFileHeader(ImageBase);
if(!pFH)
return ;
printf("Machine: 0x%.4X\n",pFH->Machine);
printf("NumberOfSections: 0x%.4X\n",pFH->NumberOfSections);
printf("TimeDateStamp: 0x%.8X\n",pFH->TimeDateStamp);
printf("PointerToSymbolTable: 0x%.8X\n",pFH->PointerToSymbolTable);
printf("NumberOfSymbols: 0x%.8X\n",pFH->NumberOfSymbols);
printf("SizeOfOptionalHeader: 0x%.4X\n",pFH->SizeOfOptionalHeader);
printf("Characteristics: 0x%.4X\n",pFH->Characteristics);
}


void ShowOptionalHeaderInfo(HANDLE ImageBase)
{
PIMAGE_OPTIONAL_HEADER pOH=NULL;
pOH=GetOptionalHeader(ImageBase);
if(!pOH)
return ;
printf("Magic: 0x%.4X\n",pOH->Magic);
printf("MajorLinkerVersion: 0x%.2X\n",pOH->MajorLinkerVersion);
printf("SizeOfCode: 0x%.8X\n",pOH->SizeOfCode);//.text
printf("SizeOfInitializedData: 0x%.8X\n",pOH->SizeOfInitializedData);
printf("SizeOfUninitializedData: 0x%.8X\n",pOH->SizeOfUninitializedData);//.bss
printf("AddressOfEntryPoint: 0x%.8X\n",pOH->AddressOfEntryPoint);
printf("BaseOfCode: 0x%.8X\n",pOH->BaseOfCode);//code section RVA
printf("BaseOfData: 0x%.8X\n",pOH->BaseOfData);//data section RVA
printf("ImageBase: 0x%.8X\n",pOH->ImageBase);
printf("Subsystem: 0x%.8X\n",pOH->Subsystem);
printf("NumberOfRvaAndSizes: 0x%.8X\n",pOH->NumberOfRvaAndSizes);//number of DataDirectory
}


void ShowDataDirInfo(HANDLE ImageBase)
{
PIMAGE_OPTIONAL_HEADER pOH=NULL;
pOH=GetOptionalHeader(ImageBase);
if(!pOH)
return ;
if(pOH->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size==0)exportFlag=0;//no Export Table
if(pOH->DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size==0)debugFlag=0;//no Debug Table
printf("DataDirectory RVA
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值