예제 #1
0
        internal override void WriteTo(BinaryWriter writer, IAssemblingContext context)
        {
            uint size = context.GetFileSize(this);

            for (int i = 0; i < size; i++)
            {
                writer.Write(m_padding);
            }
        }
예제 #2
0
        internal override void WriteTo(BinaryWriter writer, IAssemblingContext context)
        {
            InternalWriteTo(writer, context);

            if (m_next != null)
            {
                m_next.WriteTo(writer, context);
            }
        }
예제 #3
0
        internal override void WriteTo(BinaryWriter writer, IAssemblingContext context)
        {
            foreach (char c in m_value)
            {
                writer.Write((byte)c);
            }

            writer.Write((byte)0);
        }
예제 #4
0
        protected internal override uint InternalComputeSize(IAssemblingContext context)
        {
            if (m_address.OffsetElement != null && !context.IsPositioned(m_address.OffsetElement))
            {
                return(6); // max size
            }

            int  dispValue = GetDisplacementValue(context);
            uint dispCode  = GetDisplacementCode(dispValue);
            uint dispSize  = GetDisplacementSize(dispCode);

            if (m_address.Base == null)
            {
                if (m_address.Index == null)
                {
                    return(5); // modrm + disp32
                }
                else
                {
                    return(6); // modrm + sib + disp32
                }
            }
            else
            {
                if (m_address.Base == Register32.ESP)
                {
                    return(2 + dispSize); // modrm + sib + ?
                }
                else
                {
                    if (m_address.Base == Register32.EBP)
                    {
                        if (dispCode == 0)
                        {
                            return(3); // modrm + sib + disp8
                        }
                        else
                        {
                            return(2 + dispSize); // modrm + sib + ?
                        }
                    }
                    else
                    {
                        if (m_address.Index == null)
                        {
                            return(1 + dispSize); // modrm + ?
                        }
                        else
                        {
                            return(2 + dispSize); // modrm + sib + ?
                        }
                    }
                }
            }
        }
예제 #5
0
        internal override uint ComputeFileSize(IAssemblingContext context)
        {
            uint modulo = context.GetFileAddress(this) % m_fileAlignment;

            if (modulo == 0)
            {
                return(0);
            }

            return(m_fileAlignment - modulo);
        }
예제 #6
0
        protected internal override void InternalWriteTo(BinaryWriter writer, IAssemblingContext context)
        {
            Int32 value = m_displacement;

            if (m_element != null)
            {
                value += (Int32)context.GetAbsoluteMemoryAddress(m_element);
            }

            writer.Write(value);
        }
예제 #7
0
        protected internal override void InternalWriteTo(BinaryWriter writer, IAssemblingContext context)
        {
            UInt32 value = m_immediate;

            if (m_reference != null)
            {
                value += (UInt32)context.GetAbsoluteMemoryAddress(m_reference);
            }

            writer.Write(value);
        }
예제 #8
0
 internal override void WriteTo(BinaryWriter writer, IAssemblingContext context)
 {
     if (m_target != null)
     {
         writer.Write((UInt16)context.GetMemorySize(m_target));
     }
     else
     {
         writer.Write((UInt16)0);
     }
 }
 internal override void WriteTo(BinaryWriter writer, IAssemblingContext context)
 {
     if (m_target != null)
     {
         context.GetPointerSize().WriteTo(writer, context.GetAbsoluteMemoryAddress(m_target));
     }
     else
     {
         context.GetPointerSize().WriteTo(writer, 0);
     }
 }
 internal override void WriteTo(BinaryWriter writer, IAssemblingContext context)
 {
     if (m_target != null)
     {
         writer.Write(context.GetRelativeMemoryAddress(m_target));
     }
     else
     {
         writer.Write((UInt32)0);
     }
 }
예제 #11
0
        private int GetDisplacementValue(IAssemblingContext context)
        {
            if (m_address.OffsetElement == null)
            {
                return(m_address.OffsetValue);
            }
            else
            {
                int reference = (int)context.GetAbsoluteMemoryAddress(m_address.OffsetElement);

                return(reference + m_address.OffsetValue);
            }
        }
 internal override void WriteTo(BinaryWriter writer, IAssemblingContext context)
 {
     for (int i = 0; i < m_length; i++)
     {
         if (m_value != null && i < m_value.Length)
         {
             writer.Write((byte)m_value[i]);
         }
         else
         {
             writer.Write((byte)0);
         }
     }
 }
예제 #13
0
            internal override void WriteTo(BinaryWriter writer, IAssemblingContext context)
            {
                uint value = 0;

                foreach (ImageSection section in m_sections)
                {
                    if (Match(section))
                    {
                        value += context.GetFileSize(section);
                    }
                }

                writer.Write(value);
            }
