コード例 #1
0
ファイル: Token.cs プロジェクト: yaskin/Stealers-Collection
        public void Load(DarksVMContext ctx, out ExecutionState state)
        {
            uint        sp       = ctx.Registers[DarksVMConstants.REG_SP].U4;
            DarksVMSlot typeSlot = ctx.Stack[sp];

            MemberInfo reference = ctx.Instance.Data.LookupReference(typeSlot.U4);

            switch (reference)
            {
            case Type _:
                typeSlot.O = ValueTypeBox.Box(((Type)reference).TypeHandle, typeof(RuntimeTypeHandle));
                break;

            case MethodBase _:
                typeSlot.O = ValueTypeBox.Box(((MethodBase)reference).MethodHandle, typeof(RuntimeMethodHandle));
                break;

            case FieldInfo _:
                typeSlot.O = ValueTypeBox.Box(((FieldInfo)reference).FieldHandle, typeof(RuntimeFieldHandle));
                break;
            }
            ctx.Stack[sp] = typeSlot;

            state = ExecutionState.Next;
        }
コード例 #2
0
ファイル: Token.cs プロジェクト: xuan2261/AndyLarkinsVM
        public void Run(VMContext ctx, out ExecutionState state)
        {
            var sp       = ctx.Registers[Constants.REG_SP].U4;
            var typeSlot = ctx.Stack[sp];

            var reference = ctx.Instance.Data.LookupReference(typeSlot.U4);

            if (reference is Type)
            {
                typeSlot.O = ValueTypeBox.Box(((Type)reference).TypeHandle, typeof(RuntimeTypeHandle));
            }
            else if (reference is MethodBase)
            {
                typeSlot.O = ValueTypeBox.Box(((MethodBase)reference).MethodHandle, typeof(RuntimeMethodHandle));
            }
            else if (reference is FieldInfo)
            {
                typeSlot.O = ValueTypeBox.Box(((FieldInfo)reference).FieldHandle, typeof(RuntimeFieldHandle));
            }
            ctx.Stack[sp] = typeSlot;

            state = ExecutionState.Next;
        }
コード例 #3
0
ファイル: Initobj.cs プロジェクト: naderr1ua/DarksProtector
        public void Load(DarksVMContext ctx, out ExecutionState state)
        {
            var sp       = ctx.Registers[DarksVMConstants.REG_SP].U4;
            var typeSlot = ctx.Stack[sp--];
            var addrSlot = ctx.Stack[sp--];

            var type = (Type)ctx.Instance.Data.LookupReference(typeSlot.U4);

            if (addrSlot.O is IReference)
            {
                var reference = (IReference)addrSlot.O;
                var slot      = new DarksVMSlot();
                if (type.IsValueType)
                {
                    object def = null;
                    if (Nullable.GetUnderlyingType(type) == null)
                    {
                        def = FormatterServices.GetUninitializedObject(type);
                    }
                    slot.O = ValueTypeBox.Box(def, type);
                }
                else
                {
                    slot.O = null;
                }
                reference.SetValue(ctx, slot, PointerType.OBJECT);
            }
            else
            {
                throw new NotSupportedException();
            }

            ctx.Stack.SetTopPosition(sp);
            ctx.Registers[DarksVMConstants.REG_SP].U4 = sp;
            state = ExecutionState.Next;
        }
コード例 #4
0
ファイル: VMSlot.cs プロジェクト: xuan2261/AndyLarkinsVM
        public static unsafe VMSlot FromObject(object obj, Type type)
        {
            if (type.IsEnum)
            {
                var elemType = Enum.GetUnderlyingType(type);
                return(FromObject(Convert.ChangeType(obj, elemType), elemType));
            }

            switch (Type.GetTypeCode(type))
            {
            case TypeCode.Byte:
                return(new VMSlot {
                    u1 = (byte)obj
                });

            case TypeCode.SByte:
                return(new VMSlot {
                    u1 = (byte)(sbyte)obj
                });

            case TypeCode.Boolean:
                return(new VMSlot {
                    u1 = (byte)((bool)obj ? 1 : 0)
                });

            case TypeCode.UInt16:
                return(new VMSlot {
                    u2 = (ushort)obj
                });

            case TypeCode.Int16:
                return(new VMSlot {
                    u2 = (ushort)(short)obj
                });

            case TypeCode.Char:
                return(new VMSlot {
                    u2 = (char)obj
                });

            case TypeCode.UInt32:
                return(new VMSlot {
                    u4 = (uint)obj
                });

            case TypeCode.Int32:
                return(new VMSlot {
                    u4 = (uint)(int)obj
                });

            case TypeCode.UInt64:
                return(new VMSlot {
                    u8 = (ulong)obj
                });

            case TypeCode.Int64:
                return(new VMSlot {
                    u8 = (ulong)(long)obj
                });

            case TypeCode.Single:
                return(new VMSlot {
                    r4 = (float)obj
                });

            case TypeCode.Double:
                return(new VMSlot {
                    r8 = (double)obj
                });

            default:
                if (obj is Pointer)
                {
                    return new VMSlot {
                               u8 = (ulong)Pointer.Unbox(obj)
                    }
                }
                ;
                if (obj is IntPtr)
                {
                    return new VMSlot {
                               u8 = (ulong)(IntPtr)obj
                    }
                }
                ;
                if (obj is UIntPtr)
                {
                    return new VMSlot {
                               u8 = (ulong)(UIntPtr)obj
                    }
                }
                ;
                if (type.IsValueType)
                {
                    return new VMSlot {
                               o = ValueTypeBox.Box(obj, type)
                    }
                }
                ;
                return(new VMSlot {
                    o = obj
                });
            }
        }
コード例 #5
0
ファイル: VMSlot.cs プロジェクト: xuan2261/AndyLarkinsVM
        public unsafe object ToObject(Type type)
        {
            if (type.IsEnum)
            {
                return(Enum.ToObject(type, ToObject(Enum.GetUnderlyingType(type))));
            }

            switch (Type.GetTypeCode(type))
            {
            case TypeCode.Byte:
                return(u1);

            case TypeCode.SByte:
                return((sbyte)u1);

            case TypeCode.Boolean:
                return(u1 != 0);

            case TypeCode.UInt16:
                return(u2);

            case TypeCode.Int16:
                return((short)u2);

            case TypeCode.Char:
                return((char)u2);

            case TypeCode.UInt32:
                return(u4);

            case TypeCode.Int32:
                return((int)u4);

            case TypeCode.UInt64:
                return((ulong)u8);

            case TypeCode.Int64:
                return((long)u8);

            case TypeCode.Single:
                return(r4);

            case TypeCode.Double:
                return(r8);

            default:
                if (type.IsPointer)
                {
                    return(Pointer.Box((void *)u8, type));
                }
                if (type == typeof(IntPtr))
                {
                    return(Platform.x64 ? new IntPtr((long)u8) : new IntPtr((int)u4));
                }
                if (type == typeof(UIntPtr))
                {
                    return(Platform.x64 ? new UIntPtr(u8) : new UIntPtr(u4));
                }
                return(ValueTypeBox.Unbox(o));
            }
        }