Esempio n. 1
0
        //recursively descend through resource directory structure
        //resource directories are 3 levels deep by Microsoft convention:
        //level 1 : resource type
        //level 2 : resource name str/id num
        //level 3 : language (aka code page)
        private void parseResourceDirectory(SourceFile source, int level)
        {
            //parse IMAGE_RESOURCE_DIRECTORY
            uint characteristics      = source.getFour(); //unused
            uint timeDateStamp        = source.getFour();
            uint majorVersion         = source.getTwo();
            uint minorVersion         = source.getTwo();
            uint numberOfNamedEntries = source.getTwo();
            uint numberOfIdEntries    = source.getTwo();
            int  entryCount           = (int)(numberOfNamedEntries + numberOfIdEntries);

            for (int i = 0; i < entryCount; i++)
            {
                uint idName = source.getFour();         //either numeric val or a ptr to name str
                uint data   = source.getFour();         //either ptr to subdir or a leaf node
                resIdNameValues[level] = idName;        //store id/name val at this level

                uint curPos  = source.getPos();         //save cur pos in resource directory
                uint dataPos = (data & 0x7FFFFFFF);
                source.seek(dataPos);                   //goto leaf/subtree data

                if (data < 0x80000000)                  //high bit not set -> data points to leaf node
                {
                    parseResourceData(source);
                }
                else
                {                                                       //high bit is set -> data points to subtree
                    parseResourceDirectory(source, level + 1);          //recurse next subtree
                }

                source.seek(curPos);        //ret to pos in resource directory
            }
        }
Esempio n. 2
0
        static public DataDirectory readDataDirectory(SourceFile source)
        {
            uint rva  = source.getFour();
            uint size = source.getFour();

            return(new DataDirectory(rva, size));
        }
Esempio n. 3
0
//- reading in ----------------------------------------------------------------

        public void readCoffHeader(SourceFile source)
        {
            machine         = (int)source.getTwo();
            sectionCount    = (int)source.getTwo();
            timeStamp       = source.getFour();
            symbolTblAddr   = source.getFour();
            symbolCount     = source.getFour();
            optionalHdrSize = (int)source.getTwo();
            characteristics = (int)source.getTwo();
        }
Esempio n. 4
0
        public void loadStringTable(SourceFile source)
        {
            uint pos = symbolTblAddr + (symbolCount * 0x12);

            source.seek(pos);
            uint len = source.getFour() - 4;

            byte[] data = source.getRange(len);
            String str  = "";
            int    idx  = 4;

            for (int i = 0; i < len; i++)
            {
                if (data[i] != 0)
                {
                    str += (char)data[i];
                }
                else
                {
                    stringTbl.Add(idx, str);
                    str = "";
                    idx = i + 5;
                }
            }
        }
Esempio n. 5
0
        static public MsDosHeader readMSDOSHeader(SourceFile source)
        {
            MsDosHeader dosHeader = new MsDosHeader();

            dosHeader.signature = source.getTwo();
            if (dosHeader.signature != 0x5a4d)
            {
                throw new Win32ReadException("this is not a valid win32 executable file");
            }

            dosHeader.lastsize  = source.getTwo();
            dosHeader.nblocks   = source.getTwo();
            dosHeader.nreloc    = source.getTwo();
            dosHeader.hdrsize   = source.getTwo();
            dosHeader.minalloc  = source.getTwo();
            dosHeader.maxalloc  = source.getTwo();
            dosHeader.ss        = source.getTwo();
            dosHeader.sp        = source.getTwo();
            dosHeader.checksum  = source.getTwo();
            dosHeader.ip        = source.getTwo();
            dosHeader.cs        = source.getTwo();
            dosHeader.relocpos  = source.getTwo();
            dosHeader.noverlay  = source.getTwo();
            dosHeader.reserved1 = source.getRange(8);
            dosHeader.oem_id    = source.getTwo();
            dosHeader.oem_info  = source.getTwo();
            dosHeader.reserved2 = source.getRange(20);
            dosHeader.e_lfanew  = source.getFour();

            return(dosHeader);
        }
