Merge branch 'master' into confuser
This commit is contained in:
commit
a28e300140
|
@ -220,6 +220,8 @@ namespace de4dot.blocks.cflow {
|
||||||
return emulateBranch(1, Int64Value.compareFalse((Int64Value)val1));
|
return emulateBranch(1, Int64Value.compareFalse((Int64Value)val1));
|
||||||
else if (val1.isNull())
|
else if (val1.isNull())
|
||||||
return emulateBranch(1, true);
|
return emulateBranch(1, true);
|
||||||
|
else if (val1.isObject() || val1.isString() || val1.isBoxed())
|
||||||
|
return emulateBranch(1, false);
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -233,6 +235,8 @@ namespace de4dot.blocks.cflow {
|
||||||
return emulateBranch(1, Int64Value.compareTrue((Int64Value)val1));
|
return emulateBranch(1, Int64Value.compareTrue((Int64Value)val1));
|
||||||
else if (val1.isNull())
|
else if (val1.isNull())
|
||||||
return emulateBranch(1, false);
|
return emulateBranch(1, false);
|
||||||
|
else if (val1.isObject() || val1.isString() || val1.isBoxed())
|
||||||
|
return emulateBranch(1, true);
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -385,6 +385,12 @@ namespace de4dot.blocks.cflow {
|
||||||
case Code.Ldfld: emulate_Ldfld(instr); break;
|
case Code.Ldfld: emulate_Ldfld(instr); break;
|
||||||
case Code.Ldsfld: emulate_Ldsfld(instr); break;
|
case Code.Ldsfld: emulate_Ldsfld(instr); break;
|
||||||
|
|
||||||
|
case Code.Ldftn: valueStack.push(new ObjectValue(instr.Operand)); break;
|
||||||
|
case Code.Ldsflda: valueStack.push(new ObjectValue(instr.Operand)); break;
|
||||||
|
case Code.Ldtoken: valueStack.push(new ObjectValue(instr.Operand)); break;
|
||||||
|
case Code.Ldvirtftn:valueStack.pop(); valueStack.push(new ObjectValue()); break;
|
||||||
|
case Code.Ldflda: valueStack.pop(); valueStack.push(new ObjectValue()); break;
|
||||||
|
|
||||||
case Code.Unbox:
|
case Code.Unbox:
|
||||||
|
|
||||||
case Code.Conv_R_Un:
|
case Code.Conv_R_Un:
|
||||||
|
@ -440,16 +446,11 @@ namespace de4dot.blocks.cflow {
|
||||||
case Code.Ldelem_R4:
|
case Code.Ldelem_R4:
|
||||||
case Code.Ldelem_R8:
|
case Code.Ldelem_R8:
|
||||||
case Code.Ldelem_Ref:
|
case Code.Ldelem_Ref:
|
||||||
case Code.Ldflda:
|
|
||||||
case Code.Ldftn:
|
|
||||||
case Code.Ldind_I:
|
case Code.Ldind_I:
|
||||||
case Code.Ldind_R4:
|
case Code.Ldind_R4:
|
||||||
case Code.Ldind_R8:
|
case Code.Ldind_R8:
|
||||||
case Code.Ldind_Ref:
|
case Code.Ldind_Ref:
|
||||||
case Code.Ldobj:
|
case Code.Ldobj:
|
||||||
case Code.Ldsflda:
|
|
||||||
case Code.Ldtoken:
|
|
||||||
case Code.Ldvirtftn:
|
|
||||||
case Code.Leave:
|
case Code.Leave:
|
||||||
case Code.Leave_S:
|
case Code.Leave_S:
|
||||||
case Code.Localloc:
|
case Code.Localloc:
|
||||||
|
|
|
@ -21,6 +21,7 @@ namespace de4dot.blocks.cflow {
|
||||||
public enum ValueType : byte {
|
public enum ValueType : byte {
|
||||||
Unknown,
|
Unknown,
|
||||||
Null,
|
Null,
|
||||||
|
Object,
|
||||||
Boxed,
|
Boxed,
|
||||||
Int32,
|
Int32,
|
||||||
Int64,
|
Int64,
|
||||||
|
@ -45,6 +46,10 @@ namespace de4dot.blocks.cflow {
|
||||||
return valueType == ValueType.Null;
|
return valueType == ValueType.Null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool isObject() {
|
||||||
|
return valueType == ValueType.Object;
|
||||||
|
}
|
||||||
|
|
||||||
public bool isBoxed() {
|
public bool isBoxed() {
|
||||||
return valueType == ValueType.Boxed;
|
return valueType == ValueType.Boxed;
|
||||||
}
|
}
|
||||||
|
@ -80,6 +85,23 @@ namespace de4dot.blocks.cflow {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class ObjectValue : Value {
|
||||||
|
public readonly object obj; // can be null but that doesn't mean that this ObjectValue instance is null
|
||||||
|
|
||||||
|
public ObjectValue()
|
||||||
|
: this(null) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public ObjectValue(object obj)
|
||||||
|
: base(ValueType.Object) {
|
||||||
|
this.obj = obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString() {
|
||||||
|
return "<non-null object>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class NullValue : Value {
|
public class NullValue : Value {
|
||||||
// There's only one type of null
|
// There's only one type of null
|
||||||
public static readonly NullValue Instance = new NullValue();
|
public static readonly NullValue Instance = new NullValue();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user