1- use std:: collections:: HashMap ;
2- use std:: sync:: Arc ;
3-
1+ use crate :: error:: CrackersError ;
2+ use crate :: synthesis:: builder:: { StateConstraintGenerator , TransitionConstraintGenerator } ;
43use jingle:: modeling:: { ModeledBlock , ModelingContext , State } ;
54use jingle:: sleigh:: { IndirectVarNode , RegisterManager , SpaceManager , VarNode } ;
65use jingle:: varnode:: { ResolvedIndirectVarNode , ResolvedVarnode } ;
6+ use jingle:: JingleContext ;
77use serde:: { Deserialize , Serialize } ;
8+ use std:: collections:: HashMap ;
9+ use std:: sync:: Arc ;
810use tracing:: { event, Level } ;
911use z3:: ast:: { Ast , Bool , BV } ;
10- use z3:: Context ;
11-
12- use crate :: error:: CrackersError ;
13- use crate :: synthesis:: builder:: { StateConstraintGenerator , TransitionConstraintGenerator } ;
1412
1513#[ derive( Clone , Debug , Deserialize , Serialize ) ]
1614pub struct Constraint {
@@ -122,14 +120,14 @@ pub struct PointerRange {
122120/// Generates a state constraint that a given varnode must be equal to a given value
123121pub fn gen_memory_constraint (
124122 m : MemoryEqualityConstraint ,
125- ) -> impl for <' a , ' b > Fn ( & ' a Context , & ' b State < ' a > , u64 ) -> Result < Bool < ' a > , CrackersError >
123+ ) -> impl for < ' a , > Fn ( & JingleContext < ' a > , & State < ' a > , u64 ) -> Result < Bool < ' a > , CrackersError >
126124 + Send
127125 + Sync
128126 + Clone
129127 + ' static {
130- return move |z3 , state, _addr| {
128+ return move |jingle , state, _addr| {
131129 let data = state. read_varnode ( & state. varnode ( & m. space , m. address , m. size ) . unwrap ( ) ) ?;
132- let constraint = data. _eq ( & BV :: from_u64 ( z3, m. value as u64 , data. get_size ( ) ) ) ;
130+ let constraint = data. _eq ( & BV :: from_u64 ( jingle . z3 , m. value as u64 , data. get_size ( ) ) ) ;
133131 Ok ( constraint)
134132 } ;
135133}
@@ -139,14 +137,14 @@ pub fn gen_memory_constraint(
139137pub fn gen_register_constraint (
140138 vn : VarNode ,
141139 value : u64 ,
142- ) -> impl for <' a , ' b > Fn ( & ' a Context , & ' b State < ' a > , u64 ) -> Result < Bool < ' a > , CrackersError >
140+ ) -> impl for < ' a > Fn ( & JingleContext < ' a > , & State < ' a > , u64 ) -> Result < Bool < ' a > , CrackersError >
143141 + ' static
144142 + Send
145143 + Sync
146144 + Clone {
147- return move |z3 , state, _addr| {
145+ return move |jingle , state, _addr| {
148146 let data = state. read_varnode ( & vn) ?;
149- let constraint = data. _eq ( & BV :: from_u64 ( z3, value, data. get_size ( ) ) ) ;
147+ let constraint = data. _eq ( & BV :: from_u64 ( jingle . z3 , value, data. get_size ( ) ) ) ;
150148 Ok ( constraint)
151149 } ;
152150}
@@ -157,14 +155,14 @@ pub fn gen_register_pointer_constraint<'ctx>(
157155 vn : VarNode ,
158156 value : String ,
159157 m : Option < PointerRangeConstraints > ,
160- ) -> impl for <' a , ' b > Fn ( & ' a Context , & ' b State < ' a > , u64 ) -> Result < Bool < ' a > , CrackersError > + ' ctx + Clone
158+ ) -> impl for < ' a > Fn ( & JingleContext < ' a > , & State < ' a > , u64 ) -> Result < Bool < ' a > , CrackersError > + ' ctx + Clone
161159{
162- return move |z3 , state, _addr| {
160+ return move |jingle , state, _addr| {
163161 let m = m. clone ( ) ;
164162 let val = value
165163 . as_bytes ( )
166164 . iter ( )
167- . map ( |b| BV :: from_u64 ( z3, * b as u64 , 8 ) )
165+ . map ( |b| BV :: from_u64 ( jingle . z3 , * b as u64 , 8 ) )
168166 . reduce ( |a, b| a. concat ( & b) )
169167 . unwrap ( ) ;
170168 let pointer = state. read_varnode ( & vn) ?;
@@ -182,9 +180,9 @@ pub fn gen_register_pointer_constraint<'ctx>(
182180 let mut constraint = data. _eq ( & val) ;
183181 if let Some ( c) = m. and_then ( |m| m. read ) {
184182 let callback = gen_pointer_range_state_invariant ( c) ;
185- let cc = callback ( z3 , & resolved, state) ?;
183+ let cc = callback ( jingle , & resolved, state) ?;
186184 if let Some ( b) = cc {
187- constraint = Bool :: and ( z3, & [ constraint, b] )
185+ constraint = Bool :: and ( jingle . z3 , & [ constraint, b] )
188186 }
189187 }
190188 Ok ( constraint)
@@ -195,14 +193,14 @@ pub fn gen_register_pointer_constraint<'ctx>(
195193/// the given range.
196194pub fn gen_pointer_range_state_invariant < ' ctx > (
197195 m : Vec < PointerRange > ,
198- ) -> impl for <' a , ' b > Fn (
199- & ' a Context ,
200- & ' b ResolvedVarnode < ' a > ,
201- & ' b State < ' a > ,
196+ ) -> impl for < ' a > Fn (
197+ & JingleContext < ' a > ,
198+ & ResolvedVarnode < ' a > ,
199+ & State < ' a > ,
202200) -> Result < Option < Bool < ' a > > , CrackersError >
203201 + ' ctx
204202 + Clone {
205- return move |z3 , vn, state| {
203+ return move |jingle , vn, state| {
206204 match vn {
207205 ResolvedVarnode :: Direct ( d) => {
208206 // todo: this is gross
@@ -213,51 +211,51 @@ pub fn gen_pointer_range_state_invariant<'ctx>(
213211 let bool = m
214212 . iter ( )
215213 . any ( |mm| d. offset >= mm. min && ( d. offset + d. size as u64 ) <= mm. max ) ;
216- Ok ( Some ( Bool :: from_bool ( z3, bool) ) )
214+ Ok ( Some ( Bool :: from_bool ( jingle . z3 , bool) ) )
217215 }
218216 }
219217 }
220218 ResolvedVarnode :: Indirect ( vn) => {
221219 let mut terms = vec ! [ ] ;
222220 for mm in & m {
223- let min = BV :: from_u64 ( z3, mm. min , vn. pointer . get_size ( ) ) ;
224- let max = BV :: from_u64 ( z3, mm. max , vn. pointer . get_size ( ) ) ;
221+ let min = BV :: from_u64 ( jingle . z3 , mm. min , vn. pointer . get_size ( ) ) ;
222+ let max = BV :: from_u64 ( jingle . z3 , mm. max , vn. pointer . get_size ( ) ) ;
225223 let constraint =
226- Bool :: and ( z3, & [ vn. pointer . bvuge ( & min) , vn. pointer . bvule ( & max) ] ) ;
224+ Bool :: and ( jingle . z3 , & [ vn. pointer . bvuge ( & min) , vn. pointer . bvule ( & max) ] ) ;
227225 terms. push ( constraint) ;
228226 }
229227
230- Ok ( Some ( Bool :: or ( z3, terms. as_slice ( ) ) ) )
228+ Ok ( Some ( Bool :: or ( jingle . z3 , terms. as_slice ( ) ) ) )
231229 }
232230 }
233231 } ;
234232}
235233
236234pub fn gen_pointer_range_transition_invariant (
237235 m : PointerRangeConstraints ,
238- ) -> impl for <' a , ' b > Fn ( & ' a Context , & ' b ModeledBlock < ' a > ) -> Result < Option < Bool < ' a > > , CrackersError >
236+ ) -> impl for < ' a > Fn ( & JingleContext < ' a > , & ModeledBlock < ' a > ) -> Result < Option < Bool < ' a > > , CrackersError >
239237 + Send
240238 + Sync
241239 + Clone
242240 + ' static {
243- return move |z3 , block| {
241+ return move |jingle , block| {
244242 let mut bools = vec ! [ ] ;
245243 if let Some ( r) = & m. read {
246244 let inv = gen_pointer_range_state_invariant ( r. clone ( ) ) ;
247245 for x in block. get_inputs ( ) {
248- if let Some ( c) = inv ( z3 , & x, block. get_final_state ( ) ) ? {
246+ if let Some ( c) = inv ( jingle , & x, block. get_final_state ( ) ) ? {
249247 bools. push ( c) ;
250248 }
251249 }
252250 }
253251 if let Some ( r) = & m. write {
254252 let inv = gen_pointer_range_state_invariant ( r. clone ( ) ) ;
255253 for x in block. get_outputs ( ) {
256- if let Some ( c) = inv ( z3 , & x, block. get_final_state ( ) ) ? {
254+ if let Some ( c) = inv ( jingle , & x, block. get_final_state ( ) ) ? {
257255 bools. push ( c) ;
258256 }
259257 }
260258 }
261- Ok ( Some ( Bool :: and ( z3, & bools) ) )
259+ Ok ( Some ( Bool :: and ( jingle . z3 , & bools) ) )
262260 } ;
263261}
0 commit comments