using Obfuz.Utils; using Obfuz.Virtualization.Functions; using System.Collections.Generic; namespace Obfuz.Virtualization { public class RandomDataNodeCreator : DataNodeCreatorBase { private readonly Dictionary> _functions = new Dictionary>(); private readonly IRandom _random; public RandomDataNodeCreator(IRandom random) { _random = random; var int32Funcs = new List() { new IntAdd(), new IntXor(), new IntRotateShift(), //new ConstFromFieldRvaDataCreator(), //new ConstDataCreator(), }; _functions.Add(DataNodeType.Int32, int32Funcs); _functions.Add(DataNodeType.Int64, int32Funcs); } public override IDataNode CreateRandom(DataNodeType type, object value, CreateExpressionOptions options) { if (!_functions.TryGetValue(type, out var funcs)) { throw new System.Exception($"No functions available for type {type}"); } if (options.depth >= 4) { //return new ConstDataNode() { Type = type, Value = value }; return _random.NextInt(100) < 50 ? //return true ? new ConstFromFieldRvaDataNode() { Type = type, Value = value } : new ConstDataNode() { Type = type, Value = value }; } var func = funcs[options.random.NextInt(funcs.Count)]; ++options.depth; return func.CreateExpr(type, value, options); } public IDataNode CreateRandom(DataNodeType type, object value) { var options = new CreateExpressionOptions { depth = 0, random = _random, expressionCreator = this, }; return CreateRandom(type, value, options); } } }