예제 #1
0
        public static List <byte> LookupByteArray(AssemblyOperator objectOp,
                                                  object operand1 = null, object operand2 = null,
                                                  object operand3 = null)
        {
            if ((objectOp == AssemblyOperator.shl) ||
                (objectOp == AssemblyOperator.shr))
            {
                operand1 = (operand1 is BigInteger) ? 0L : operand1;
                operand2 = (operand2 is BigInteger) ? 0L : operand2;
                operand3 = (operand3 is BigInteger) ? 0L : operand3;
            }

            ObjectCodeInfo info =
                new ObjectCodeInfo(objectOp, operand1, operand2, operand3);

            byte[] byteArray = ObjectCodeTable.MainArrayMap[info];
            Assert.ErrorXXX(byteArray != null);
            List <byte> byteList = new List <byte>();

            foreach (byte b in byteArray)
            {
                byteList.Add(b);
            }

            return(byteList);
        }
예제 #2
0
        public void FromAdditionToIncrement()
        {
            object operand0 = m_operandArray[0],
                   operand1 = m_operandArray[1],
                   operand2 = m_operandArray[2];

            if (((m_operator == AssemblyOperator.add) || (m_operator == AssemblyOperator.sub)) &&
                (operand0 is Track) && (operand1 is BigInteger) && (operand2 == null))
            {
                BigInteger value = (BigInteger)operand1;

                if (((m_operator == AssemblyOperator.add) && (value == 1)) ||
                    ((m_operator == AssemblyOperator.sub) && (value == -1)))
                {
                    m_operator        = AssemblyOperator.inc;
                    m_operandArray[1] = null;
                }
                else if (((m_operator == AssemblyOperator.sub) && (value == 1)) ||
                         ((m_operator == AssemblyOperator.add) && (value == -1)))
                {
                    m_operator        = AssemblyOperator.dec;
                    m_operandArray[1] = null;
                }
            }
        }
예제 #3
0
        public static AssemblyOperator OperatorToSize(AssemblyOperator objectOp, int size)
        {
            string name = Enum.GetName(typeof(AssemblyOperator), objectOp);

            if (objectOp == AssemblyOperator.interrupt)
            {
                return(AssemblyOperator.interrupt);
            }

            switch (size)
            {
            case 1:
                name = name + "_byte";
                break;

            case 2:
                name = name + "_word";
                break;

            case 4:
                name = name + "_dword";
                break;

            case 8:
                name = name + "_qword";
                break;

            default:
                Assert.Error(false);
                break;
            }

            return((AssemblyOperator)Enum.Parse(typeof(AssemblyOperator), name));
        }
        public AssemblyCode(AssemblyOperator objectOp, object operand0,
                            object operand1, object operand2 = null,
                            int size = 0)
        {
            m_operator        = objectOp;
            m_operandArray[0] = operand0;
            m_operandArray[1] = operand1;
            m_operandArray[2] = operand2;

            // add rsi, 24

            FromAdditionToIncrement();
            CheckSize(size);

            if ((m_operator == AssemblyOperator.sub) &&
                ((m_operandArray[0] is Track) || (m_operandArray[0] is Register)) &&
                (m_operandArray[1] is int) &&
                (m_operandArray[2] == null))
            {
                int i = 1;
            }

            string operatorName = Enum.GetName(typeof(AssemblyOperator),
                                               Operator).Replace("_", " ");

            if (operatorName.Equals("add") && (operand0 is Register) &&
                (operand1 is int))
            {
                int i = 1;
            }
        }
예제 #5
0
        public static AssemblyOperator OperatorToSize
            (AssemblyOperator objectOp, int size)
        {
            string name = Enum.GetName(typeof(AssemblyOperator), objectOp);

            Assert.ErrorXXX(objectOp != AssemblyOperator.interrupt);

            switch (size)
            {
            case 1:
                name = name + "_byte";
                break;

            case 2:
                name = name + "_word";
                break;

            case 4:
                name = name + "_dword";
                break;

            case 8:
                name = name + "_qword";
                break;
            }

            Assert.ErrorXXX(name.Contains("_"));
            return((AssemblyOperator)Enum.Parse(typeof(AssemblyOperator), name));
        }
