成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

網(wǎng)絡(luò)安全編程:PE編程實例之PE查看器

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

[[395692]]

微信公眾號:計算機與網(wǎng)絡(luò)安全

ID:Computer-network

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

 

 

 

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

 

 

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

 

 

 

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

 

 

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

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

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

創(chuàng)建內(nèi)存文件映像所使用的函數(shù)有兩個,分別是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個參數(shù)在這里為0。如果創(chuàng)建的映射需要在多進程中共享數(shù)據(jù)的話,那么最后一個參數(shù)設(shè)定為一個字符串,以便通過該名稱找到該塊共享內(nèi)存。

該函數(shù)的返回值為一個內(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個參數(shù)一般給0值就可以了。

按照編程的規(guī)矩,打開要關(guān)閉,申請要釋放。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.   BOOL bRet = FALSE
  3.   // 判斷是否為 MZ 頭 
  4.   m_pDosHdr = (PIMAGE_DOS_HEADER)m_lpBase; 
  5.   if ( m_pDosHdr->e_magic != IMAGE_DOS_SIGNATURE ) 
  6.   { 
  7.     return bRet; 
  8.   } 
  9.   // 根據(jù) IMAGE_DOS_HEADER 的 e_lfanew 的值得到 PE 頭的位置 
  10.   m_pNtHdr = (PIMAGE_NT_HEADERS)((DWORD)m_lpBase + m_pDosHdr->e_lfanew); 
  11.   // 判斷是否為 PE\0\0 
  12.   if ( m_pNtHdr->Signature != IMAGE_NT_SIGNATURE ) 
  13.   { 
  14.     return bRet; 
  15.   } 
  16.   // 獲得節(jié)表的位置 
  17.   m_pSecHdr = (PIMAGE_SECTION_HEADER)((DWORD)&(m_pNtHdr->OptionalHeader) 
  18.     + m_pNtHdr->FileHeader.SizeOfOptionalHeader); 
  19.   bRet = TRUE
  20.   return bRet; 

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

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

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

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

最后的動作是釋放動作,因為很簡單,這里就不給出代碼了。將這些自定義函數(shù)通過界面上的“查看”按鈕聯(lián)系起來,整個PE查看器就算是寫完了。  

 

責任編輯:龐桂玉 來源: 計算機與網(wǎng)絡(luò)安全
相關(guān)推薦

2021-04-26 10:32:38

網(wǎng)絡(luò)安全PE編程工具

2021-04-30 18:50:44

網(wǎng)絡(luò)安全PE編程添加節(jié)區(qū)

2021-04-28 14:35:48

網(wǎng)絡(luò)安全PE編程代碼

2021-04-19 10:26:41

網(wǎng)絡(luò)安全PE文件

2021-04-22 09:35:23

網(wǎng)絡(luò)安全PE地址

2021-03-03 12:20:42

網(wǎng)絡(luò)安全DLL編程

2021-02-19 09:30:52

網(wǎng)絡(luò)安全服務(wù)控制管理器代碼

2016-10-10 00:18:27

2021-01-18 10:35:18

網(wǎng)絡(luò)安全Windows代碼

2021-03-05 13:46:56

網(wǎng)絡(luò)安全遠程線程

2021-01-26 13:45:03

網(wǎng)絡(luò)安全Winsock編程

2021-02-23 10:20:07

網(wǎng)絡(luò)安全進程代碼

2021-02-21 18:19:43

網(wǎng)絡(luò)安全網(wǎng)絡(luò)安全編程創(chuàng)建進程

2021-04-14 15:53:58

網(wǎng)絡(luò)安全C語言wcslen

2021-05-08 11:50:59

網(wǎng)絡(luò)安全API函數(shù)代碼

2021-03-31 11:35:00

網(wǎng)絡(luò)安全OllyDbg分析工具

2021-03-01 11:20:13

網(wǎng)絡(luò)安全多線程代碼

2021-06-18 09:55:09

網(wǎng)絡(luò)安全目錄監(jiān)控

2021-04-13 11:15:54

網(wǎng)絡(luò)安全C語言循環(huán)結(jié)構(gòu)

2021-04-08 11:10:22

網(wǎng)絡(luò)安全C語言if…else…
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: a爱视频 | 羞羞视频在线观看 | 韩国av一区二区 | 国产偷录视频叫床高潮对白 | 天天干天天爽 | 欧美日韩一区不卡 | 国产一区二区三区在线视频 | 久久久精品一区 | 午夜视频网站 | 午夜精品久久久久久久久久久久 | 91av亚洲| 剑来高清在线观看 | 91视频电影 | 成人三级网址 | 日本a级大片 | 成人在线播放 | 电影午夜精品一区二区三区 | 亚洲免费视频一区 | 97伦理 | 成人午夜免费福利视频 | 免费的一级视频 | 情侣黄网站免费看 | 一区二区三区中文字幕 | 成人永久免费视频 | 国产一区二区三区网站 | 成人性视频在线 | 黄网站在线观看 | 碰碰视频| 国产精品久久久久婷婷二区次 | 91麻豆精品国产91久久久久久 | 夜夜草视频 | 久久91视频| 日韩精品无码一区二区三区 | 久久综合一区 | 午夜精品久久久久久久久久久久 | 91精品久久久久久久久久入口 | 黄色综合| 欧美成人精品二区三区99精品 | 久热国产在线 | 在线日韩视频 | 国产婷婷 |