PE 파일 안에서 인증 정보 찾아내기

빌드 자동화를 하다보면, 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의 인증상태를 찾는 방법에 대해서 알아보도록 하자.