예제 #6
0
 public ObjectCodeInfo(AssemblyOperator operatorX, object value1, object value2, object value3)
 {
     m_operator = operatorX;
     m_value1   = value1;
     m_value2   = value2;
     m_value3   = value3;
 }
예제 #7
0
 public AssemblyCode(AssemblyOperator objectOp, object operand0,
                     object operand1, object operand2 = null, int assemblyListIndex = -1)
 {
     m_operator        = objectOp;
     m_operandArray[0] = operand0;
     m_operandArray[1] = operand1;
     m_operandArray[2] = operand2;
     FromAdditionToIncrement();
 }
예제 #8
0
 public AssemblyCode(AssemblyOperator objectOp, object operand0,
                     object operand1, object operand2 = null,
                     int size = 0)
 {
     m_operator        = objectOp;
     m_operandArray[0] = operand0;
     m_operandArray[1] = operand1;
     m_operandArray[2] = operand2;
     FromAdditionToIncrement();
     CheckSize(size);
 }
 private void CheckSize(int size)
 {
     if ((size != 0) && ((m_operandArray[0] is Register) ||
                         (m_operandArray[0] is Track) || (m_operandArray[0] is String)) &&
         (m_operandArray[1] is int) &&
         (IsUnary() || ((m_operandArray[2] is BigInteger) ||
                        (m_operandArray[2] is String))))
     {
         m_operator = OperatorToSize(m_operator, size);
     }
 }
예제 #10
0
        public static int SizeOfValue(BigInteger value, AssemblyOperator op)
        {
            string name = Enum.GetName(typeof(AssemblyOperator), op);

            if (name.StartsWith("mov"))
            {
                return(SizeOfOperator(op));
            }
            else if (name.StartsWith("cmp") && (value == 0))
            {
                return(1);
            }
            else
            {
                return(SizeOfValue(value));
            }
        }
예제 #11
0
        private void CheckIncrement(int valueIndex)
        {
            int value = (int)((BigInteger)m_operandArray[valueIndex]);

            if (((Operator == AssemblyOperator.add) && (value == 1)) ||
                ((Operator == AssemblyOperator.sub) && (value == -1)))
            {
                m_operator = AssemblyOperator.inc;
                m_operandArray[valueIndex] = null;
            }
            else if (((Operator == AssemblyOperator.add) && (value == -1)) ||
                     ((Operator == AssemblyOperator.sub) && (value == 1)))
            {
                m_operator = AssemblyOperator.dec;
                m_operandArray[valueIndex] = null;
            }
        }
예제 #12
0
        /// <summary>
        /// 编译脚本,生成委托
        /// </summary>
        /// <param name="className">类名</param>
        /// <param name="methodName">方法名</param>
        /// <param name="delegateType">委托类型</param>
        /// <returns></returns>
        public Delegate Complie(string className, string content, string methodName, Type delegateType)
        {
            //获取程序集
            Assembly assembly = GetAssemblyByScript(content);


            //判空
            if (assembly == null)
            {
                return(null);
            }


            //获取方法委托
            return(AssemblyOperator
                   .Loader(assembly)[className]
                   .GetMethod(methodName)
                   .CreateDelegate(delegateType));
        }
예제 #13
0
        /// <summary>
        /// 编译脚本,生成委托
        /// </summary>
        /// <param name="className">类名</param>
        /// <param name="methodName">方法名</param>
        /// <param name="delegateType">委托类型</param>
        /// <returns></returns>
        public Delegate Complie <T>(string className, string content, string methodName, object binder)
        {
            //获取程序集
            Assembly assembly = GetAssemblyByScript(content);


            //判空
            if (assembly == null)
            {
                return(null);
            }


            //获取方法委托
            return(AssemblyOperator
                   .Loader(assembly)[className]
                   .GetMethod(methodName)
                   .CreateDelegate(typeof(T), binder));
        }
