혹시나 VS2005 에서 위의 패치가 된 경우 해당 Redistribution 패키지가 없으면 -_-
Side By Side 에러로 인해서 프로그램이 동작하지 않는 걸 볼 수 있다 ㅋㅋ
혹시나 VS2005 에서 위의 패치가 된 경우 해당 Redistribution 패키지가 없으면 -_-
Side By Side 에러로 인해서 프로그램이 동작하지 않는 걸 볼 수 있다 ㅋㅋ
빌드 자동화를 하다보면, 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의 인증상태를 찾는 방법에 대해서 알아보도록 하자.