Esempio n. 6
0
        public static ResImageGroupDataEntry parseData(SourceFile src)
        {
            ResImageGroupDataEntry cgdata = new ResImageGroupDataEntry();

            cgdata.bWidth      = src.getOne();
            cgdata.bHeight     = src.getOne();
            cgdata.bColorCount = src.getOne();
            uint res = src.getOne();

            cgdata.wPlanes      = src.getTwo();
            cgdata.wBitCount    = src.getTwo();
            cgdata.dwBytesInRes = src.getFour();
            cgdata.nID          = src.getTwo();
            cgdata.image        = null;
            return(cgdata);
        }
Esempio n. 7
0
//- reading in ----------------------------------------------------------------

        public static Section loadSection(SourceFile source)
        {
            Section section = new Section();

            section.secName = source.getAsciiString(8);

            section.memsize  = source.getFour();
            section.memloc   = source.getFour();
            section.filesize = source.getFour();
            section.fileloc  = source.getFour();

            section.pRelocations = source.getFour();
            section.pLinenums    = source.getFour();
            section.relocCount   = (int)source.getTwo();
            section.linenumCount = (int)source.getTwo();
            section.flags        = source.getFour();
            section.data         = source.getRange(section.fileloc, section.filesize);  //load section data

            return(section);
        }
Esempio n. 8
0
//- reading in ----------------------------------------------------------------

        public void readFile(String _filename)
        {
            filename = _filename;

            SourceFile source = new SourceFile(filename);

            dosHeader = MsDosHeader.readMSDOSHeader(source);
            source.seek(dosHeader.e_lfanew);
            uint pesig = source.getFour();

            if (pesig != 0x00004550)
            {
                throw new Win32ReadException("this is not a valid win32 executable file");
            }

            readCoffHeader(source);
            readOptionalHeader(source);
            loadSections(source);
            foreach (Section section in sections)
            {
                section.imageBase = imageBase;          //sections in exe/dll have an image base
            }
            //getResourceTable(source);
        }
Esempio n. 9
0
        private void readOptionalHeader(SourceFile source)
        {
            magicNum                = source.getTwo();
            majorLinkerVersion      = source.getOne();
            minorLinkerVersion      = source.getOne();
            sizeOfCode              = source.getFour();
            sizeOfInitializedData   = source.getFour();
            sizeOfUninitializedData = source.getFour();
            addressOfEntryPoint     = source.getFour();
            baseOfCode              = source.getFour();
            baseOfData              = source.getFour();
            imageBase               = source.getFour();
            sectionAlignment        = source.getFour();
            fileAlignment           = source.getFour();
            majorOSVersion          = source.getTwo();
            minorOSVersion          = source.getTwo();
            majorImageVersion       = source.getTwo();
            minorImageVersion       = source.getTwo();
            majorSubsystemVersion   = source.getTwo();
            minorSubsystemVersion   = source.getTwo();
            win32VersionValue       = source.getFour();
            sizeOfImage             = source.getFour();
            sizeOfHeaders           = source.getFour();
            checksum                = source.getFour();
            subsystem               = source.getTwo();
            dLLCharacteristics      = source.getTwo();
            sizeOfStackReserve      = source.getFour();
            sizeOfStackCommit       = source.getFour();
            sizeOfHeapReserve       = source.getFour();
            sizeOfHeapCommit        = source.getFour();
            loaderFlags             = source.getFour();
            numberOfRvaAndSizes     = source.getFour();

            dExportTable            = DataDirectory.readDataDirectory(source);
            dImportTable            = DataDirectory.readDataDirectory(source);
            dResourceTable          = DataDirectory.readDataDirectory(source);
            exceptionTable          = DataDirectory.readDataDirectory(source);
            certificatesTable       = DataDirectory.readDataDirectory(source);
            baseRelocationTable     = DataDirectory.readDataDirectory(source);
            debugTable              = DataDirectory.readDataDirectory(source);
            architecture            = DataDirectory.readDataDirectory(source);
            globalPtr               = DataDirectory.readDataDirectory(source);
            threadLocalStorageTable = DataDirectory.readDataDirectory(source);
            loadConfigurationTable  = DataDirectory.readDataDirectory(source);
            boundImportTable        = DataDirectory.readDataDirectory(source);
            importAddressTable      = DataDirectory.readDataDirectory(source);
            delayImportDescriptor   = DataDirectory.readDataDirectory(source);
            CLRRuntimeHeader        = DataDirectory.readDataDirectory(source);
            reserved = DataDirectory.readDataDirectory(source);
        }
