about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm2/analysis/expression_range.py1
-rw-r--r--miasm2/analysis/modularintervals.py24
2 files changed, 24 insertions, 1 deletions
diff --git a/miasm2/analysis/expression_range.py b/miasm2/analysis/expression_range.py
index ca63588c..a2c4a8df 100644
--- a/miasm2/analysis/expression_range.py
+++ b/miasm2/analysis/expression_range.py
@@ -7,6 +7,7 @@ _op_range_handler = {
     "&": lambda x, y: x & y,
     "|": lambda x, y: x | y,
     "^": lambda x, y: x ^ y,
+    "*": lambda x, y: x * y,
     ">>": lambda x, y: x >> y,
     "a>>": lambda x, y: x.arithmetic_shift_right(y),
     "<<": lambda x, y: x << y,
diff --git a/miasm2/analysis/modularintervals.py b/miasm2/analysis/modularintervals.py
index 2554339d..650dbc21 100644
--- a/miasm2/analysis/modularintervals.py
+++ b/miasm2/analysis/modularintervals.py
@@ -261,6 +261,21 @@ class ModularIntervals(object):
 
     _interval_xor = _range2interval(_range_xor)
 
+    def _range_mul(self, x_min, x_max, y_min, y_max):
+        """Interval bounds for x * y, with
+         - x, y of size self.size
+         - @x_min <= x <= @x_max
+         - @y_min <= y <= @y_max
+         - operations are considered unsigned
+        This is a naive version, going to TOP on overflow"""
+        max_bound = self.mask
+        if y_max * x_max > max_bound:
+            return interval([(0, max_bound)])
+        else:
+            return interval([(x_min * y_min, x_max * y_max)])
+
+    _interval_mul = _range2interval(_range_mul)
+
     def _range_mod_uniq(self, x_min, x_max, mod):
         """Interval bounds for x % @mod, with
          - x, @mod of size self.size
@@ -390,11 +405,18 @@ class ModularIntervals(object):
     @_promote
     def __xor__(self, to_xor):
         """Bitwise XOR @to_xor to the current intervals
-        @to_or: ModularInstances or integer
+        @to_xor: ModularInstances or integer
         """
         return self._interval_xor(to_xor)
 
     @_promote
+    def __mul__(self, to_mul):
+        """Multiply @to_mul to the current intervals
+        @to_mul: ModularInstances or integer
+        """
+        return self._interval_mul(to_mul)
+
+    @_promote
     def __rshift__(self, to_shift):
         """Logical shift right the current intervals of @to_shift
         @to_shift: ModularInstances or integer