Miasm2
 All Classes Namespaces Files Functions Variables Typedefs Properties Macros
Public Member Functions | Static Public Attributes | Private Member Functions | List of all members
miasm2.expression.expression_helper.ExprRandom Class Reference
+ Inheritance diagram for miasm2.expression.expression_helper.ExprRandom:
+ Collaboration diagram for miasm2.expression.expression_helper.ExprRandom:

Public Member Functions

def identifier
 
def number
 
def atomic
 
def operation
 
def slice
 
def compose
 
def memory
 
def get
 

Static Public Attributes

int identifier_len = 5
 
 identifier_charset = string.letters
 
int number_max = 0xFFFFFFFF
 
dictionary operations_by_args_number
 
int operations_max_args_number = 5
 
 perfect_tree = True
 
int slice_add_size = 10
 
int compose_max_layer = 5
 
int memory_max_address_size = 32
 
 reuse_element = True
 
dictionary generated_elements = {}
 

Private Member Functions

def _gen
 

Detailed Description

Return an expression randomly generated

Definition at line 368 of file expression_helper.py.

Member Function Documentation

def miasm2.expression.expression_helper.ExprRandom._gen (   cls,
  size = 32,
  depth = 1 
)
private
Internal function for generating sub-expression according to options
@size: (optional) Operation size
@depth: (optional) Expression depth
/!\ @generated_elements is left modified

Definition at line 488 of file expression_helper.py.

489  def _gen(cls, size=32, depth=1):
490  """Internal function for generating sub-expression according to options
491  @size: (optional) Operation size
492  @depth: (optional) Expression depth
493  /!\ @generated_elements is left modified
494  """
495  # Perfect tree handling
496  if not cls.perfect_tree:
497  depth = random.randint(max(0, depth - 2), depth)
498 
499  # Element re-use
500  if cls.reuse_element and random.choice([True, False]) and \
501  (depth, size) in cls.generated_elements:
502  return random.choice(cls.generated_elements[(depth, size)])
503 
504  # Recursion stop
505  if depth == 0:
506  return cls.atomic(size=size)
507 
508  # Build a more complex expression
509  available_funcs = [cls.operation, cls.slice, cls.compose, cls.memory]
510  gen = random.choice(available_funcs)(size=size, depth=depth)
511 
512  # Save it
513  new_value = cls.generated_elements.get((depth, size), []) + [gen]
514  cls.generated_elements[(depth, size)] = new_value
515  return gen
def miasm2.expression.expression_helper.ExprRandom.atomic (   cls,
  size = 32 
)
Return an atomic Expression
@size: (optional) Expr size

Definition at line 414 of file expression_helper.py.

415  def atomic(cls, size=32):
416  """Return an atomic Expression
417  @size: (optional) Expr size
418  """
419  available_funcs = [cls.identifier, cls.number]
420  return random.choice(available_funcs)(size=size)
def miasm2.expression.expression_helper.ExprRandom.compose (   cls,
  size = 32,
  depth = 1 
)
Return an ExprCompose
@size: (optional) Operation size
@depth: (optional) Expression depth

Definition at line 452 of file expression_helper.py.

453  def compose(cls, size=32, depth=1):
454  """Return an ExprCompose
455  @size: (optional) Operation size
456  @depth: (optional) Expression depth
457  """
458  # First layer
459  upper_bound = random.randint(1, size)
460  args = [(cls._gen(size=upper_bound, depth=depth - 1), 0, upper_bound)]
461 
462  # Next layers
463  while (upper_bound < size):
464  if len(args) == (cls.compose_max_layer - 1):
465  # We reach the maximum size
466  upper_bound = size
467  else:
468  upper_bound = random.randint(args[-1][-1] + 1, size)
469 
470  args.append((cls._gen(size=upper_bound - args[-1][-1]),
471  args[-1][-1],
472  upper_bound))
473 
474  return m2_expr.ExprCompose(args)
def miasm2.expression.expression_helper.ExprRandom.get (   cls,
  size = 32,
  depth = 1,
  clean = True 
)
Return a randomly generated expression
@size: (optional) Operation size
@depth: (optional) Expression depth
@clean: (optional) Clean expression cache between two calls

Definition at line 517 of file expression_helper.py.

518  def get(cls, size=32, depth=1, clean=True):
519  """Return a randomly generated expression
520  @size: (optional) Operation size
521  @depth: (optional) Expression depth
522  @clean: (optional) Clean expression cache between two calls
523  """
524  # Init state
525  if clean:
526  cls.generated_elements = {}
527 
528  # Get an element
529  got = cls._gen(size=size, depth=depth)
530 
531  # Clear state
532  if clean:
533  cls.generated_elements = {}
534 
535  return got
def miasm2.expression.expression_helper.ExprRandom.identifier (   cls,
  size = 32 
)
Return a random identifier
@size: (optional) identifier size

