获取PE文件的区段表
??? 獲取PE文件的區段表,用的方法是,首先打開CreateFile,然后讀取這個文件的DosHeader,
從DosHeader中取e_lfanew這個成員的值,這樣就能知道“PE00”的偏移,然后SetFilePointer文件的指針
到e_lfanew + sizeof(IMAGE_NT_SIGNATURE)這個地址,讀取FileHeader結構
,從文件頭結構中獲取NumberOfSections區段的個數,根據區段個數分配夠用的緩沖區,
最后SetFilePointer將文件指針從當前位置偏移FileHeader.SizeOfOptionalHeader,進行讀取IMAGE_SECTION_HEADER。
?
OK,搞定。
?
代碼如下:
?
?//清空列表控件
?m_ListCtrlSection.DeleteAllItems();
?
?IMAGE_DOS_HEADER?DosHeader = {0};
?IMAGE_FILE_HEADER?FileHeader = {0};
?HANDLE??hFile = INVALID_HANDLE_VALUE;
?DWORD??dwReadLen = 0;
?WORD??NumOfSec = 0;?//區段表個數
?IMAGE_SECTION_HEADER?*pSecHeader = NULL;
?//打開文件
?hFile = CreateFile("C://windows//system32//cmd.exe",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
?if (hFile == INVALID_HANDLE_VALUE)
?{
??MessageBox(_T("無法打開文件,分析失敗!"));
??return;
?}
?
?//讀取數據
?if (!ReadFile(hFile,&DosHeader,sizeof(DosHeader),&dwReadLen,NULL))
?{
??MessageBox(_T("無法讀取文件,分析失敗!"));
??return;
?}
?SetFilePointer(hFile,DosHeader.e_lfanew + sizeof(IMAGE_NT_SIGNATURE),NULL,FILE_BEGIN);
?ReadFile(hFile,&FileHeader,sizeof(FileHeader),&dwReadLen,NULL);
?//得出區段個數
?NumOfSec = FileHeader.NumberOfSections;
?//分配區段內存
?DWORD?SectionSize = NumOfSec * IMAGE_SIZEOF_SECTION_HEADER;
?char *pSecBuff = new char[SectionSize + 1];
?//移動指針到區段表
?SetFilePointer(hFile,FileHeader.SizeOfOptionalHeader,NULL,FILE_CURRENT);
?ReadFile(hFile,pSecBuff,SectionSize,&dwReadLen,NULL);
?//讀取完畢,關閉句柄
?CloseHandle(hFile);
?int iIndexItem = 0;
?TCHAR?tzBuff[10] = {0};
?char?szSecName[IMAGE_SIZEOF_SHORT_NAME] = {0};
?//內存數據指針轉換
?pSecHeader = (PIMAGE_SECTION_HEADER)pSecBuff;
?for (int i = 0; i < NumOfSec; i++)
?{
??memcpy(szSecName,pSecHeader->Name,8);
??iIndexItem = m_ListCtrlSection.InsertItem(i,(LPCTSTR)szSecName);
??
??//顯示VirtualAddress和VirtualSize
??wsprintf(tzBuff,_T("%08X"),pSecHeader->VirtualAddress);
??m_ListCtrlSection.SetItemText(iIndexItem,1,tzBuff);
??wsprintf(tzBuff,_T("%08X"),pSecHeader->Misc.VirtualSize);
??m_ListCtrlSection.SetItemText(iIndexItem,2,tzBuff);
??
??//顯示RawAddress和RawData
??wsprintf(tzBuff,_T("%08X"),pSecHeader->PointerToRawData);
??m_ListCtrlSection.SetItemText(iIndexItem,3,tzBuff);
??wsprintf(tzBuff,_T("%08X"),pSecHeader->SizeOfRawData);
??m_ListCtrlSection.SetItemText(iIndexItem,4,tzBuff);
??wsprintf(tzBuff,_T("%08X"),pSecHeader->Characteristics);
??m_ListCtrlSection.SetItemText(iIndexItem,5,tzBuff);
??//指針后移
??pSecHeader++;
?}
?//釋放內存
?if (pSecBuff)
?{
??delete []pSecBuff;
?}
總結
以上是生活随笔為你收集整理的获取PE文件的区段表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手动脱UPX壳的几种方法
- 下一篇: Win7下拖拽文件的bug