zoukankan      html  css  js  c++  java
  • 解析PE文件的附加数据

    解析程序自己的附加数据,将附加数据写入文件里。

    主要是解析PE文件头。定位到overlay的地方。写入文件。

    常应用的场景是在crackme中,crackme自身有一段加密过的附加数据。在crackme执行的过程中解析自己的附加数据,然后解密这段数据。。

    。。


    代码留存:


    	//解析自己的PE文件
    	TCHAR szModuleFile[MAX_PATH] = {0};
    	::GetModuleFileName(NULL, szModuleFile, MAX_PATH);
    
    	HANDLE hFile = ::CreateFile(szModuleFile, 0X80000000, 0X1, NULL, 0x3, 0x80, NULL );
    	if (!hFile)
    	{
    		AfxMessageBox("create file error");
    		return ;
    	}
    	DWORD dwFileSize = 0;
    	dwFileSize = ::GetFileSize(hFile, NULL);
    	if (!dwFileSize)
    	{
    		AfxMessageBox("GetFileSize error");
    		return ;
    	}
    	TCHAR *pBuffer = new TCHAR[dwFileSize+1];
    	DWORD dwReadBytes = 0;
    	BOOL bSuc = ::ReadFile(hFile, pBuffer, dwFileSize, &dwReadBytes, NULL);
    	if (!bSuc)
    	{
    		AfxMessageBox("read file error");
    		return ;
    	}
    	IMAGE_DOS_HEADER *pDosHead =(IMAGE_DOS_HEADER *)pBuffer;  
    	IMAGE_NT_HEADERS *pNtHeader;
        // 得到PE文件头.  
    	pNtHeader = (IMAGE_NT_HEADERS*)((char*)pDosHead + pDosHead->e_lfanew);
    	WORD wNumOfSection = pNtHeader->FileHeader.NumberOfSections;
    	//DWORD dwTemp = wNumOfSection * (sizeof(IMAGE_SECTION_HEADER)/sizeof(DWORD));
    	WORD wSizeOfOptionalHeader = pNtHeader->FileHeader.SizeOfOptionalHeader;
    
    	DWORD *pOverLay;
    	DWORD *pLastSectionVirualAddress;
    	DWORD *pLastSectionVirualSize;
    	DWORD *pLastSectionPhyAddress, *pLastSectionPhySize;
    
    	pLastSectionVirualSize = (DWORD*) ((char*)pNtHeader+ sizeof(IMAGE_NT_HEADERS) + (wNumOfSection-1)*sizeof(IMAGE_SECTION_HEADER) + sizeof(BYTE)*IMAGE_SIZEOF_SHORT_NAME );
    	pLastSectionVirualAddress = pLastSectionVirualSize + 1;
    	pLastSectionPhyAddress = pLastSectionVirualSize + 2;
    	pLastSectionPhySize = pLastSectionVirualSize + 3;
    
    	DWORD dw1 = *pLastSectionPhyAddress;
    	DWORD dw2 = *pLastSectionPhySize;
    	pOverLay = (DWORD*)(dw1 + dw2 + pBuffer);
    	DWORD dwOverlaySize = dwFileSize - (dw1 + dw2);
    
    	HANDLE hOutFile = ::CreateFile("C:\Users\Administrator\Desktop\crackme.exe.overlay", GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, NULL, NULL);
    	if (!hOutFile)
    	{
    		return ;
    	}
    	DWORD dwWritten = 0;
    	::WriteFile(hOutFile, pOverLay, dwOverlaySize, &dwWritten, NULL);
    	::CloseHandle(hOutFile);
    
    	if ((char *)pOverLay == 0x0)
    	{
    		AfxMessageBox("附加数据首字节为0");
    		return ;
    	}
    
    	::free(pBuffer);
    	::CloseHandle(hFile);


  • 相关阅读:
    基于策略模式简单实现element表单校验
    跨域
    原型模式
    单例模式
    vue-router进阶篇
    vue-router
    h5深度剖析
    js同步异步,任务队列
    JavaScript中事件委托(事件代理)详解
    网络请求get和post的区别
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6817485.html
Copyright © 2011-2022 走看看