protected override void SaveInternal(VirtualWriter wtr)
 {
     foreach (RelocationBlock i in bs)
     {
         i.Save(wtr);
     }
 }
예제 #2
0
 internal void Save(VirtualWriter wtr)
 {
     foreach (ushort i in Items)
     {
         wtr.Write(i);
     }
 }
예제 #3
0
 internal void Save(VirtualWriter wtr)
 {
     foreach (string i in Items)
     {
         wtr.Write(i);
     }
 }
예제 #4
0
 internal void Write(VirtualWriter wtr)
 {
     foreach (MetadataToken tkn in Items)
     {
         wtr.Write(tkn);
     }
 }
예제 #5
0
        public void Save(VirtualWriter wtr, Rva adr)
        {
            wtr.SetPosition(adr);
            wtr.Write(sig);
            wtr.Write(maVer);
            wtr.Write(miVer);
            wtr.Write(res);
            wtr.Write((ver.Length + 3) & ~3);
            wtr.Write(Encoding.ASCII.GetBytes(ver));
            wtr.Write(new byte[((ver.Length + 1 + 3) & ~3) - ver.Length]);
            wtr.Write(f);
            wtr.Write((ushort)Items.Count);
            uint datOffset = (uint)(20 + ((ver.Length + 3) & ~3) + this.Count * 8);

            foreach (MetadataStream str in Items)
            {
                datOffset += (uint)((str.Name.Length + 1 + 3) & ~3);
            }
            foreach (MetadataStream str in Items)
            {
                wtr.Write(datOffset);
                datOffset += (uint)((str.Length + 3) & ~3);
                wtr.Write((uint)((str.Length + 3) & ~3));
                wtr.Write(Encoding.ASCII.GetBytes(str.Name));
                wtr.Write(new byte[((str.Name.Length + 1 + 3) & ~3) - str.Name.Length]);
            }
            foreach (MetadataStream str in Items)
            {
                wtr.Write(str.Data);
                wtr.Write(new byte[((str.Length + 3) & ~3) - str.Length]);
            }
        }
예제 #6
0
 internal void Save(VirtualWriter wtr)
 {
     foreach (CLRData i in Items)
     {
         i.Address = wtr.GetPosition();
         wtr.Write(i.Data);
         wtr.Write(new byte[((i.Data.Length + 3) & ~3) - i.Data.Length]);
     }
 }
 internal void Save(VirtualWriter wtr)
 {
     wtr.Write(pr);
     wtr.Write(s);
     foreach (RelocationEntry i in Items)
     {
         wtr.Write((ushort)(((uint)i.Type << 12) | (i.Offest - pr)));
     }
 }
예제 #8
0
 public void Save(VirtualWriter wtr, Rva adr)
 {
     wtr.SetPosition(adr);
     foreach (FixupEntry i in Items)
     {
         wtr.Write(i.VTable);
         wtr.Write((ushort)i.Size);
         wtr.Write((ushort)i.Type);
     }
 }
예제 #9
0
 public override void Save(VirtualWriter wtr)
 {
     if (Location.Address == 0)
     {
         throw new InvalidOperationException();
     }
     wtr.SetPosition(Location.Address);
     SaveInternal(wtr);
     (Location as DataDirectoryEntry).TotalSize = GetTotalSize();
 }
예제 #10
0
 protected override void SaveInternal(VirtualWriter wtr)
 {
     wtr.Write((uint)c);
     wtr.WriteStamp(stamp);
     wtr.Write((ushort)maVer);
     wtr.Write((ushort)miVer);
     wtr.Write((uint)t);
     wtr.Write((uint)s);
     wtr.Write(this.adr);
     wtr.Write((uint)ptr);
 }
예제 #11
0
            internal void Save(VirtualWriter wtr, ResourceDirectory dir)
            {
                uint datOffset = dir.datO[dat];

                wtr.Write(datOffset);
                wtr.Write(dat.Length);
                wtr.Write(cp);
                wtr.Write((uint)0);

                wtr.SaveLocation();
                wtr.SetPosition(datOffset);
                wtr.Write(dat);
                wtr.LoadLocation();
            }
