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); }
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()); }
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); }
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); }
/// <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); } }
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); }