| 빌드 자동화를 하다보면, Validation 검증이라는 부분에서 문제가 생길 수 가 있다. 예를 들어, 프로그램에 VeriSign 의 코드 인증을 한다고 할 때, 결과물을 보고 인증이 성공했는지 등에 대해서 자동으로 판단하게 해야 한다.(사실은 어렵지 않다.) 결론부터 말하자면, PE 파일 구조 안에 그 해답이 있다. | IMAGE_DOS_HEADER | | IMAGE_FILE_HEADER | | IMAGE_OPTIONAL_HEADER (32/64) | 위와 같은 형태로 PE 파일의 헤더가 구성되는데 IMAGE_OPTIONAL_HEADER 안에 16개의 DataDirectory 라는 부분이 있다. 그리고 그 안에 5번째 index 는 0x04인 CERTIFICATE_TABLE 을 보면 파일에서의 인증서 시작위치와 사이즈를 바로 알 수 있다. 코드도 매우 간단하다. // PEViewer.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다. // #include "stdafx.h" #include <windows.h> #include <winnt.h> const int CERTIFICATE_TABLE_INDEX =4; bool Analyze( FILE *fp, bool &certInfo ) { certInfo = false; if( NULL == fp ) return false; IMAGE_DOS_HEADER dosHeader; fread( &dosHeader, sizeof(IMAGE_DOS_HEADER), 1, fp ); if( 0x5A4D != dosHeader.e_magic ) return false; fseek( fp, dosHeader.e_lfanew, SEEK_SET ); IMAGE_NT_HEADERS ntHeader; fread( &ntHeader, sizeof(IMAGE_NT_HEADERS), 1, fp ); if( 0x00004550 != ntHeader.Signature ) return false; if( ntHeader.OptionalHeader.DataDirectory[CERTIFICATE_TABLE_INDEX].Size == 0 ) { certInfo = false; return true; } return true; } int _tmain(int argc, _TCHAR* argv[]) { if( argc < 1 ) return 0; FILE *fp = fopen( argv[1], "rb" ); bool bCert; Analyze(fp, bCert); fclose(fp); return 0; } 다음에는 CAB 파일안에서 CAB의 인증상태를 찾는 방법에 대해서 알아보도록 하자. |