Как получить длину сегмента подписи исполняемого файла Windows с подписью - PullRequest
0 голосов
/ 16 февраля 2011

Моя программа объединена с некоторыми дополнительными данными в конце оригинального exe. Программа будет извлекать дополнительные данные на диск при запуске программы.

Однако моя программа не может получить правильное смещение добавленных данных после подписания объединенной исполняемой программы.

Я сравнил подписанный exe-файл и исходный exe-файл, информация о подписи добавляется в конце exe-файла. Поэтому я ищу Win32 API для получения длины сегмента подписи от подписанной программы. После этого моя программа может найти правильное смещение объединенных данных, а затем извлечь их правильно.

Может ли кто-нибудь дать мне подсказку?

Ответы [ 2 ]

1 голос
/ 17 февраля 2011

Я нашел инструмент с именем PEDump (написанный Мэттом Пьетреком для своей книги) с исходным кодом, чтобы продемонстрировать, как получить размер информации для подписи.

Ниже приведен код, извлеченный из PEDump для моей цели,

// MakePtr is a macro that allows you to easily add to values (including
// pointers) together without dealing with C's pointer arithmetic.  It
// essentially treats the last two parameters as DWORDs.  The first
// parameter is used to typecast the result to the appropriate pointer type.
#define MakePtr( cast, ptr, addValue ) (cast)( (DWORD)(ptr) + (DWORD)(addValue))

// Names of the data directory elements that are defined
const char *ImageDirectoryNames[] = {
    "EXPORT", "IMPORT", "RESOURCE", "EXCEPTION", "SECURITY", "BASERELOC",
    "DEBUG", "COPYRIGHT", "GLOBALPTR", "TLS", "LOAD_CONFIG",
    "BOUND_IMPORT", "IAT",  // These two entries added for NT 3.51
    "DELAY_IMPORT" };       // This entry added in NT 5

#define NUMBER_IMAGE_DIRECTORY_ENTRYS \
    (sizeof(ImageDirectoryNames)/sizeof(char *))
        HANDLE hFile = (HANDLE)_get_osfhandle(_fileno(getProgramFile()));
        HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
        if ( hFileMapping == 0 )
        {
            printf("%s", "Couldn't open file mapping with CreateFileMapping()\n");
        } else {
            LPVOID lpFileBase = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
            if ( lpFileBase == 0 )
            {
                printf("%s", "Couldn't map view of file with MapViewOfFile()\n");
            } else {
                PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)lpFileBase;
                PIMAGE_FILE_HEADER pImgFileHdr = (PIMAGE_FILE_HEADER)lpFileBase;
                // it's EXE file
                if ( dosHeader->e_magic == IMAGE_DOS_SIGNATURE )
                {
                    PIMAGE_NT_HEADERS pNTHeader;
                    DWORD base = (DWORD)dosHeader;

                    pNTHeader = MakePtr( PIMAGE_NT_HEADERS, dosHeader, dosHeader->e_lfanew );

                    PIMAGE_OPTIONAL_HEADER optionalHeader = (PIMAGE_OPTIONAL_HEADER)&pNTHeader->OptionalHeader;
                    for ( int i=0; i < optionalHeader->NumberOfRvaAndSizes; i++)
                    {
                        // DataDirectory[4] represents security directory
                        if ( 4 == i ) {
                            signingLength = optionalHeader->DataDirectory[i].Size;
                            break;
                        }
                    }
                }
                UnmapViewOfFile(lpFileBase);
            }
            CloseHandle(hFileMapping);
        }
0 голосов
/ 16 февраля 2011

Поставьте длинную строку подписи до и после ваших данных, а затем просто найдите эти строки с ожидаемыми смещениями.

...