VirtualBox

Ignore:
Timestamp:
Aug 19, 2014 1:50:00 AM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
95567
Message:

ldrPE.cpp: Fixed RTLDRPROP_IMPORT_COUNT, the gnu loader includes all the import stuff in their directory entry.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/ldr/ldrPE.cpp

    r52403 r52405  
    108108    /** The image timestamp. */
    109109    uint32_t                uTimestamp;
     110    /** The number of imports.  UINT32_MAX if not determined. */
     111    uint32_t                cImports;
    110112    /** Set if the image is 64-bit, clear if 32-bit. */
    111113    bool                    f64Bit;
     
    619621         pImps++)
    620622    {
     623        AssertReturn(pImps->Name < pModPe->cbImage, VERR_BAD_EXE_FORMAT);
    621624        const char *pszModName = PE_RVA2TYPE(pvBitsR, pImps->Name, const char *);
    622         PIMAGE_THUNK_DATA32 pFirstThunk;    /* update this. */
    623         PIMAGE_THUNK_DATA32 pThunk;         /* read from this. */
     625        AssertReturn(pImps->FirstThunk < pModPe->cbImage, VERR_BAD_EXE_FORMAT);
     626        AssertReturn(pImps->u.OriginalFirstThunk < pModPe->cbImage, VERR_BAD_EXE_FORMAT);
     627
    624628        Log3(("RTLdrPE: Import descriptor: %s\n", pszModName));
    625629        Log4(("RTLdrPE:   OriginalFirstThunk = %#RX32\n"
     
    634638         * Walk the thunks table(s).
    635639         */
    636         pFirstThunk = PE_RVA2TYPE(pvBitsW, pImps->FirstThunk, PIMAGE_THUNK_DATA32);
    637         pThunk = pImps->u.OriginalFirstThunk == 0
    638             ? PE_RVA2TYPE(pvBitsR, pImps->FirstThunk, PIMAGE_THUNK_DATA32)
    639             : PE_RVA2TYPE(pvBitsR, pImps->u.OriginalFirstThunk, PIMAGE_THUNK_DATA32);
     640        PIMAGE_THUNK_DATA32 pFirstThunk = PE_RVA2TYPE(pvBitsW, pImps->FirstThunk, PIMAGE_THUNK_DATA32); /* update this. */
     641        PIMAGE_THUNK_DATA32 pThunk      = pImps->u.OriginalFirstThunk == 0                              /* read from this. */
     642                                        ? PE_RVA2TYPE(pvBitsR, pImps->FirstThunk, PIMAGE_THUNK_DATA32)
     643                                        : PE_RVA2TYPE(pvBitsR, pImps->u.OriginalFirstThunk, PIMAGE_THUNK_DATA32);
    640644        while (!rc && pThunk->u1.Ordinal != 0)
    641645        {
     
    694698         pImps++)
    695699    {
    696         const char *        pszModName = PE_RVA2TYPE(pvBitsR, pImps->Name, const char *);
    697         PIMAGE_THUNK_DATA64 pFirstThunk;    /* update this. */
    698         PIMAGE_THUNK_DATA64 pThunk;         /* read from this. */
     700        AssertReturn(pImps->Name < pModPe->cbImage, VERR_BAD_EXE_FORMAT);
     701        const char *pszModName = PE_RVA2TYPE(pvBitsR, pImps->Name, const char *);
     702        AssertReturn(pImps->FirstThunk < pModPe->cbImage, VERR_BAD_EXE_FORMAT);
     703        AssertReturn(pImps->u.OriginalFirstThunk < pModPe->cbImage, VERR_BAD_EXE_FORMAT);
     704
    699705        Log3(("RTLdrPE: Import descriptor: %s\n", pszModName));
    700706        Log4(("RTLdrPE:   OriginalFirstThunk = %#RX32\n"
     
    709715         * Walk the thunks table(s).
    710716         */
    711         pFirstThunk = PE_RVA2TYPE(pvBitsW, pImps->FirstThunk, PIMAGE_THUNK_DATA64);
    712         pThunk = pImps->u.OriginalFirstThunk == 0
    713             ? PE_RVA2TYPE(pvBitsR, pImps->FirstThunk, PIMAGE_THUNK_DATA64)
    714             : PE_RVA2TYPE(pvBitsR, pImps->u.OriginalFirstThunk, PIMAGE_THUNK_DATA64);
     717        PIMAGE_THUNK_DATA64 pFirstThunk = PE_RVA2TYPE(pvBitsW, pImps->FirstThunk, PIMAGE_THUNK_DATA64); /* update this. */
     718        PIMAGE_THUNK_DATA64 pThunk      = pImps->u.OriginalFirstThunk == 0                              /* read from this. */
     719                                        ? PE_RVA2TYPE(pvBitsR, pImps->FirstThunk, PIMAGE_THUNK_DATA64)
     720                                        : PE_RVA2TYPE(pvBitsR, pImps->u.OriginalFirstThunk, PIMAGE_THUNK_DATA64);
    715721        while (!rc && pThunk->u1.Ordinal != 0)
    716722        {
     
    17291735}
    17301736
     1737
     1738/**
     1739 * Worker for rtLdrPE_QueryProp and rtLdrPE_QueryImportModule that counts the
     1740 * number of imports, storing the result in RTLDRMODPE::cImports.
     1741 *
     1742 * @returns IPRT status code.
     1743 * @param   pThis           The PE module instance.
     1744 * @param   pvBits          Image bits if the caller had them available, NULL if
     1745 *                          not. Saves a couple of file accesses.
     1746 */
     1747static int rtLdrPE_CountImports(PRTLDRMODPE pThis, void const *pvBits)
     1748{
     1749    PCIMAGE_IMPORT_DESCRIPTOR paImpDescs;
     1750    int rc = rtldrPEReadPartByRva(pThis, pvBits, pThis->ImportDir.VirtualAddress, pThis->ImportDir.Size,
     1751                                  (void const **)&paImpDescs);
     1752    if (RT_SUCCESS(rc))
     1753    {
     1754        uint32_t const cMax = pThis->ImportDir.Size / sizeof(IMAGE_IMPORT_DESCRIPTOR);
     1755        uint32_t       i = 0;
     1756        while (   i < cMax
     1757               && paImpDescs[i].Name > pThis->offNtHdrs
     1758               && paImpDescs[i].Name < pThis->cbImage
     1759               && paImpDescs[i].FirstThunk > pThis->offNtHdrs
     1760               && paImpDescs[i].FirstThunk < pThis->cbImage)
     1761            i++;
     1762        pThis->cImports = i;
     1763
     1764        rtldrPEFreePart(pThis, pvBits, paImpDescs);
     1765    }
     1766    return rc;
     1767}
     1768
     1769
    17311770/**
    17321771 * Worker for rtLdrPE_QueryProp that retrievs the name of an import DLL.
     
    17471786{
    17481787    /*
     1788     * Make sure we got the import count.
     1789     */
     1790    int rc;
     1791    if (pThis->cImports == UINT32_MAX)
     1792    {
     1793        rc = rtLdrPE_CountImports(pThis, pvBits);
     1794        if (RT_FAILURE(rc))
     1795            return rc;
     1796    }
     1797
     1798    /*
    17491799     * Check the index first, converting it to an RVA.
    17501800     */
    1751     int rc;
    1752     if (iImport < pThis->ImportDir.Size / sizeof(IMAGE_IMPORT_DESCRIPTOR))
     1801    if (iImport < pThis->cImports)
    17531802    {
    17541803        uint32_t offEntry = iImport * sizeof(IMAGE_IMPORT_DESCRIPTOR) + pThis->ImportDir.VirtualAddress;
     
    18661915            Assert(cbBuf == sizeof(uint32_t));
    18671916            Assert(*pcbRet == cbBuf);
    1868             *(uint32_t *)pvBuf = pModPe->ImportDir.Size / sizeof(IMAGE_IMPORT_DESCRIPTOR);
    1869             if (*(uint32_t *)pvBuf > 0)
    1870                 *(uint32_t *)pvBuf -= 1; /* The last entry is a NULL entry. */
    1871             /** @todo Is there some linkers out there that doesn't generiate a
    1872              *        terminator entry? */
     1917            if (pModPe->cImports == UINT32_MAX)
     1918            {
     1919                int rc = rtLdrPE_CountImports(pModPe, pvBits);
     1920                if (RT_FAILURE(rc))
     1921                    return rc;
     1922            }
     1923            *(uint32_t *)pvBuf = pModPe->cImports;
    18731924            break;
     1925
    18741926
    18751927        case RTLDRPROP_IMPORT_MODULE:
     
    36293681                pModPe->cbHeaders     = OptHdr.SizeOfHeaders;
    36303682                pModPe->uTimestamp    = FileHdr.TimeDateStamp;
     3683                pModPe->cImports      = UINT32_MAX;
    36313684                pModPe->f64Bit        = FileHdr.SizeOfOptionalHeader == sizeof(OptHdr);
    36323685                pModPe->ImportDir     = OptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette