#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; }