Exemple #1
0
        public static bool IsPush(this NefInstruction ins, out BigInteger value)
        {
            switch (ins.OpCode)
            {
            case OpCode.PUSHM1:
            case OpCode.PUSH0:
            case OpCode.PUSH1:
            case OpCode.PUSH2:
            case OpCode.PUSH3:
            case OpCode.PUSH4:
            case OpCode.PUSH5:
            case OpCode.PUSH6:
            case OpCode.PUSH7:
            case OpCode.PUSH8:
            case OpCode.PUSH9:
            case OpCode.PUSH10:
            case OpCode.PUSH11:
            case OpCode.PUSH12:
            case OpCode.PUSH13:
            case OpCode.PUSH14:
            case OpCode.PUSH15:
            case OpCode.PUSH16:
            {
                value = (int)ins.OpCode - (int)OpCode.PUSH0;
                return(true);
            }

            case OpCode.PUSHDATA1:
            case OpCode.PUSHDATA2:
            case OpCode.PUSHDATA4:
            case OpCode.PUSHINT8:
            case OpCode.PUSHINT16:
            case OpCode.PUSHINT32:
            case OpCode.PUSHINT64:
            case OpCode.PUSHINT128:
            case OpCode.PUSHINT256:
            {
                value = new BigInteger(ins.Data);

                if (!value.IsValidValue())
                {
                    value = 0;
                    return(false);
                }

                return(true);
            }
            }

            value = 0;
            return(false);
        }
Exemple #2
0
        public static void UpdateForPush(this NefInstruction ins, BigInteger value)
        {
            // Compile

            using var sb = new ScriptBuilder();
            sb.EmitPush(value);
            var script = sb.ToArray();

            // Update

            ins.SetOpCode((OpCode)script[0]);
            ins.SetData(script.Skip(1).ToArray());
        }
Exemple #3
0
        public static bool IsPushOrNull(this NefInstruction ins, out BigInteger?value)
        {
            if (ins.OpCode == OpCode.PUSHNULL)
            {
                value = null;
                return(true);
            }

            var ret = IsPush(ins, out var retval);

            value = retval;
            return(ret);
        }
Exemple #4
0
        public static bool IsPushData(this NefInstruction ins, out byte[] value)
        {
            switch (ins.OpCode)
            {
            case OpCode.PUSHDATA1:
            case OpCode.PUSHDATA2:
            case OpCode.PUSHDATA4:
            {
                value = ins.Data;
                return(true);
            }
            }

            value = null;
            return(false);
        }
Exemple #5
0
        /// <summary>
        /// Step01 Load
        /// </summary>
        /// <param name="stream">Stream</param>
        public void LoadNef(Stream stream)
        {
            //read all Instruction to listInst
            var listInst = new List <NefInstruction>();
            //read all Address to listAddr
            var mapLabel   = new Dictionary <int, NefLabel>();
            int labelindex = 1;

            NefInstruction inst;

            do
            {
                inst = NefInstruction.ReadFrom(stream);
                if (inst != null)
                {
                    listInst.Add(inst);
                    for (var i = 0; i < inst.AddressCountInData; i++)
                    {
                        // mapping addr to label
                        int addr = inst.GetAddressInData(i) + inst.Offset;
                        if (!mapLabel.ContainsKey(addr))
                        {
                            var labelname = "label" + labelindex.ToString("D06");
                            labelindex++;
                            var label = new NefLabel(labelname, addr);
                            mapLabel.Add(addr, label);
                        }

                        inst.Labels[i] = mapLabel[addr].Name;
                    }
                }
            } while (inst != null);

            //Add Labels
            Items = new List <INefItem>();
            foreach (var instruction in listInst)
            {
                var curOffset = instruction.Offset;
                if (mapLabel.ContainsKey(curOffset))
                {
                    Items.Add(mapLabel[curOffset]);
                }
                Items.Add(instruction);
            }
        }
Exemple #6
0
        private bool Is8BitAddress(NefInstruction inst)
        {
            if (inst.AddressCountInData == 0)
            {
                return(false);
            }

            for (var i = 0; i < inst.AddressCountInData; i++)
            {
                var addr = inst.GetAddressInData(i);
                if (addr < sbyte.MinValue || addr > sbyte.MaxValue)
                {
                    return(false);
                }
            }

            return(true);
        }
        /// <summary>
        /// Step01 Load
        /// </summary>
        /// <param name="stream">Stream</param>
        /// <param name="entryPoints">Entry points</param>
        public void LoadNef(Stream stream, int[] entryPoints)
        {
            // Read all Instruction to listInst.
            var listInst = new List <NefInstruction>();
            // Read all Address to listAddr.
            var mapLabel   = new Dictionary <int, NefLabel>();
            int labelindex = 1;

            // Insert EntryPoint Label.
            for (var i = 0; i < entryPoints.Length; i++)
            {
                if (i > 0 && entryPoints[i - 1] == entryPoints[i])
                {
                    // Same EntryPoints are not allowed
                    throw new Exception("Same EntryPoints are not allowed.");
                }
                if (!mapLabel.ContainsKey(entryPoints[i]))
                {
                    var labelname = "method" + i.ToString("D04");
                    var addr      = entryPoints[i];
                    var label     = new NefLabel(labelname, addr, true);
                    mapLabel.Add(addr, label);
                }
            }
            if (!mapLabel.ContainsKey(0))
            {
                var labelname = "method_zero";
                var label     = new NefLabel(labelname, 0, true);
                mapLabel.Add(0, label);
            }

            NefInstruction inst;

            do
            {
                inst = NefInstruction.ReadFrom(stream);
                if (inst != null)
                {
                    listInst.Add(inst);
                    for (var i = 0; i < inst.AddressCountInData; i++)
                    {
                        // mapping addr to label
                        int addr = inst.GetAddressInData(i) + inst.Offset;
                        if (!mapLabel.ContainsKey(addr))
                        {
                            var labelname = "label" + labelindex.ToString("D06");
                            labelindex++;
                            var label = new NefLabel(labelname, addr);
                            mapLabel.Add(addr, label);
                        }

                        inst.Labels[i] = mapLabel[addr].Name;
                    }
                }
            } while (inst != null);

            // Add Labels and split to Methods
            Methods = new List <NefMethod>();

            var curMethod = new NefMethod();

            if (listInst.Count == 0)//空也要插一个标签
            {
                curMethod.Items.Add(mapLabel[0]);
            }
            else
            {
                foreach (var instruction in listInst)
                {
                    var curOffset = instruction.Offset;
                    if (mapLabel.ContainsKey(curOffset))
                    {
                        var label = mapLabel[curOffset];
                        if (label.IsEntryPoint && curMethod.Items.Count > 0)
                        {
                            Methods.Add(curMethod);
                            curMethod = new NefMethod();
                        }
                        curMethod.Items.Add(mapLabel[curOffset]);
                    }
                    curMethod.Items.Add(instruction);
                }
            }
            Methods.Add(curMethod);
        }