예제 #12
0
        protected override void SaveInternal(VirtualWriter wtr)
        {
            root = Location.Address;
            ComputeOffset();

            wtr.Write(c);
            wtr.WriteStamp(stamp);
            wtr.Write(maVer);
            wtr.Write(miVer);
            wtr.Write(noName);
            wtr.Write(noID);
            foreach (ResourceEntry i in es)
            {
                if ((i.Type & EntryType.Name) == EntryType.Name)
                {
                    uint strOffset = strO[i.Name];
                    wtr.Write(strOffset | 0x80000000);

                    wtr.SaveLocation();
                    wtr.SetPosition(root + strOffset);
                    wtr.WriteUnicodeString(i.Name);
                    wtr.LoadLocation();
                }
                else if ((i.Type & EntryType.ID) == EntryType.ID)
                {
                    wtr.Write(i.ID);
                }

                if ((i.Type & EntryType.Subdirectory) == EntryType.Subdirectory)
                {
                    uint dirOffset = dirO[i.Data as Subdirectory];
                    wtr.Write(dirOffset | 0x80000000);

                    wtr.SaveLocation();
                    wtr.SetPosition(root + dirOffset);
                    (i.Data as Subdirectory).Save(wtr, this);
                    wtr.LoadLocation();
                }
                else if ((i.Type & EntryType.DataEntry) == EntryType.DataEntry)
                {
                    uint dateOffset = dateO[i.Data as DataEntry];
                    wtr.Write(dateOffset);

                    wtr.SaveLocation();
                    wtr.SetPosition(root + dateOffset);
                    (i.Data as DataEntry).Save(wtr, this);
                    wtr.LoadLocation();
                }
            }
        }
예제 #13
0
            internal void Save(VirtualWriter wtr, ResourceDirectory dir)
            {
                wtr.Write(c);
                wtr.WriteStamp(stamp);
                wtr.Write(maVer);
                wtr.Write(miVer);
                wtr.Write(noName);
                wtr.Write(noID);
                foreach (ResourceEntry i in Items)
                {
                    if ((i.Type & EntryType.Name) == EntryType.Name)
                    {
                        uint strOffset = dir.strO[i.Name];
                        wtr.Write(strOffset | 0x80000000);

                        wtr.SaveLocation();
                        wtr.SetPosition(dir.root + strOffset);
                        wtr.WriteUnicodeString(i.Name);
                        wtr.LoadLocation();
                    }
                    else if ((i.Type & EntryType.ID) == EntryType.ID)
                    {
                        wtr.Write(i.ID);
                    }

                    if ((i.Type & EntryType.Subdirectory) == EntryType.Subdirectory)
                    {
                        uint dirOffset = dir.dirO[i.Data as Subdirectory];
                        wtr.Write(dirOffset | 0x80000000);

                        wtr.SaveLocation();
                        wtr.SetPosition(dir.root + dirOffset);
                        (i.Data as Subdirectory).Save(wtr, dir);
                        wtr.LoadLocation();
                    }
                    else if ((i.Type & EntryType.DataEntry) == EntryType.DataEntry)
                    {
                        uint dateOffset = dir.dateO[i.Data as DataEntry];
                        wtr.Write(dateOffset);

                        wtr.SaveLocation();
                        wtr.SetPosition(dir.root + dateOffset);
                        (i.Data as DataEntry).Save(wtr, dir);
                        wtr.LoadLocation();
                    }
                }
            }
예제 #14
0
            internal void Save(VirtualWriter wtr)
            {
                Rva fdrAdr = (Rva)wtr.GetPosition() + GetPointersSize();

                foreach (ExportAddressEntry i in Items)
                {
                    if (i.Type == ExportAddressType.RealExport)
                    {
                        wtr.Write(i.Address);
                    }
                    else
                    {
                        wtr.Write(fdrAdr);
                        fdrAdr += (uint)i.Forwarder.Length + 1;
                        wtr.SaveLocation();
                        wtr.SetPosition(fdrAdr);
                        wtr.Write(i.Forwarder);
                        wtr.LoadLocation();
                    }
                }
            }
예제 #15
0
        protected override void SaveInternal(VirtualWriter wtr)
        {
            Rva baseAdr = wtr.GetPosition();

            wtr.Write(f);
            wtr.WriteStamp(stamp);
            wtr.Write((ushort)maVer);
            wtr.Write((ushort)miVer);
            wtr.Write(baseAdr + 40);
            wtr.Write((uint)bas);
            wtr.Write((uint)noAdr);
            wtr.Write((uint)noName);
            Rva adrsAdr = (Rva)(baseAdr + 40 + n.Length + 1);
            Rva nptAdr  = adrsAdr + adr.GetPointersSize() + adr.GetForwardersSize();
            Rva otAdr   = nptAdr + nt.GetPointersSize() + nt.GetDataSize();

            wtr.Write(adrsAdr);
            wtr.Write(nptAdr);
            wtr.Write(otAdr);

            wtr.SetPosition(baseAdr + 40);
            wtr.Write(n);

            wtr.SetPosition(adrsAdr);
            adr.Save(wtr);

            wtr.SetPosition(nptAdr);
            uint nameOffset = nt.GetPointersSize();

            foreach (string str in nt)
            {
                wtr.Write(nptAdr + nameOffset);
                nameOffset += (uint)str.Length + 1;
            }
            nt.Save(wtr);

            wtr.SetPosition(otAdr);
            ot.Save(wtr);
        }
