Ejemplo n.º 1
0
        public ProgramResourceInstance ReadResourceEntry(
            EndianImageReader rdr,
            string resourceId,
            string sLcid,
            ResourceType resourceType)
        {
            var rvaData    = rdr.ReadUInt32();
            var size       = rdr.ReadUInt32();
            var codepage   = rdr.ReadInt32();
            var padding    = rdr.ReadUInt32();
            var abResource = new byte[size];

            Array.Copy(imgLoaded.Bytes, (int)rvaData, abResource, 0, abResource.Length);

            if (resourceType == PeResourceType.BITMAP)
            {
                abResource = PostProcessBitmap(abResource);
            }

            string?encodingName = GetEncodingName(codepage);
            string?langTag      = GetLanguageTag(sLcid);

            return(new ProgramResourceInstance
            {
                Name = $"{resourceId}-{langTag}",
                Type = resourceType.Name,
                TextEncoding = encodingName,
                FileExtension = resourceType.FileExtension,
                Bytes = abResource,
            });
        }
Ejemplo n.º 2
0
        public void VisitPointer(Pointer ptr)
        {
            switch (ptr.Size)
            {
            case 2:
                fmt.WriteKeyword("dw");
                fmt.Write("\t");
                fmt.Write(string.Format("0x{0:X4}", rdr.ReadByte()));
                fmt.WriteLine();
                return;

            case 4:
                fmt.WriteKeyword("dd");
                fmt.Write("\t");
                fmt.Write(string.Format("0x{0:X8}", rdr.ReadUInt32()));
                fmt.WriteLine();
                return;

            case 8:
                fmt.WriteKeyword("dq");
                fmt.Write("\t");
                fmt.Write(string.Format("0x{0:X16}", rdr.ReadUInt64()));
                fmt.WriteLine();
                return;
            }
        }
Ejemplo n.º 3
0
        public static Elf32_Rel Read(EndianImageReader rdr)
        {
            var o = rdr.ReadUInt32();
            var i = rdr.ReadUInt32();

            return(new Elf32_Rel
            {
                r_offset = o,
                r_info = i,
            });
        }
Ejemplo n.º 4
0
        public static Elf32_Sym Load(EndianImageReader rdr)
        {
            var sym = new Elf32_Sym();

            sym.st_name  = rdr.ReadUInt32();
            sym.st_value = rdr.ReadUInt32();
            sym.st_size  = rdr.ReadUInt32();
            sym.st_info  = rdr.ReadByte();
            sym.st_other = rdr.ReadByte();
            sym.st_shndx = rdr.ReadUInt16();
            return(sym);
        }
Ejemplo n.º 5
0
        public static Elf32_Rela Read(EndianImageReader rdr)
        {
            var o = rdr.ReadUInt32();
            var i = rdr.ReadUInt32();
            var a = rdr.ReadInt32();

            return(new Elf32_Rela
            {
                r_offset = o,
                r_info = i,
                r_addend = a
            });
        }
Ejemplo n.º 6
0
        public static Elf64_PHdr Load(EndianImageReader rdr)
        {
            var hdr = new Elf64_PHdr
            {
                p_type   = (ProgramHeaderType)rdr.ReadUInt32(),
                p_flags  = rdr.ReadUInt32(),
                p_offset = rdr.ReadUInt64(),
                p_vaddr  = rdr.ReadUInt64(),
                p_paddr  = rdr.ReadUInt64(),
                p_filesz = rdr.ReadUInt64(),
                p_pmemsz = rdr.ReadUInt64(),
                p_align  = rdr.ReadUInt64(),
            };

            return(hdr);
        }
Ejemplo n.º 7
0
 public static Elf64_SHdr Load(EndianImageReader rdr)
 {
     return(new Elf64_SHdr
     {
         sh_name = rdr.ReadUInt32(),
         sh_type = (SectionHeaderType)rdr.ReadUInt32(),
         sh_flags = rdr.ReadUInt64(),
         sh_addr = rdr.ReadUInt64(),        // Address
         sh_offset = rdr.ReadUInt64(),
         sh_size = rdr.ReadUInt64(),
         sh_link = rdr.ReadUInt32(),
         sh_info = rdr.ReadUInt32(),
         sh_addralign = rdr.ReadUInt64(),
         sh_entsize = rdr.ReadUInt64(),
     });
 }
