winapi - Sådan får du længden af ​​underskrivningssegmentet af en underskrevet Windows eksekverbar

Indlæg af Hanne Mølgaard Plasc

Problem



Mit program er kombineret med nogle yderligere data i slutningen af ​​den originale exe. Programmet vil ekstrahere de ekstra data til disken, når programmet køres.


Men mit program kan ikke få den rigtige forskydning af de vedhæftede data efter underskrivelse af det kombinerede eksekverbare program.


Jeg sammenlignede den underskrevne exe og den originale exe, underskriftsoplysningerne er vedlagt i slutningen af ​​exe. Så jeg leder efter en Win32 API for at få længden af ​​underskrivningssegmentet fra det underskrevne program. Derefter kan mit program finde den rigtige forskydning af kombinerede data og derefter udpakke dem korrekt.


Kan nogen give mig et tip?

Bedste reference


Jeg finder et værktøj med navnet PEDump (skrevet af Matt Pietrek for sin bog) med kildekoden for at vise, hvordan man får størrelsen af ​​signeringsoplysninger. [2]


Nedenfor er koden hentet fra PEDump til mit formål,


// 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()
");
        } else {
            LPVOID lpFileBase = MapViewOfFile(hFileMapping, FILE\_MAP\_READ, 0, 0, 0);
            if ( lpFileBase == 0 )
            {
                printf("\%s", "Couldn't map view of file with MapViewOfFile()
");
            } 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);
        }

Andre referencer 1


Sæt en lang signatur linje før og efter dine data, og søg bare efter disse linjer på de forventede forskydninger.