예제 #14
0
            internal override void WriteTo(BinaryWriter writer, IAssemblingContext context)
            {
                uint value = 0;

                foreach (ImageSection section in m_sections)
                {
                    if (Match(section))
                    {
                        value = value == 0
                                      ? context.GetRelativeMemoryAddress(section)
                                      : Math.Min(value, context.GetRelativeMemoryAddress(section));
                    }
                }

                writer.Write(value);
            }
            internal override void WriteTo(BinaryWriter writer, IAssemblingContext context)
            {
                UInt32 jmpAddress = context.GetRelativeMemoryAddress(this);
                UInt32 refAddress = context.GetRelativeMemoryAddress(m_offsetElement);

                int diff = (int)(refAddress - jmpAddress) + m_offsetValue;

                if (diff >= -126 && diff <= 129)
                {
                    writer.Write(m_opcode);
                    writer.Write((SByte)(diff - 2));
                }
                else
                {
                    throw new Exception("Invalid loop range");
                }
            }
            internal override void WriteTo(BinaryWriter writer, IAssemblingContext context)
            {
                UInt32 jmpAddress = context.GetRelativeMemoryAddress(this);
                UInt32 refAddress = context.GetRelativeMemoryAddress(m_offsetElement);

                int diff = (int)(refAddress - jmpAddress) + m_offsetValue;

                if (diff >= -126 && diff <= 129)
                {
                    writer.Write((Byte)0xeb);
                    writer.Write((SByte)(diff - 2));
                }
                else
                {
                    writer.Write((Byte)0xe9);
                    writer.Write((Int32)(diff - 5));
                }
            }
            internal override uint ComputeSize(IAssemblingContext context)
            {
                if (!context.IsPositioned(this) || !context.IsPositioned(m_offsetElement))
                {
                    return(5);
                }

                UInt32 jmpAddress = context.GetRelativeMemoryAddress(this);
                UInt32 refAddress = context.GetRelativeMemoryAddress(m_offsetElement);

                int diff = (int)(refAddress - jmpAddress) + m_offsetValue;

                if (diff >= -126 && diff <= 129)
                {
                    return(2);
                }
                else
                {
                    return(5);
                }
            }
 internal override uint ComputeSize(IAssemblingContext context)
 {
     return(context.GetPointerSize().Bytes);
 }
예제 #19
0
 internal override void WriteTo(BinaryWriter writer, IAssemblingContext context)
 {
     writer.Write(m_bytes, 0, m_bytes.Length);
 }
예제 #20
0
 internal override uint ComputeSize(IAssemblingContext context)
 {
     return((uint)m_bytes.Length);
 }
 internal override void WriteTo(BinaryWriter writer, IAssemblingContext context)
 {
     writer.Write(m_value);
 }
예제 #22
0
 internal override uint ComputeSize(IAssemblingContext context)
 {
     return(m_next == null?InternalComputeSize(context) : m_next.ComputeSize(context) + InternalComputeSize(context));
 }
예제 #23
0
 protected internal override uint InternalComputeSize(IAssemblingContext context)
 {
     return(1);
 }
예제 #24
0
 protected internal abstract void InternalWriteTo(BinaryWriter writer, IAssemblingContext context);
예제 #25
0
        protected internal override void InternalWriteTo(BinaryWriter writer, IAssemblingContext context)
        {
            int dispValue = GetDisplacementValue(context);
            int dispCode  = (int)GetDisplacementCode(dispValue);

            if (m_address.Base == null)
            {
                if (m_address.Index == null)
                {
                    WriteModRM(writer, 0, 5);
                    WriteDisp(writer, dispValue, 2);
                }
                else
                {
                    WriteModRM(writer, 0, 4);
                    WriteSib(writer, m_address.IndexScaleFactor, m_address.Index.Id, 5);
                    WriteDisp(writer, dispValue, 2);
                }
            }
            else
            {
                if (m_address.Base == Register32.ESP)
                {
                    if (m_address.Index == null)
                    {
                        WriteModRM(writer, dispCode, 4);
                        WriteSib(writer, 0, 4, m_address.Base.Id);
                        WriteDisp(writer, dispValue, dispCode);
                    }
                    else
                    {
                        WriteModRM(writer, dispCode, 4);
                        WriteSib(writer, m_address.IndexScaleFactor, m_address.Index.Id, m_address.Base.Id);
                        WriteDisp(writer, dispValue, dispCode);
                    }
                }
                else
                {
                    if (m_address.Base == Register32.EBP)
                    {
                        if (dispCode == 0)
                        {
                            if (m_address.Index == null)
                            {
                                WriteModRM(writer, 1, 4);
                                WriteSib(writer, 0, 4, 5);
                                WriteDisp(writer, 0, 1);
                            }
                            else
                            {
                                WriteModRM(writer, 1, 4);
                                WriteSib(writer, m_address.IndexScaleFactor, m_address.Index.Id, 5);
                                WriteDisp(writer, 0, 1);
                            }
                        }
                        else
                        {
                            if (m_address.Index == null)
                            {
                                WriteModRM(writer, dispCode, 4);
                                WriteSib(writer, 0, 4, 5);
                                WriteDisp(writer, dispValue, dispCode);
                            }
                            else
                            {
                                WriteModRM(writer, dispCode, 4);
                                WriteSib(writer, m_address.IndexScaleFactor, m_address.Index.Id, 5);
                                WriteDisp(writer, dispValue, dispCode);
                            }
                        }
                    }
                    else
                    {
                        if (m_address.Index == null)
                        {
                            WriteModRM(writer, dispCode, m_address.Base.Id);
                            WriteDisp(writer, dispValue, dispCode);
                        }
                        else
                        {
                            WriteModRM(writer, dispCode, 4);
                            WriteSib(writer, m_address.IndexScaleFactor, m_address.Index.Id, m_address.Base.Id);
                            WriteDisp(writer, dispValue, dispCode);
                        }
                    }
                }
            }
        }
예제 #26
0
 protected internal override void InternalWriteTo(BinaryWriter writer, IAssemblingContext context)
 {
     writer.Write((byte)(m_opcode + m_register.Id));
 }
예제 #27
0
 internal override uint ComputeSize(IAssemblingContext context)
 {
     return(4);
 }
예제 #28
0
 protected internal override void InternalWriteTo(BinaryWriter writer, IAssemblingContext context)
 {
     writer.Write(m_prefix);
 }
예제 #29
0
 protected internal abstract uint InternalComputeSize(IAssemblingContext context);
예제 #30
0
 protected internal override void InternalWriteTo(BinaryWriter writer, IAssemblingContext context)
 {
     WriteModRM(writer, 3, m_register1.Id, m_register0.Id);
 }