日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

获取PE文件的区段表

發布時間:2024/4/18 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 获取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文件的区段表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。