[docs]deflookup(self,opaque_ref):""" Lookups the object that was used for creating the reference. """opaque_ref_value=self._get_reference_value(opaque_ref)# check local refsifopaque_ref_valueinself.local_refs:returnself.local_refs[opaque_ref_value]# check global refsifopaque_ref_valueinself.global_refs:returnself.global_refs[opaque_ref_value]raiseKeyError("Unknown JNI reference %d. Local references: %s Global references: %s"%(opaque_ref_value,self.local_refs,self.global_refs))
[docs]defcreate_new_reference(self,obj,global_ref=False):""" Create a new reference thats maps to the given object. :param obj: Object which gets referenced. :param bool global_ref: Whether a local or global reference is created. """# get an unique addressopaque_ref=self.state.project.loader.extern_object.allocate()# map the object to that addressl.debug("Map %s to opaque reference 0x%x",obj,opaque_ref)ifglobal_ref:self.global_refs[opaque_ref]=objelse:self.local_refs[opaque_ref]=objreturnopaque_ref
[docs]defclear_local_references(self):""" Clear all local references. """self.local_refs={}
[docs]defdelete_reference(self,opaque_ref,global_ref=False):""" Delete the stored mapping of a reference. :param opaque_ref: Reference which should be removed. :param bool global_ref: Whether opaque_ref is a local or global reference. """opaque_ref_value=self._get_reference_value(opaque_ref)ifglobal_ref:delself.global_refs[opaque_ref_value]else:delself.local_refs[opaque_ref_value]
def_get_reference_value(self,opaque_ref):ifself.state.solver.symbolic(opaque_ref):raiseNotImplementedError("Opaque reference %s is symbolic."%opaque_ref.to_claripy())returnself.state.solver.eval(opaque_ref)@SimStatePlugin.memodefcopy(self,memo):# pylint: disable=unused-argumentreturnSimStateJNIReferences(local_refs=self.local_refs,global_refs=self.global_refs)
[docs]defmerge(self,others,merge_conditions,common_ancestor=None):# pylint: disable=unused-argumentl.warning("Merging is not implemented for JNI references!")returnFalse
[docs]defwiden(self,others):# pylint: disable=unused-argumentl.warning("Widening is not implemented for JNI references!")returnFalse
# TODO use a default JavaVM preset# see for reference: angr/engines/__init__.pySimState.register_default("jni_references",SimStateJNIReferences)