예제 #16
0
            internal void Save(VirtualWriter wtr)
            {
                if (wtr.BaseStream.File.OptionalHeader.Type == OptionalHeader.ExecutableType.PE32Plus)
                {
                    foreach (ImportFunction func in Items)
                    {
                        switch (func.Type)
                        {
                        case ImportFunctionType.Binded:
                            wtr.Write((ulong)func.FunctionAddress); break;

                        case ImportFunctionType.Name:
                            wtr.Write((ulong)entry.Directory.GetFunctionAddress(this, func)); break;

                        case ImportFunctionType.Ordinal:
                            wtr.Write(0x8000000000000000 | func.Ordinal); break;
                        }
                    }
                    wtr.Write(0UL);
                }
                else
                {
                    foreach (ImportFunction func in Items)
                    {
                        switch (func.Type)
                        {
                        case ImportFunctionType.Binded:
                            wtr.Write((uint)func.FunctionAddress); break;

                        case ImportFunctionType.Name:
                            wtr.Write((uint)entry.Directory.GetFunctionAddress(this, func)); break;

                        case ImportFunctionType.Ordinal:
                            wtr.Write(0x80000000 | func.Ordinal); break;
                        }
                    }
                    wtr.Write(0U);
                }
            }
예제 #17
0
        protected override void SaveInternal(VirtualWriter wtr)
        {
            ulong bas = wtr.BaseStream.File.OptionalHeader.WindowsSpecificFields.ImageBase;

            if (wtr.BaseStream.File.OptionalHeader.Type == OptionalHeader.ExecutableType.PE32Plus)
            {
                wtr.Write((ulong)s + bas);
                wtr.Write((ulong)e + bas);
                wtr.Write((ulong)idx + bas);
                wtr.Write((ulong)s + bas);
                wtr.Write((ulong)cb + bas);
            }
            else
            {
                wtr.Write((uint)(s + bas));
                wtr.Write((uint)(e + bas));
                wtr.Write((uint)(idx + bas));
                wtr.Write((uint)(s + bas));
                wtr.Write((uint)(cb + bas));
            }
            wtr.Write(sz);
            wtr.Write(c);
        }
예제 #18
0
 protected override void SaveInternal(VirtualWriter wtr)
 {
     //
 }
예제 #19
0
 protected override void SaveInternal(VirtualWriter wtr)
 {
     throw new InvalidOperationException();
 }
예제 #20
0
 protected abstract void SaveInternal(VirtualWriter wtr);
예제 #21
0
        protected override void SaveInternal(VirtualWriter wtr)
        {
            Rva  iats           = wtr.BaseStream.File.OptionalHeader.DataDirectories[DataDirectoryType.IAT].Address;
            Rva  ptr            = (uint)this.items.Count * 20 + 20;
            Rva  funcs          = GetFunctionsAddress();
            Rva  names          = GetNamesAddress();
            uint iatFuncsOffset = 0;
            uint iltFuncsOffset = 0;

            foreach (ImportDirectoryEntry i in items)
            {
                wtr.Write(Location.Address + ptr + iltFuncsOffset);
                wtr.WriteStamp(i.DateTimeStamp);
                wtr.Write(i.ForwarderChain);
                wtr.Write(names);
                if (iats == 0)
                {
                    wtr.Write(Location.Address + ptr + iltFuncsOffset);
                }
                else
                {
                    wtr.Write(iats + ptr + iatFuncsOffset);
                }

                iltFuncsOffset += i.LookupTable.GetPointersSize();
                iatFuncsOffset += i.AddressTable.GetPointersSize();
                names          += (uint)i.Name.Length + 1;
            }

            wtr.Write(new byte[20]);

            foreach (ImportDirectoryEntry i in items)
            {
                i.LookupTable.Save(wtr);
            }

            foreach (ImportDirectoryEntry i in items)
            {
                foreach (ImportFunction func in i.LookupTable)
                {
                    if (func.Type == ImportFunctionType.Name)
                    {
                        wtr.Write(func.Hint);
                        wtr.Write(func.Name);
                    }
                }
            }

            foreach (ImportDirectoryEntry i in items)
            {
                wtr.Write(i.Name);
            }

            if (iats != 0)
            {
                wtr.SetPosition(iats);
                foreach (ImportDirectoryEntry i in items)
                {
                    i.AddressTable.Save(wtr);
                }
            }
        }