Ejemplo n.º 8
0
        public List <ProgramResource> ReadLanguageDirectory(EndianImageReader rdr, uint resourceType, string resourceId)
        {
            const uint DIR_MASK     = 0x80000000;
            var        flags        = rdr.ReadUInt32();
            var        date         = rdr.ReadUInt32();
            var        version      = rdr.ReadUInt32();
            var        cNameEntries = rdr.ReadUInt16();
            var        cIdEntries   = rdr.ReadUInt16();
            var        entries      = new List <ProgramResource>();

            for (int i = 0; i < cNameEntries; ++i)
            {
                var rvaName  = rdr.ReadUInt32();
                var rvaEntry = rdr.ReadUInt32();
                var subRdr   = new LeImageReader(imgLoaded, rvaResources + (rvaEntry & ~DIR_MASK));
                if ((rvaEntry & DIR_MASK) != 0)
                {
                    throw new BadImageFormatException();
                }
                entries.Add(ReadResourceEntry(subRdr, resourceId, ReadResourceString(rvaName), resourceType));
            }
            for (int i = 0; i < cIdEntries; ++i)
            {
                var id       = rdr.ReadUInt32();
                var rvaEntry = rdr.ReadUInt32();
                var subRdr   = new LeImageReader(imgLoaded, rvaResources + (rvaEntry & ~DIR_MASK));
                if ((rvaEntry & DIR_MASK) != 0)
                {
                    throw new BadImageFormatException();
                }
                entries.Add(ReadResourceEntry(subRdr, resourceId, id.ToString(), resourceType));
            }
            return(entries);
        }
Ejemplo n.º 9
0
        public ushort e_shstrndx;       // section name string table index

        public static Elf32_EHdr Load(EndianImageReader rdr)
        {
            return(new Elf32_EHdr
            {
                e_type = rdr.ReadUInt16(),
                e_machine = rdr.ReadUInt16(),
                e_version = rdr.ReadUInt32(),
                e_entry = rdr.ReadUInt32(),
                e_phoff = rdr.ReadUInt32(),
                e_shoff = rdr.ReadUInt32(),
                e_flags = rdr.ReadUInt32(),
                e_ehsize = rdr.ReadUInt16(),
                e_phentsize = rdr.ReadUInt16(),
                e_phnum = rdr.ReadUInt16(),
                e_shentsize = rdr.ReadUInt16(),
                e_shnum = rdr.ReadUInt16(),
                e_shstrndx = rdr.ReadUInt16(),
            });
        }
Ejemplo n.º 10
0
 public static Elf32_SHdr Load(EndianImageReader rdr)
 {
     try
     {
         return(new Elf32_SHdr
         {
             sh_name = rdr.ReadUInt32(),
             sh_type = (SectionHeaderType)rdr.ReadUInt32(),
             sh_flags = rdr.ReadUInt32(),
             sh_addr = rdr.ReadUInt32(),        // Address
             sh_offset = rdr.ReadUInt32(),
             sh_size = rdr.ReadUInt32(),
             sh_link = rdr.ReadUInt32(),
             sh_info = rdr.ReadUInt32(),
             sh_addralign = rdr.ReadUInt32(),
             sh_entsize = rdr.ReadUInt32(),
         });
     } catch
     {
         //$TODO: report error?
         return(null);
     }
 }
Ejemplo n.º 11
0
        public ProgramResourceInstance ReadResourceEntry(EndianImageReader rdr, string resourceId, string langId, uint resourceType)
        {
            var rvaData    = rdr.ReadUInt32();
            var size       = rdr.ReadUInt32();
            var codepage   = rdr.ReadUInt32();
            var padding    = rdr.ReadUInt32();
            var abResource = new byte[size];

            Array.Copy(imgLoaded.Bytes, (int)rvaData, abResource, 0, abResource.Length);

            if (resourceType == RT_BITMAP)
            {
                abResource = PostProcessBitmap(abResource);
            }

            string localeName = GetLocaleName(langId);

            return(new ProgramResourceInstance
            {
                Name = string.Format("{0}:{1}", resourceId, localeName),
                Type = GetResourceType(resourceType),
                Bytes = abResource,
            });
        }