예제 #14
0
        public static int SizeOfOperator(AssemblyOperator objectOp)
        {
            string name = Enum.GetName(typeof(AssemblyOperator), objectOp);

            if (name.Contains("_byte"))
            {
                return(1);
            }
            else if (name.Contains("_word"))
            {
                return(2);
            }
            else if (name.Contains("_dword"))
            {
                return(4);
            }
            else
            {
                Assert.ErrorXXX(name.Contains("_qword"));
                return(8);
            }
        }
예제 #15
0
        public static int SizeOfOperator(AssemblyOperator objectOp)
        {
            string name = Enum.GetName(typeof(AssemblyOperator), objectOp);

            if (name.Contains("_byte"))
            {
                return(Type.Bytes1);
            }
            else if (name.Contains("_word"))
            {
                return(Type.Bytes2);
            }
            else if (name.Contains("_dword"))
            {
                return(Type.Bytes4);
            }
            else if (name.Contains("_qword"))
            {
                return(Type.Bytes8);
            }

            Assert.Error(Message.Operator_size);
            return(0);
        }
예제 #16
0
        public void TestInit()
        {
            string _path = string.Format(@"{0}\TestSource\DotNet2.Interfaces.dll", AppDomain.CurrentDomain.BaseDirectory);

            assHelper = new AssemblyOperator(_path);
        }
예제 #17
0
        public void Optimize()
        {
            foreach (AssemblyCode assemblyCode in m_assemblyCodeList)
            {
                AssemblyOperator operatorX = assemblyCode.Operator;
                object           operand0  = assemblyCode[0],
                                 operand1  = assemblyCode[1],
                                 operand2  = assemblyCode[2];

                switch (operatorX)
                {
                case AssemblyOperator.add:
                case AssemblyOperator.sub:
                    if ((operand0 is Register) && (operand1 is int) && (operand2 == null))
                    {
                        int value = (int)operand1;

                        if (((operatorX == AssemblyOperator.add) && (value == 1)) ||
                            ((operatorX == AssemblyOperator.sub) && (value == -1)))
                        {
                            assemblyCode.Operator = AssemblyOperator.inc;
                            assemblyCode[1]       = null;
                        }
                        else if (((operatorX == AssemblyOperator.add) && (value == -1)) ||
                                 ((operatorX == AssemblyOperator.sub) && (value == 1)))
                        {
                            assemblyCode.Operator = AssemblyOperator.dec;
                            assemblyCode[1]       = null;
                        }
                    }
                    else if ((operand0 is Register) && (operand1 is int) && (operand2 is int))
                    {
                        int value = (int)operand2;

                        if (((operatorX == AssemblyOperator.add) && (value == 1)) ||
                            ((operatorX == AssemblyOperator.sub) && (value == -1)))
                        {
                            assemblyCode.Operator = AssemblyOperator.inc;
                            assemblyCode[2]       = null;
                        }
                        else if (((operatorX == AssemblyOperator.add) && (value == -1)) ||
                                 ((operatorX == AssemblyOperator.sub) && (value == 1)))
                        {
                            assemblyCode.Operator = AssemblyOperator.dec;
                            assemblyCode[2]       = null;
                        }
                    }
                    break;

                case AssemblyOperator.jmp:
                case AssemblyOperator.je:
                case AssemblyOperator.jne:
                case AssemblyOperator.jc:
                case AssemblyOperator.jnc:
                case AssemblyOperator.jl:
                case AssemblyOperator.jle:
                case AssemblyOperator.jg:
                case AssemblyOperator.jge:
                case AssemblyOperator.jb:
                case AssemblyOperator.jbe:
                case AssemblyOperator.ja:
                case AssemblyOperator.jae: {
                    if (operand0 is int)
                    {
                        int address = (int)operand0;

                        if (address == 0)
                        {
                            assemblyCode.Operator = AssemblyOperator.empty;
                            assemblyCode[0]       = null;
                        }
                    }
                }
                break;
                }
            }
        }