日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
網(wǎng)絡(luò)安全編程:PE編程實(shí)例之PE查看器

微信公眾號(hào):計(jì)算機(jī)與網(wǎng)絡(luò)安全

創(chuàng)新互聯(lián)公司是一家專業(yè)從事網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁設(shè)計(jì)的品牌網(wǎng)絡(luò)公司。如今是成都地區(qū)具影響力的網(wǎng)站設(shè)計(jì)公司,作為專業(yè)的成都網(wǎng)站建設(shè)公司,創(chuàng)新互聯(lián)公司依托強(qiáng)大的技術(shù)實(shí)力、以及多年的網(wǎng)站運(yùn)營經(jīng)驗(yàn),為您提供專業(yè)的成都網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)及網(wǎng)站設(shè)計(jì)開發(fā)服務(wù)!

ID:Computer-network

寫PE查看器并不是件復(fù)雜的事情,只要按照PE結(jié)構(gòu)一步一步地解析就可以了。下面簡單地解析其中幾個(gè)字段內(nèi)容,顯示一下節(jié)表的信息,其余的內(nèi)容只要稍作修改即可。PE查看器的界面如圖1所示。

圖1 PE查看器解析記事本程序

PE查看器的界面按照?qǐng)D1所示的設(shè)置,不過這個(gè)可以按照個(gè)人的偏好進(jìn)行布局設(shè)置。編寫該P(yáng)E查看器的步驟為打開文件并創(chuàng)建文件內(nèi)存映像,判斷文件是否為PE文件并獲得PE格式相關(guān)結(jié)構(gòu)體的指針,解析基本的PE字段,枚舉節(jié)表,最后關(guān)閉文件。需要在類中添加幾個(gè)成員變量及成員函數(shù),添加的內(nèi)容如圖2所示。

圖2 在類中添加的成員變量及成員函數(shù)

按照前面所說的順序,依次實(shí)現(xiàn)添加的各個(gè)成員函數(shù)。

 
 
 
  1. BOOL CPeParseDlg::FileCreate(char *szFileName)
  2. {
  3.   BOOL bRet = FALSE;
  4.   m_hFile = CreateFile(szFileName,
  5.     GENERIC_READ | GENERIC_WRITE,
  6.     FILE_SHARE_READ,NULL,OPEN_EXISTING,
  7.     FILE_ATTRIBUTE_NORMAL,NULL);
  8.   if ( m_hFile == INVALID_HANDLE_VALUE )
  9.   {
  10.     return bRet;
  11.   }
  12.   m_hMap = CreateFileMapping(m_hFile, NULL,
  13.     PAGE_READWRITE | SEC_IMAGE,0, 0, 0);
  14.   if ( m_hMap == NULL )
  15.   {
  16.     CloseHandle(m_hFile);
  17.     return bRet;
  18.   }
  19.   m_lpBase = MapViewOfFile(m_hMap,
  20.     FILE_MAP_READ | FILE_SHARE_WRITE,
  21.     0, 0, 0);
  22.   if ( m_lpBase == NULL )
  23.   {
  24.     CloseHandle(m_hMap);
  25.     CloseHandle(m_hFile);
  26.     return bRet;
  27.   }
  28.   bRet = TRUE;
  29.   return bRet;
  30. }

這個(gè)函數(shù)的主要功能是打開文件并創(chuàng)建內(nèi)存文件映像。通常對(duì)文件進(jìn)行連續(xù)讀寫時(shí)直接使用ReadFile()和WriteFile()兩個(gè)函數(shù)。當(dāng)不連續(xù)操作文件時(shí),每次在ReadFile()或者WriteFile()后就要使用SetFilePointer()來調(diào)整文件指針的位置,這樣的操作較為繁瑣。內(nèi)存文件映像的作用是把整個(gè)文件映射入進(jìn)程的虛擬空間中,這樣操作文件就像操作內(nèi)存變量或內(nèi)存數(shù)據(jù)一樣方便。