예제 #22
0
        protected override void SaveInternal(VirtualWriter wtr)
        {
            wtr.Write(s);
            wtr.Write(maVer);
            wtr.Write(miVer);
            Rva  mdAdr  = 0;
            uint mdSize = 0;
            Rva  resAdr = 0;
            Rva  snAdr  = 0;
            Rva  cmAdr  = 0;
            Rva  vtAdr  = 0;
            uint vtSize = 0;
            Rva  eatAdr = 0;
            Rva  mnAdr  = 0;

            Rva mdHdrAdr = wtr.GetPosition();

            wtr.Write((uint)0);
            wtr.Write((uint)0);
            wtr.Write((uint)f);
            if ((f & RuntimeFlags.NativeEntryPoint) == RuntimeFlags.NativeEntryPoint)
            {
                wtr.Write(e);
            }
            else
            {
                wtr.Write(t);
            }

            Rva otherHdrAdr = wtr.GetPosition();

            wtr.Write((uint)0);
            wtr.Write((uint)0);

            wtr.Write((uint)0);
            wtr.Write((uint)0);

            wtr.Write((uint)0);
            wtr.Write((uint)0);

            wtr.Write((uint)0);
            wtr.Write((uint)0);

            wtr.Write((uint)0);
            wtr.Write((uint)0);

            wtr.Write((uint)0);
            wtr.Write((uint)0);

            //////////////////////////////////////////////
            if (dats.DatasLocation == 0)
            {
                dats.DatasLocation = this.Location.Address + 72;
                dats.Save(wtr);
                wtr.Write(new byte[((wtr.BaseStream.Position + 3) & ~3) - wtr.BaseStream.Position]);
            }
            else
            {
                //wtr.SaveLocation();
                wtr.SetPosition(dats.DatasLocation);
                dats.Save(wtr);
                wtr.Write(new byte[((wtr.BaseStream.Position + 3) & ~3) - wtr.BaseStream.Position]);
                //wtr.LoadLocation();
            }

            mdAdr  = wtr.GetPosition();
            mdSize = md.GetSize();
            md.Save(wtr, wtr.GetPosition());
            wtr.Write(new byte[(mdSize + 3) & ~3 - mdSize]);

            if (res.Length != 0)
            {
                resAdr = wtr.GetPosition();
                wtr.Write(res);
                wtr.Write(new byte[(res.Length + 3) & ~3 - res.Length]);
            }

            if (sn.Length != 0)
            {
                snAdr = wtr.GetPosition();
                wtr.Write(sn);
                wtr.Write(new byte[(sn.Length + 3) & ~3 - sn.Length]);
            }

            if (cm.Length != 0)
            {
                cmAdr = wtr.GetPosition();
                wtr.Write(cm);
                wtr.Write(new byte[(cm.Length + 3) & ~3 - cm.Length]);
            }

            if (vtSize != 0)
            {
                vtAdr  = wtr.GetPosition();
                vtSize = vt.GetSize();
                vt.Save(wtr, vtAdr);
                wtr.Write(new byte[(vtSize + 3) & ~3 - vtSize]);
            }

            if (eat.Length != 0)
            {
                eatAdr = wtr.GetPosition();
                wtr.Write(eat);
                wtr.Write(new byte[(eat.Length + 3) & ~3 - eat.Length]);
            }

            if (mn.Length != 0)
            {
                mnAdr = wtr.GetPosition();
                wtr.Write(mn);
                wtr.Write(new byte[(mn.Length + 3) & ~3 - mn.Length]);
            }
            //////////////////////////////////////////////////////
            wtr.SetPosition(mdHdrAdr);
            wtr.Write(mdAdr);
            wtr.Write(mdSize);

            wtr.SetPosition(otherHdrAdr);
            wtr.Write(resAdr);
            wtr.Write((uint)res.Length);
            wtr.Write(snAdr);
            wtr.Write((uint)sn.Length);
            wtr.Write(cmAdr);
            wtr.Write((uint)cm.Length);
            wtr.Write(vtAdr);
            wtr.Write(vtSize);
            wtr.Write(eatAdr);
            wtr.Write((uint)eat.Length);
            wtr.Write(mnAdr);
            wtr.Write((uint)mn.Length);
        }
예제 #23
0
 public abstract void Save(VirtualWriter wtr);