Ignore:
Timestamp:
Oct 2, 2000, 6:01:40 AM (25 years ago)
Author:
bird
Message:

Added some limited dump capabilities for PE executables.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/common/kFilePE.cpp

    r824 r4358  
    3434#include <assert.h>
    3535#include <peexe.h>
     36#include "kFile.h"
    3637#include "kFileFormatBase.h"
    3738#include "kFilePe.h"
     
    4546kFilePE::kFilePE(FILE *phFile) throw(int) : pvBase(NULL),
    4647    pDosHdr(NULL), pFileHdr(NULL), pOptHdr(NULL), paDataDir(NULL), paSectionHdr(NULL),
    47     pExportDir(NULL)
     48    pExportDir(NULL),
     49    pImportDir(NULL),
     50    pRsrcDir(NULL),
     51    pBRelocDir(NULL),
     52    pDebugDir(NULL),
     53    pCopyright(NULL),
     54    pulGlobalPtr(NULL),
     55    pTLSDir(NULL),
     56    pLoadConfigDir(NULL),
     57    pBoundImportDir(NULL),
     58    pIATDir(NULL),
     59    pDelayImportDir(NULL)
    4860{
    4961    IMAGE_DOS_HEADER doshdr;
     
    93105
    94106                        cbSection = min(pSectionHdr->Misc.VirtualSize, pSectionHdr->SizeOfRawData);
    95                         if (fseek(phFile, pSectionHdr->PointerToRawData, SEEK_SET)
    96                             ||
    97                             fread((void*)((ULONG)pvBase + pSectionHdr->VirtualAddress), (size_t)cbSection, 1, phFile) != 1
     107                        if (cbSection
     108                            &&
     109                             (fseek(phFile, pSectionHdr->PointerToRawData, SEEK_SET)
     110                             ||
     111                             fread((void*)((ULONG)pvBase + pSectionHdr->VirtualAddress), (size_t)cbSection, 1, phFile) != 1
     112                             )
    98113                            )
    99114                        {
     
    120135                                                           pOptHdr->NumberOfRvaAndSizes*sizeof(*paDataDir));
    121136
    122                     if (paDataDir[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress)
    123                         pExportDir = (PIMAGE_EXPORT_DIRECTORY)((int)pvBase + paDataDir[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
     137                    //if (paDataDir[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress)
     138                    //    pExportDir = (PIMAGE_EXPORT_DIRECTORY)((int)pvBase + paDataDir[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
     139                    for (i = 0; i < pOptHdr->NumberOfRvaAndSizes && i < 16; i++)
     140                    {
     141                        if (paDataDir[i].VirtualAddress != 0)
     142                        {
     143                            if (paDataDir[i].VirtualAddress < pOptHdr->SizeOfImage)
     144                                ((PULONG)&this->pExportDir)[i] = (int)pvBase + paDataDir[i].VirtualAddress;
     145                            #ifdef DEBUG
     146                            else
     147                                fprintf(stderr, "bad directory pointer %d\n", i);
     148                            #endif
     149                        }
     150                    }
    124151                }
    125152                else
     
    227254
    228255
     256/**
     257 * Mini dump function.
     258 */
     259BOOL  kFilePE::dump(kFile *pOut)
     260{
     261    int i,j,k;
     262    int c;
     263
     264    /*
     265     * Dump sections.
     266     */
     267    pOut->printf("Sections\n"
     268                 "--------\n");
     269    for (i = 0; i < pFileHdr->NumberOfSections; i++)
     270    {
     271        pOut->printf("%2d  %-8.8s  VirtSize: 0x%08x  RVA: 0x%08x\n"
     272                     "    RawSize:  0x%08x  FileOffset: 0x%08x\n"
     273                     "    #Relocs:  0x%08x  FileOffset: 0x%08x\n"
     274                     "    #LineNbr: 0x%08x  FileOffset: 0x%08x\n"
     275                     "    Characteristics: 0x%08x\n",
     276                     i,
     277                     paSectionHdr[i].Name,
     278                     paSectionHdr[i].Misc.VirtualSize,
     279                     paSectionHdr[i].VirtualAddress,
     280                     paSectionHdr[i].PointerToRawData,
     281                     paSectionHdr[i].PointerToRawData,
     282                     paSectionHdr[i].NumberOfRelocations,
     283                     paSectionHdr[i].PointerToRelocations,
     284                     paSectionHdr[i].NumberOfLinenumbers,
     285                     paSectionHdr[i].PointerToLinenumbers,
     286                     paSectionHdr[i].Characteristics
     287                     );
     288
     289    }
     290
     291
     292    /*
     293     * Dump the directories.
     294     */
     295    pOut->printf("Data Directory\n"
     296                 "--------------\n");
     297    for (i = 0; i < pOptHdr->NumberOfRvaAndSizes; i++)
     298    {
     299        static const char * apszDirectoryNames[] =
     300        {
     301            "Export",
     302            "Import",
     303            "Resource",
     304            "Exception",
     305            "Security",
     306            "Base Reloc",
     307            "Debug",
     308            "Copyright",
     309            "Global Ptr",
     310            "TLS",
     311            "Load Config",
     312            "Bound Import",
     313            "IAT",
     314            "Delay Import",
     315            "COM Descriptor",
     316            "unknown",
     317            "unknown"
     318        };
     319
     320        pOut->printf("%2d  %-16s  Size: 0x%08x  RVA: 0x%08x\n",
     321                     i,
     322                     apszDirectoryNames[i],
     323                     pOptHdr->DataDirectory[i].Size,
     324                     pOptHdr->DataDirectory[i].VirtualAddress);
     325    }
     326    pOut->printf("\n");
     327
     328
     329    /*
     330     * Dump TLS directory if present
     331     */
     332    if (pTLSDir)
     333    {
     334        pOut->printf("TLS Directory\n"
     335                     "-------------\n");
     336        if (pOptHdr->DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS].Size % sizeof(IMAGE_TLS_DIRECTORY))
     337            pOut->printf(" Warning! The size directory isn't a multiple of the directory struct!");
     338
     339        c = (int)(pOptHdr->DataDirectory[IMAGE_DIRECTORY_ENTRY_TLS].Size / sizeof(IMAGE_TLS_DIRECTORY));
     340        for (i = 0; i < c; i++)
     341        {
     342
     343            pOut->printf("%2d  StartAddressOfRawData %p\n"
     344                         "    EndAddressOfRawData   %p\n"
     345                         "    AddressOfIndex        %p\n"
     346                         "    AddressOfCallBacks    %p\n"
     347                         "    SizeOfZeroFill        %p\n"
     348                         "    Characteristics       %p\n",
     349                         i,
     350                         pTLSDir[i].StartAddressOfRawData,
     351                         pTLSDir[i].EndAddressOfRawData,
     352                         pTLSDir[i].AddressOfIndex,
     353                         pTLSDir[i].AddressOfCallBacks,
     354                         pTLSDir[i].SizeOfZeroFill,
     355                         pTLSDir[i].Characteristics);
     356
     357            /* Print Callbacks */
     358            if (pTLSDir[i].AddressOfCallBacks)
     359            {
     360                PULONG  paulIndex;
     361                PULONG  paulCallback;
     362                ULONG   ulBorlandRVAFix = 0UL;
     363
     364                /* Check if the addresses in the TLSDir is RVAs or real addresses */
     365                if (pTLSDir[i].StartAddressOfRawData > pOptHdr->ImageBase)
     366                    ulBorlandRVAFix = pOptHdr->ImageBase;
     367
     368                j = 0;
     369                paulIndex    = (PULONG)((ULONG)pTLSDir[i].AddressOfIndex - ulBorlandRVAFix + (ULONG)this->pvBase);
     370                paulCallback = (PULONG)((ULONG)pTLSDir[i].AddressOfCallBacks - ulBorlandRVAFix + (ULONG)this->pvBase);
     371                if (*paulCallback)
     372                {
     373                    pOut->printf("    Callbacks:\n");
     374                    for (j = 0; paulCallback[j] != 0; j++)
     375                    {
     376                        pOut->printf("      %02d  Address: 0x%08x  Index: 0x%08x\n",
     377                                     paulIndex[j],
     378                                     paulCallback[j]);
     379                    }
     380                }
     381                else
     382                    pOut->printf("    (Empty callback array!)\n");
     383            }
     384
     385        }
     386
     387        pOut->printf("\n");
     388    }
     389
     390
     391    return TRUE;
     392}
     393
Note: See TracChangeset for help on using the changeset viewer.