創(chuàng)建內(nèi)存文件映像所使用的函數(shù)有兩個(gè),分別是CreateFileMapping()和MapViewOfFile()。CreateFileMapping()函數(shù)的定義如下:

 
 
 
  1. HANDLE CreateFileMapping(
  2.  HANDLE hFile,
  3.  LPSECURITY_ATTRIBUTES lpAttributes,
  4.  DWORD flProtect,
  5.  DWORD dwMaximumSizeHigh,
  6.  DWORD dwMaximumSizeLow,
  7.  LPCTSTR lpName
  8. );

參數(shù)說明如下。

hFile:該參數(shù)是 CreateFile()函數(shù)返回的句柄。

lpAttributes:是安全屬性,該值通常是 NULL。

flProtect:創(chuàng)建文件映射后的屬性,通常設(shè)置為可讀可寫 PAGE_READWRITE。如果需要像裝載可執(zhí)行文件那樣把文件映射入內(nèi)存的話,那么需要使用 SEC_IMAGE。最后3個(gè)參數(shù)在這里為0。如果創(chuàng)建的映射需要在多進(jìn)程中共享數(shù)據(jù)的話,那么最后一個(gè)參數(shù)設(shè)定為一個(gè)字符串,以便通過該名稱找到該塊共享內(nèi)存。

該函數(shù)的返回值為一個(gè)內(nèi)存映射的句柄。

MapViewOfFile()函數(shù)的定義如下:

 
 
 
  1. LPVOID MapViewOfFile(
  2.  HANDLE hFileMappingObject,
  3.  DWORD dwDesiredAccess,
  4.  DWORD dwFileOffsetHigh,
  5.  DWORD dwFileOffsetLow,
  6.  SIZE_T dwNumberOfBytesToMap
  7. );

參數(shù)說明如下。

hFileMappingObject:該參數(shù)為 CreateFileMapping()返回的句柄。

dwDesiredAccess:想獲得的訪問權(quán)限,通常情況下也是可讀可寫 FILE_MAP_READ、FILE_MAP_WRITE。

最后3個(gè)參數(shù)一般給0值就可以了。

按照編程的規(guī)矩,打開要關(guān)閉,申請(qǐng)要釋放。CreateFileMapping()的關(guān)閉需要使用CloseHandle()函數(shù)。MapViewOfFile()的關(guān)閉,要使用UnmapViewOfFile()函數(shù),該函數(shù)的定義如下:

 
 
 
  1. BOOL UnmapViewOfFile(
  2.  LPCVOID lpBaseAddress
  3. );

該函數(shù)的參數(shù)就是MapViewOfFile()函數(shù)的返回值。

接著說PE查看器,文件已經(jīng)打開,就要判斷文件是否為有效的PE文件了。如果是有效的PE文件,就把解析PE格式的相關(guān)結(jié)構(gòu)體的指針也得到。代碼如下:

 
 
 
  1. BOOL CPeParseDlg::IsPeFileAndGetPEPointer()
  2. {
  3.   BOOL bRet = FALSE;
  4.   // 判斷是否為 MZ 頭
  5.   m_pDosHdr = (PIMAGE_DOS_HEADER)m_lpBase;
  6.   if ( m_pDosHdr->e_magic != IMAGE_DOS_SIGNATURE )
  7.   {
  8.     return bRet;
  9.   }
  10.   // 根據(jù) IMAGE_DOS_HEADER 的 e_lfanew 的值得到 PE 頭的位置
  11.   m_pNtHdr = (PIMAGE_NT_HEADERS)((DWORD)m_lpBase + m_pDosHdr->e_lfanew);
  12.   // 判斷是否為 PE\0\0
  13.   if ( m_pNtHdr->Signature != IMAGE_NT_SIGNATURE )
  14.   {
  15.     return bRet;
  16.   }
  17.   // 獲得節(jié)表的位置
  18.   m_pSecHdr = (PIMAGE_SECTION_HEADER)((DWORD)&(m_pNtHdr->OptionalHeader)
  19.     + m_pNtHdr->FileHeader.SizeOfOptionalHeader);
  20.   bRet = TRUE;
  21.   return bRet;
  22. }

這段代碼應(yīng)該非常容易理解,繼續(xù)看解析PE格式的部分。

 
 
 
  1. VOID CPeParseDlg::ParseBasePe()
  2. {
  3.   CString StrTmp;
  4.   // 入口地址
  5.   StrTmp.Format("%08X", m_pNtHdr->OptionalHeader.AddressOfEntryPoint);
  6.   SetDlgItemText(IDC_EDIT_EP, StrTmp);
  7.   // 映像基地址
  8.   StrTmp.Format("%08X", m_pNtHdr->OptionalHeader.ImageBase);
  9.   SetDlgItemText(IDC_EDIT_IMAGEBASE, StrTmp);
  10.   // 連接器版本號(hào)
  11.   StrTmp.Format("%d.%d",
  12.     m_pNtHdr->OptionalHeader.MajorLinkerVersion,
  13.     m_pNtHdr->OptionalHeader.MinorLinkerVersion);
  14.   SetDlgItemText(IDC_EDIT_LINKVERSION, StrTmp);
  15.   // 節(jié)表數(shù)量
  16.   StrTmp.Format("%02X", m_pNtHdr->FileHeader.NumberOfSections);
  17.   SetDlgItemText(IDC_EDIT_SECTIONNUM, StrTmp);
  18.   // 文件對(duì)齊值大小
  19.   StrTmp.Format("%08X", m_pNtHdr->OptionalHeader.FileAlignment);
  20.   SetDlgItemText(IDC_EDIT_FILEALIGN, StrTmp);
  21.   // 內(nèi)存對(duì)齊值大小
  22.   StrTmp.Format("%08X", m_pNtHdr->OptionalHeader.SectionAlignment);
  23.   SetDlgItemText(IDC_EDIT_SECALIGN, StrTmp);
  24. }

PE格式的基礎(chǔ)信息,就是簡單地獲取結(jié)構(gòu)體的成員變量,沒有過多復(fù)雜的內(nèi)容。獲取導(dǎo)入表、導(dǎo)出表比獲取基礎(chǔ)信息復(fù)雜。接下來進(jìn)行節(jié)表的枚舉,具體代碼如下:

 
 
 
  1. VOID CPeParseDlg::EnumSections()
  2. {
  3.   int nSecNum = m_pNtHdr->FileHeader.NumberOfSections;
  4.   int i = 0;
  5.   CString StrTmp;
  6.   for ( i = 0; i < nSecNum; i ++ )
  7.   {
  8.     m_SectionLIst.InsertItem(i, (const char *)m_pSecHdr[i].Name);
  9.     StrTmp.Format("%08X", m_pSecHdr[i].VirtualAddress);
  10.     m_SectionLIst.SetItemText(i, 1, StrTmp);
  11.     StrTmp.Format("%08X", m_pSecHdr[i].Misc.VirtualSize);
  12.     m_SectionLIst.SetItemText(i, 2, StrTmp);
  13.     StrTmp.Format("%08X", m_pSecHdr[i].PointerToRawData);
  14.     m_SectionLIst.SetItemText(i, 3, StrTmp);
  15.     StrTmp.Format("%08X", m_pSecHdr[i].SizeOfRawData);
  16.     m_SectionLIst.SetItemText(i, 4, StrTmp);
  17.     StrTmp.Format("%08X", m_pSecHdr[i].Characteristics);
  18.     m_SectionLIst.SetItemText(i, 5, StrTmp);
  19.   }
  20. }

最后的動(dòng)作是釋放動(dòng)作,因?yàn)楹芎唵?,這里就不給出代碼了。將這些自定義函數(shù)通過界面上的“查看”按鈕聯(lián)系起來,整個(gè)PE查看器就算是寫完了。


分享名稱:網(wǎng)絡(luò)安全編程:PE編程實(shí)例之PE查看器
轉(zhuǎn)載來于:http://www.5511xx.com/article/dhjdpsd.html