Ejemplo n.º 12
0
        void ParseFunctionStarts(EndianImageReader rdr)
        {
            if (!rdr.TryReadUInt32(out uint dataoff) ||
                !rdr.TryReadUInt32(out uint datasize))
            {
                throw new BadImageFormatException("Couldn't read LC_FUNCTIONSTARTS command");
            }
            Debug.Print(" LC_FUNCTIONSTARTS {0:X8} {1:X8}", dataoff, datasize);
            rdr.Offset = dataoff;
            var endoff = dataoff + datasize;

            while (rdr.Offset < endoff)
            {
                uint fn = rdr.ReadUInt32();
                Debug.Print("  fn: {0:X}", fn);
            }
        }
Ejemplo n.º 13
0
        public List <ProgramResource> ReadResourceDirectory(EndianImageReader rdr)
        {
            const uint DIR_MASK     = 0x80000000;
            var        flags        = rdr.ReadUInt32();
            var        date         = rdr.ReadUInt32();
            var        version      = rdr.ReadUInt32();
            var        cNameEntries = rdr.ReadUInt16();
            var        cIdEntries   = rdr.ReadUInt16();
            var        entries      = new List <ProgramResource>();

            for (int i = 0; i < cNameEntries; ++i)
            {
                var rvaName  = rdr.ReadUInt32();
                var rvaEntry = rdr.ReadUInt32();
                var subRdr   = new LeImageReader(imgLoaded, rvaResources + (rvaEntry & ~DIR_MASK));
                if ((rvaEntry & DIR_MASK) == 0)
                {
                    throw new BadImageFormatException();
                }
                if ((rvaName & DIR_MASK) != 0)
                {
                    var e = new ProgramResourceGroup
                    {
                        //Name = ReadResourceString(rvaName),
                        Name = ReadResourceUtf16leString(rvaResources + (rvaName & ~DIR_MASK)),
                    };
                    e.Resources.AddRange(ReadNameDirectory(subRdr, 0));
                    entries.Add(e);
                }
            }
            for (int i = 0; i < cIdEntries; ++i)
            {
                var id       = rdr.ReadUInt32();
                var rvaEntry = rdr.ReadUInt32();
                var subRdr   = new LeImageReader(imgLoaded, rvaResources + (rvaEntry & ~DIR_MASK));
                if ((rvaEntry & DIR_MASK) == 0)
                {
                    throw new BadImageFormatException();
                }
                var e = new ProgramResourceGroup
                {
                    Name = GenerateResourceName(id),
                };
                e.Resources.AddRange(ReadNameDirectory(subRdr, id));
                entries.Add(e);
            }
            return(entries);
        }
Ejemplo n.º 14
0
        /// <summary>
        /// Reads a resource directory, starting at the position of the given image
        /// reader.
        /// </summary>
        /// <param name="rdr">A little endian <see cref="EndianImageReader"/>.</param>
        /// <returns>A list of the resources found in the directory.</returns>
        public List <ProgramResource> ReadResourceDirectory(EndianImageReader rdr)
        {
            const uint DIR_MASK     = 0x80000000;
            var        flags        = rdr.ReadUInt32();
            var        date         = rdr.ReadUInt32();
            var        version      = rdr.ReadUInt32();
            var        cNameEntries = rdr.ReadUInt16();
            var        cIdEntries   = rdr.ReadUInt16();
            var        entries      = new List <ProgramResource>();

            // Read the named entries.
            for (int i = 0; i < cNameEntries; ++i)
            {
                var rvaName  = rdr.ReadUInt32();
                var rvaEntry = rdr.ReadUInt32();
                var subRdr   = new LeImageReader(imgLoaded, rvaResources + (rvaEntry & ~DIR_MASK));
                if ((rvaEntry & DIR_MASK) == 0)
                {
                    throw new BadImageFormatException();
                }
                if ((rvaName & DIR_MASK) != 0)
                {
                    var e = new ProgramResourceGroup
                    {
                        //Name = ReadResourceString(rvaName),
                        Name = ReadResourceUtf16leString(rvaResources + (rvaName & ~DIR_MASK)),
                    };
                    e.Resources.AddRange(ReadNameDirectory(subRdr, PeResourceType.FromInt(0)));
                    entries.Add(e);
                }
            }
            // Read the entries accessed by numeric ID.
            for (int i = 0; i < cIdEntries; ++i)
            {
                var id       = rdr.ReadInt32();
                var rvaEntry = rdr.ReadUInt32();
                var subRdr   = new LeImageReader(imgLoaded, rvaResources + (rvaEntry & ~DIR_MASK));
                if ((rvaEntry & DIR_MASK) == 0)
                {
                    throw new BadImageFormatException();
                }
                var rt = PeResourceType.FromInt(id);
                var e  = new ProgramResourceGroup
                {
                    Name = rt.Name
                };
                e.Resources.AddRange(ReadNameDirectory(subRdr, rt));
                entries.Add(e);
            }
            return(entries);
        }
