PE文件数字签名信息读取存储及格式详解图之上(历史代码,贴出学习)

// 注意下图PE文件格式详解图中的


// IMAGE_NT_HEADERS------->OptionalHeader------>DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY]字段


#include  
HANDLE hWriteFileHandle = NULL ; 
HANDLE hReadFileHandle = NULL ; 
HANDLE hFileMapping = NULL ; 
LPVOID lpVoidFileBaseAddress = NULL ; 
IMAGE_DOS_HEADER * lpidh_Dos_Header= NULL ; 
IMAGE_NT_HEADERS * lpinh_NTHeader= NULL ; 

#define RETURN_FAIL -1
#define RETURN_SUCC  1


typedef struct __DIGITAL_SIGNATURE_DATA_PARAM
{
    DWORD dwVirtulAddress;
    DWORD dwSize;
}

SIGNATURE_DATA_PARAM,LPSIGNATURE_DATA_PARAM;

#include 
using namespace std;

void UsingFuction()
{
    cout<<"----------export cer from exe ------------>>"<>"<>"<e_magic!=IMAGE_DOS_SIGNATURE ) 
        return RETURN_FAIL; 

    lpinh_NTHeader=(IMAGE_NT_HEADERS*)((char*)lpVoidFileBaseAddress+lpidh_Dos_Header->e_lfanew) ; 
    if ( lpinh_NTHeader->Signature!=IMAGE_NT_SIGNATURE ) 
        return RETURN_FAIL; 
    //
    SIGNATURE_DATA_PARAM sdp;

    sdp.dwVirtulAddress=lpinh_NTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY].VirtualAddress;
    sdp.dwSize=lpinh_NTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY].Size;

    PBYTE pbBufferSignture=new byte[sdp.dwSize];
    DWORD dwReadedSize=0;
    SetFilePointer(hReadFileHandle,sdp.dwVirtulAddress,0,FILE_BEGIN);
    ReadFile(hReadFileHandle,pbBufferSignture,sdp.dwSize,&dwReadedSize,NULL);
    
    //
    hWriteFileHandle = CreateFile(lpcerFilePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL ,
    CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL ) ; 
    if ( hWriteFileHandle==INVALID_HANDLE_VALUE ) 
        return RETURN_FAIL; 
    DWORD dwWritedSize=0;
    WriteFile(hWriteFileHandle,pbBufferSignture,dwReadedSize,&dwWritedSize,NULL);
    WriteFile(hWriteFileHandle,&sdp.dwSize,sizeof(sdp.dwSize),&dwWritedSize,NULL);

    delete pbBufferSignture;
    UnmapViewOfFile( lpVoidFileBaseAddress) ; 
    CloseHandle( hFileMapping); 
    CloseHandle( hReadFileHandle); 
    CloseHandle(hWriteFileHandle);
    return RETURN_SUCC; 
} 


PE文件格式详解图

PE文件数字签名信息读取存储及格式详解图之上(历史代码,贴出学习)_第1张图片

你可能感兴趣的:(源码分享,资源共享,技术文章,网络安全与恶意代码)