zoukankan      html  css  js  c++  java
  • 手动加入PE文件数字签名信息及格式具体解释图之下(历史代码,贴出学习)

    #include <windows.h> 
    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 <iostream>
    using namespace std;
    
    void UsingFuction()
    {
        cout<<"---------import cer to exe---------------->>"<<endl;
        cout<<"--EX:srcpath[*.cer] despath [*.exe]------->>"<<endl;
        cout<<"------------------------------------------>>"<<endl;
    }
    int main( int argc,char **argv) 
    { 
        switch (argc)
        {
        case 1:
            cout<<"help using usage -h"<<endl;
            break;
        case 2:
            {
                if (strcmp(argv[1],"-h"))
                {
                    UsingFuction();
                    return RETURN_FAIL;
                }
            }
            break;
        case 3:
            cout<<"all argument is ok"<<endl;
            break;
        default:
            cout<<"argument is error"<<endl;
            break;
        }
        if (argc!=3)
        {
            UsingFuction();
            return RETURN_FAIL;
        }
        TCHAR* lpcerFilePath=argv[1];
        TCHAR* lpPeFilePath=argv[2];
        hWriteFileHandle = CreateFile(lpPeFilePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL , 
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) ; 
        if ( hWriteFileHandle==INVALID_HANDLE_VALUE ) 
            return RETURN_FAIL; 
        hFileMapping = CreateFileMapping( hWriteFileHandle, NULL , PAGE_READWRITE, 0, 0, NULL ) ; 
        if ( ! hFileMapping ) 
        { 
            CloseHandle( hWriteFileHandle) ; 
            return RETURN_FAIL; 
        } 
        lpVoidFileBaseAddress = MapViewOfFile( hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0) ; 
        if ( ! lpVoidFileBaseAddress ) 
        { 
            CloseHandle( hFileMapping) ; 
            CloseHandle( hWriteFileHandle) ; 
            return RETURN_FAIL; 
        } 
        lpidh_Dos_Header = (PIMAGE_DOS_HEADER) lpVoidFileBaseAddress; 
        if ( lpidh_Dos_Header->e_magic!=IMAGE_DOS_SIGNATURE ) 
            return RETURN_FAIL; 
    
        lpinh_NTHeader=(PIMAGE_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;
    
        //if exist sn
        if (sdp.dwSize!=0)
        {
            //
            return RETURN_FAIL;
        }
        //
        hReadFileHandle = CreateFile(lpcerFilePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL ,
        OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL ) ; 
        if ( hReadFileHandle==INVALID_HANDLE_VALUE ) 
            return RETURN_FAIL; 
        DWORD dwReadedSize=0;   
        DWORD dwWritedSize=0;
    
        SetFilePointer(hReadFileHandle,-4,0,FILE_END);
        ReadFile(hReadFileHandle,&sdp.dwSize,sizeof(DWORD),&dwReadedSize,NULL);
    
        PBYTE pbBufferSignture=new byte[sdp.dwSize];
        SetFilePointer(hReadFileHandle,0,0,FILE_BEGIN);
        ReadFile(hReadFileHandle,pbBufferSignture,sdp.dwSize,&dwReadedSize,NULL);
    
        PIMAGE_SECTION_HEADER lppsh_SECTION_HEADER=(PIMAGE_SECTION_HEADER)((DWORD)&lpinh_NTHeader->OptionalHeader+lpinh_NTHeader
        ->FileHeader.SizeOfOptionalHeader);
        lppsh_SECTION_HEADER=lppsh_SECTION_HEADER+(lpinh_NTHeader->FileHeader.NumberOfSections-1);
        sdp.dwVirtulAddress=lppsh_SECTION_HEADER->PointerToRawData+lppsh_SECTION_HEADER->SizeOfRawData;
    
        SetFilePointer(hWriteFileHandle,sdp.dwVirtulAddress,0,FILE_BEGIN);
        WriteFile(hWriteFileHandle,pbBufferSignture,sdp.dwSize,&dwWritedSize,NULL);
    
        lpinh_NTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY].VirtualAddress=sdp.dwVirtulAddress;
        lpinh_NTHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY].Size=sdp.dwSize;
        delete pbBufferSignture;
    
        UnmapViewOfFile( lpVoidFileBaseAddress) ; 
        CloseHandle( hFileMapping); 
        CloseHandle( hReadFileHandle); 
        CloseHandle(hWriteFileHandle);
    
    
        return RETURN_SUCC; 
    } 
    

  • 相关阅读:
    Web Service简介
    初识web service
    HTTP 状态代码的完整列表
    【转】JBPM4 RepositoryService
    【转】SD和SDHC和SDXC卡的区别
    【转】PP常用TCODE
    【转】SAP会计科目表
    【转】JBPM4中 state 和 task 的不同
    【转】学习一下车险
    【转】JBPM4 TaskService
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5156619.html
Copyright © 2011-2022 走看看