Ejemplo n.º 15
0
        public void Sift_32Bit()
        {
            var writer = arch.CreateImageWriter(mem, mem.BaseAddress);

            while (DecrementCount())
            {
                var instr = Dasm();
                processInstr(mem.Bytes, instr);

                rdr.Offset = 0;
                var val = rdr.ReadUInt32(0);
                if (val == 0xFFFFFFFFu)
                {
                    break;
                }
                ++val;
                writer.Position = 0;
                writer.WriteUInt32(val);
            }
        }
Ejemplo n.º 16
0
        public override PowerPcInstruction DisassembleInstruction()
        {
            if (!rdr.IsValid)
            {
                return(null);
            }
            this.addr = rdr.Address;
            uint wInstr = rdr.ReadUInt32();

            try
            {
                instrCur = primaryDecoders[wInstr >> 26].Decode(this, wInstr);
            }
            catch
            {
                instrCur = new PowerPcInstruction(Opcode.illegal);
            }
            instrCur.Address = addr;
            instrCur.Length  = 4;
            return(instrCur);
        }
Ejemplo n.º 17
0
        public override ProcedureBase GetTrampolineDestination(EndianImageReader rdr, IRewriterHost host)
        {
            var dasm = new PowerPcDisassembler(
                (PowerPcArchitecture64)Architecture,
                rdr,
                PrimitiveType.Word64);
            PowerPcInstruction instr;
            ImmediateOperand   immOp;
            MemoryOperand      memOp;

            //addi r12,r0,0000
            instr = dasm.DisassembleInstruction();
            if (instr.Opcode != Opcode.addi)
            {
                return(null);
            }

            //oris r12,r12,0006
            instr = dasm.DisassembleInstruction();
            if (instr.Opcode != Opcode.oris)
            {
                return(null);
            }
            immOp = (ImmediateOperand)instr.op3;
            uint aFuncDesc = immOp.Value.ToUInt32() << 16;

            //lwz r12,nnnn(r12)
            instr = dasm.DisassembleInstruction();
            if (instr.Opcode != Opcode.lwz)
            {
                return(null);
            }
            memOp = (MemoryOperand)instr.op2;
            int offset = memOp.Offset.ToInt32();

            aFuncDesc = (uint)(aFuncDesc + offset);

            //std r2,40(r1)
            instr = dasm.DisassembleInstruction();
            if (instr.Opcode != Opcode.std)
            {
                return(null);
            }

            //lwz r0,0(r12)
            // Have a pointer to a trampoline
            instr = dasm.DisassembleInstruction();
            if (instr.Opcode != Opcode.lwz)
            {
                return(null);
            }

            //lwz r2,4(r12)
            instr = dasm.DisassembleInstruction();
            if (instr.Opcode != Opcode.lwz)
            {
                return(null);
            }

            // mtctr r0
            instr = dasm.DisassembleInstruction();
            if (instr.Opcode != Opcode.mtctr)
            {
                return(null);
            }

            // bcctr 14,00
            instr = dasm.DisassembleInstruction();
            if (instr.Opcode != Opcode.bcctr)
            {
                return(null);
            }

            // Read the function pointer from the function descriptor.

            offset     = (int)aFuncDesc - (int)rdr.Address.ToUInt32();
            rdr.Offset = rdr.Offset + offset;
            var aFn = rdr.ReadUInt32();

            return(null);
        }