看流星社区

 找回密码
 注册账号
查看: 1918|回复: 0

解析PE文件的附加数据

[复制链接]

该用户从未签到

发表于 2017-6-2 11:00:58 | 显示全部楼层 |阅读模式
解析程序自己的附加数据,将附加数据写入文件中。
主要是解析PE文件头,定位到overlay的地方,写入文件。常应用的场景是在crackme中,crackme自身有一段加密过的附加数据,在crackme运行的过程中解析自己的附加数据,然后解密这段数据。。。。


代码留存:
  1.         //解析自己的PE文件
  2.         TCHAR szModuleFile[MAX_PATH] = {0};
  3.         ::GetModuleFileName(NULL, szModuleFile, MAX_PATH);
  4.         HANDLE hFile = ::CreateFile(szModuleFile, 0X80000000, 0X1, NULL, 0x3, 0x80, NULL );
  5.         if (!hFile)
  6.         {
  7.                 AfxMessageBox("create file error");
  8.                 return ;
  9.         }
  10.         DWORD dwFileSize = 0;
  11.         dwFileSize = ::GetFileSize(hFile, NULL);
  12.         if (!dwFileSize)
  13.         {
  14.                 AfxMessageBox("GetFileSize error");
  15.                 return ;
  16.         }
  17.         TCHAR *pBuffer = new TCHAR[dwFileSize+1];
  18.         DWORD dwReadBytes = 0;
  19.         BOOL bSuc = ::ReadFile(hFile, pBuffer, dwFileSize, &dwReadBytes, NULL);
  20.         if (!bSuc)
  21.         {
  22.                 AfxMessageBox("read file error");
  23.                 return ;
  24.         }
  25.         IMAGE_DOS_HEADER *pDosHead =(IMAGE_DOS_HEADER *)pBuffer;  
  26.         IMAGE_NT_HEADERS *pNtHeader;
  27.     // 得到PE文件头.  
  28.         pNtHeader = (IMAGE_NT_HEADERS*)((char*)pDosHead + pDosHead->e_lfanew);
  29.         WORD wNumOfSection = pNtHeader->FileHeader.NumberOfSections;
  30.         //DWORD dwTemp = wNumOfSection * (sizeof(IMAGE_SECTION_HEADER)/sizeof(DWORD));
  31.         WORD wSizeOfOptionalHeader = pNtHeader->FileHeader.SizeOfOptionalHeader;
  32.         DWORD *pOverLay;
  33.         DWORD *pLastSectionVirualAddress;
  34.         DWORD *pLastSectionVirualSize;
  35.         DWORD *pLastSectionPhyAddress, *pLastSectionPhySize;
  36.         pLastSectionVirualSize = (DWORD*) ((char*)pNtHeader+ sizeof(IMAGE_NT_HEADERS) + (wNumOfSection-1)*sizeof(IMAGE_SECTION_HEADER) + sizeof(BYTE)*IMAGE_SIZEOF_SHORT_NAME );
  37.         pLastSectionVirualAddress = pLastSectionVirualSize + 1;
  38.         pLastSectionPhyAddress = pLastSectionVirualSize + 2;
  39.         pLastSectionPhySize = pLastSectionVirualSize + 3;
  40.         DWORD dw1 = *pLastSectionPhyAddress;
  41.         DWORD dw2 = *pLastSectionPhySize;
  42.         pOverLay = (DWORD*)(dw1 + dw2 + pBuffer);
  43.         DWORD dwOverlaySize = dwFileSize - (dw1 + dw2);
  44.         HANDLE hOutFile = ::CreateFile("C:\\Users\\Administrator\\Desktop\\crackme.exe.overlay", GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, NULL, NULL);
  45.         if (!hOutFile)
  46.         {
  47.                 return ;
  48.         }
  49.         DWORD dwWritten = 0;
  50.         ::WriteFile(hOutFile, pOverLay, dwOverlaySize, &dwWritten, NULL);
  51.         ::CloseHandle(hOutFile);
  52.         if ((char *)pOverLay == 0x0)
  53.         {
  54.                 AfxMessageBox("附加数据首字节为0");
  55.                 return ;
  56.         }
  57.         ::free(pBuffer);
  58.         ::CloseHandle(hFile);
复制代码
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-29 03:57

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表