Esempio n. 10
0
        //leaf node of resource directory tree, this rec points to actual data
        private void parseResourceData(SourceFile source)
        {
            uint datapos  = source.getFour();
            uint datasize = source.getFour();
            uint codepage = source.getFour();
            uint reserved = source.getFour();

            datapos -= resourceRVA;
            byte[] resdata = source.getRange(datapos, datasize);        //get resource data

            //get the store type/id/lang vals we stored in our decent to this node
            uint   restype = resIdNameValues[0];
            uint   resid   = resIdNameValues[1];
            String resname = (resid >= 0x80000000) ? getResourceName(source, resid) : null;
            uint   reslang = resIdNameValues[2];

            switch (restype)
            {
            case 1:
                ResData curdata = new ResData(resid, resname, reslang, resdata);
                cursorItems.Add(curdata);
                break;

            case 2:
                Bitmap bmp = ResBitmap.parseData(resdata);
                addBitmap(resid, resname, reslang, bmp);
                getDataItem(bitmaps, resid, resname).getItem(reslang).dataBuf = resdata;
                break;

            case 3:
                ResData icondata = new ResData(resid, resname, reslang, resdata);
                iconItems.Add(icondata);
                break;

            case 4:
                addMenu(resid, resname, reslang, resdata);
                //List<String> menu = ResMenu.parseData(resdata);
                //addMenu(resid, resname, reslang, menu);
                getDataItem(menus, resid, resname).getItem(reslang).dataBuf = resdata;
                break;

            case 5:
                addDialog(resid, resname, reslang, resdata);
                //List<String> dlg = ResDialog.parseData(resdata);
                //addDialog(resid, resname, reslang, dlg);
                getDataItem(dialogs, resid, resname).getItem(reslang).dataBuf = resdata;
                break;

            case 6:
                List <String> strings = ResStringTable.parseData(resdata);
                addStringTable(resid, resname, reslang, strings);
                getDataItem(stringtable, resid, resname).getItem(reslang).dataBuf = resdata;
                break;

            case 7:
                addFontDirectory(resid, resname, reslang, resdata);
                getDataItem(fontDirectories, resid, resname).getItem(reslang).dataBuf = resdata;
                break;

            case 8:
                addFont(resid, resname, reslang, resdata);
                getDataItem(fonts, resid, resname).getItem(reslang).dataBuf = resdata;
                break;

            case 9:
                List <String> accel = ResAccelerator.parseData(resdata);
                addAccelerator(resid, resname, reslang, accel);
                getDataItem(accelerators, resid, resname).getItem(reslang).dataBuf = resdata;
                break;

            case 10:
                addUserData(resid, resname, reslang, resdata);
                getDataItem(userData, resid, resname).getItem(reslang).dataBuf = resdata;
                break;

            case 12:
                ResImageGroupData cg = ResImageGroupData.parseData(resdata);
                addCursorGroup(resid, resname, reslang, cg);
                getDataItem(cursorGroups, resid, resname).getItem(reslang).dataBuf = resdata;
                break;

            case 14:
                ResImageGroupData ig = ResImageGroupData.parseData(resdata);
                addIconGroup(resid, resname, reslang, ig);
                getDataItem(iconGroups, resid, resname).getItem(reslang).dataBuf = resdata;
                break;

            case 16:
                addVersion(resid, resname, reslang, resdata);

                //List<String> version = ResVersion.parseData(resdata);
                //addVersion(resid, resname, reslang, version);
                getDataItem(versions, resid, resname).getItem(reslang).dataBuf = resdata;
                break;

            default:
                addUserData(resid, resname, reslang, resdata);
                getDataItem(userData, resid, resname).getItem(reslang).dataBuf = resdata;
                break;
            }
        }