|
1 | 1 | use std::fmt::{Display, Formatter}; |
2 | 2 |
|
3 | 3 | use jingle::modeling::{ModelingContext, State}; |
4 | | -use jingle::sleigh::GeneralizedVarNode; |
| 4 | +use jingle::sleigh::{GeneralizedVarNode, RegisterManager, VarNode}; |
5 | 5 | use jingle::varnode::ResolvedVarnode; |
6 | 6 | use z3::ast::BV; |
7 | 7 | use z3::Model; |
@@ -40,6 +40,22 @@ impl<'ctx, T: ModelingContext<'ctx>> AssignmentModel<'ctx, T> { |
40 | 40 | pub fn read_resolved(&'ctx self, vn: &ResolvedVarnode<'ctx>) -> Option<BV<'ctx>> { |
41 | 41 | self.final_state().and_then(|f| f.read_resolved(vn).ok()) |
42 | 42 | } |
| 43 | + |
| 44 | + pub fn print_trace_of_reg(&'ctx self, reg: &str) { |
| 45 | + let r = self.final_state().unwrap().get_register(reg).unwrap(); |
| 46 | + for gadget in &self.gadgets { |
| 47 | + let val = gadget.get_original_state().read_varnode(&r).unwrap(); |
| 48 | + println!("{} Before: {:?}",reg, self.model.eval(&val, false)); |
| 49 | + let val = gadget.get_final_state().read_varnode(&r).unwrap(); |
| 50 | + println!("{} After: {:?}",reg, self.model.eval(&val, false)); |
| 51 | + } |
| 52 | + } |
| 53 | + |
| 54 | + pub fn initial_reg(&'ctx self, reg: &str) -> Option<BV<'ctx>> { |
| 55 | + let r = self.final_state().unwrap().get_register(reg).unwrap(); |
| 56 | + let val = self.gadgets[0].get_original_state().read_varnode(&r).unwrap(); |
| 57 | + self.model.eval(&val, false) |
| 58 | + } |
43 | 59 | } |
44 | 60 |
|
45 | 61 | impl<'ctx, T: ModelingContext<'ctx> + Display> Display for AssignmentModel<'ctx, T> { |
|
0 commit comments