Definition at line 397 of file expression_helper.py.

398  def identifier(cls, size=32):
399  """Return a random identifier
400  @size: (optional) identifier size
401  """
402  return m2_expr.ExprId("".join([random.choice(cls.identifier_charset)
403  for _ in xrange(cls.identifier_len)]),
404  size=size)
def miasm2.expression.expression_helper.ExprRandom.memory (   cls,
  size = 32,
  depth = 1 
)
Return an ExprMem
@size: (optional) Operation size
@depth: (optional) Expression depth

Definition at line 476 of file expression_helper.py.

477  def memory(cls, size=32, depth=1):
478  """Return an ExprMem
479  @size: (optional) Operation size
480  @depth: (optional) Expression depth
481  """
482 
483  address_size = random.randint(1, cls.memory_max_address_size)
484  return m2_expr.ExprMem(cls._gen(size=address_size,
485  depth=depth - 1),
486  size=size)
def miasm2.expression.expression_helper.ExprRandom.number (   cls,
  size = 32 
)
Return a random number
@size: (optional) number max bits

Definition at line 406 of file expression_helper.py.

407  def number(cls, size=32):
408  """Return a random number
409  @size: (optional) number max bits
410  """
411  num = random.randint(0, cls.number_max % (2**size))
412  return m2_expr.ExprInt(num, size)
def miasm2.expression.expression_helper.ExprRandom.operation (   cls,
  size = 32,
  depth = 1 
)
Return an ExprOp
@size: (optional) Operation size
@depth: (optional) Expression depth

Definition at line 422 of file expression_helper.py.

423  def operation(cls, size=32, depth=1):
424  """Return an ExprOp
425  @size: (optional) Operation size
426  @depth: (optional) Expression depth
427  """
428  operand_type = random.choice(cls.operations_by_args_number.keys())
429  if isinstance(operand_type, str) and "+" in operand_type:
430  number_args = random.randint(int(operand_type[:-1]),
431  cls.operations_max_args_number)
432  else:
433  number_args = operand_type
434 
435  args = [cls._gen(size=size, depth=depth - 1)
436  for _ in xrange(number_args)]
437  operand = random.choice(cls.operations_by_args_number[operand_type])
438  return m2_expr.ExprOp(operand,
439  *args)
def miasm2.expression.expression_helper.ExprRandom.slice (   cls,
  size = 32,
  depth = 1 
)
Return an ExprSlice
@size: (optional) Operation size
@depth: (optional) Expression depth

Definition at line 441 of file expression_helper.py.

442  def slice(cls, size=32, depth=1):
443  """Return an ExprSlice
444  @size: (optional) Operation size
445  @depth: (optional) Expression depth
446  """
447  start = random.randint(0, size)
448  stop = start + size
449  return cls._gen(size=random.randint(stop, stop + cls.slice_add_size),
450  depth=depth - 1)[start:stop]

Member Data Documentation

int miasm2.expression.expression_helper.ExprRandom.compose_max_layer = 5
static

Definition at line 389 of file expression_helper.py.

dictionary miasm2.expression.expression_helper.ExprRandom.generated_elements = {}
static

Definition at line 394 of file expression_helper.py.

miasm2.expression.expression_helper.ExprRandom.identifier_charset = string.letters
static

Definition at line 374 of file expression_helper.py.

int miasm2.expression.expression_helper.ExprRandom.identifier_len = 5
static

Definition at line 372 of file expression_helper.py.

int miasm2.expression.expression_helper.ExprRandom.memory_max_address_size = 32
static

Definition at line 391 of file expression_helper.py.

int miasm2.expression.expression_helper.ExprRandom.number_max = 0xFFFFFFFF
static

Definition at line 376 of file expression_helper.py.

dictionary miasm2.expression.expression_helper.ExprRandom.operations_by_args_number
static
Initial value:
1 = {1: ["-"],
2  2: ["<<", "<<<", ">>", ">>>"],
3  "2+": ["+", "*", "&", "|", "^"],
4  }

Definition at line 378 of file expression_helper.py.

int miasm2.expression.expression_helper.ExprRandom.operations_max_args_number = 5
static

Definition at line 383 of file expression_helper.py.

miasm2.expression.expression_helper.ExprRandom.perfect_tree = True
static

Definition at line 385 of file expression_helper.py.

miasm2.expression.expression_helper.ExprRandom.reuse_element = True
static

Definition at line 393 of file expression_helper.py.

int miasm2.expression.expression_helper.ExprRandom.slice_add_size = 10
static

Definition at line 387 of file expression_helper.py.


The documentation for this class was generated from the following file: