decompiler  1.0.0
Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
PcodeInjectLibrary Class Referenceabstract

A collection of p-code injection payloads. More...

#include <pcodeinject.hh>

Inheritance diagram for PcodeInjectLibrary:
PcodeInjectLibraryGhidra

Public Member Functions

 PcodeInjectLibrary (Architecture *g, uintb tmpbase)
 Constructor.
 
virtual ~PcodeInjectLibrary (void)
 Destructor.
 
uintb getUniqueBase (void) const
 Get the (current) offset for building temporary registers.
 
int4 getPayloadId (int4 type, const string &nm) const
 Map name and type to the payload id. More...
 
InjectPayloadgetPayload (int4 id) const
 Get the InjectPayload by id.
 
string getCallFixupName (int4 injectid) const
 Get the call-fixup name associated with an id. More...
 
string getCallOtherTarget (int4 injectid) const
 Get the callother-fixup name associated with an id. More...
 
string getCallMechanismName (int4 injectid) const
 Get the call mechanism name associated with an id. More...
 
int4 restoreXmlInject (const string &src, const string &nm, int4 tp, const Element *el)
 Read in and register an injection payload from an XML stream. More...
 
virtual void restoreDebug (const Element *el)
 A method for reading in p-code generated externally for use in debugging. More...
 
virtual int4 manualCallFixup (const string &name, const string &snippetstring)=0
 Manually add a call-fixup payload given a compilable snippet of p-code source. More...
 
virtual int4 manualCallOtherFixup (const string &name, const string &outname, const vector< string > &inname, const string &snippet)=0
 Manually add a callother-fixup payload given a compilable snippet of p-code source. More...
 
virtual InjectContextgetCachedContext (void)=0
 Retrieve a reusable context object for this library. More...
 
virtual const vector< OpBehavior * > & getBehaviors (void)=0
 Get the array of op-code behaviors for initializing and emulator. More...
 

Protected Member Functions

void registerCallFixup (const string &fixupName, int4 injectid)
 Map a call-fixup name to a payload id. More...
 
void registerCallOtherFixup (const string &fixupName, int4 injectid)
 Map a callother-fixup name to a payload id. More...
 
void registerCallMechanism (const string &fixupName, int4 injectid)
 Map a call mechanism name to a payload id. More...
 
void registerExeScript (const string &scriptName, int4 injectid)
 Map a p-code script name to a payload id. More...
 
virtual int4 allocateInject (const string &sourceName, const string &name, int4 type)=0
 Allocate a new InjectPayload object. More...
 
virtual void registerInject (int4 injectid)=0
 Finalize a payload within the library, once the payload is initialized. More...
 

Protected Attributes

Architectureglb
 The Architecture to which the injection payloads apply.
 
uintb tempbase
 Offset within unique space for allocating temporaries within a payload.
 
vector< InjectPayload * > injection
 Registered injections.
 
map< string, int4 > callFixupMap
 Map of registered call-fixup names to injection id.
 
map< string, int4 > callOtherFixupMap
 Map of registered callother-fixup names to injection id.
 
map< string, int4 > callMechFixupMap
 Map of registered mechanism names to injection id.
 
map< string, int4 > scriptMap
 Map of registered script names to ExecutablePcode id.
 
vector< string > callFixupNames
 Map from injectid to call-fixup name.
 
vector< string > callOtherTarget
 Map from injectid to callother-fixup target-op name.
 
vector< string > callMechTarget
 Map from injectid to call-mech name.
 
vector< string > scriptNames
 Map from injectid to script name.
 

Detailed Description

A collection of p-code injection payloads.

This is a container of InjectPayload objects that can be applied for a specific Architecture. Payloads can be read in via XML (restoreXmlInject()) and manually via manualCallFixup() and manualCallOtherFixup(). Each payload is assigned an integer id when it is read in, and getPayload() fetches the payload during analysis. The library also associates the formal names of payloads with the id. Payloads of different types, CALLFIXUP_TYPE, CALLOTHERFIXUP_TYPE, etc., are stored in separate namespaces.

This is an abstract base class. The derived classes determine the type of storage used by the payloads. The library also provides a reusable InjectContext object to match the payloads, which can be obtained via getCachedContext().

Member Function Documentation

virtual int4 PcodeInjectLibrary::allocateInject ( const string &  sourceName,
const string &  name,
int4  type 
)
protectedpure virtual

Allocate a new InjectPayload object.

This acts as an InjectPayload factory. The formal name and type of the payload are given, this library allocates a new object that fits with its storage scheme and returns the id.

Parameters
sourceNameis a string describing the source of the new payload
nameis the formal name of the payload
typeis the formal type (CALLFIXUP_TYPE, CALLOTHERFIXUP_TYPE, etc.) of the payload
Returns
the id associated with the new InjectPayload object

Implemented in PcodeInjectLibraryGhidra.

virtual const vector<OpBehavior *>& PcodeInjectLibrary::getBehaviors ( void  )
pure virtual

Get the array of op-code behaviors for initializing and emulator.

Behaviors are pulled from the underlying architecture in order to initialize the Emulate object which services the p-code script payloads.

Returns
the array of OpBehavior objects indexed by op-code

Implemented in PcodeInjectLibraryGhidra.

Referenced by ExecutablePcode::build().

virtual InjectContext& PcodeInjectLibrary::getCachedContext ( void  )
pure virtual

Retrieve a reusable context object for this library.

The object returned by this method gets passed to the payload inject() method. The clear() method must be called between uses.

Returns
the cached context object

Implemented in PcodeInjectLibraryGhidra.

Referenced by ExecutablePcode::build(), Funcdata::doLiveInject(), FlowInfo::injectSubFunction(), and FlowInfo::injectUserOp().

string PcodeInjectLibrary::getCallFixupName ( int4  injectid) const

Get the call-fixup name associated with an id.

Parameters
injectidis an integer id of a call-fixup payload
Returns
the name of the payload or the empty string

Referenced by FlowInfo::injectPcode(), and FuncProto::saveXml().

string PcodeInjectLibrary::getCallMechanismName ( int4  injectid) const

Get the call mechanism name associated with an id.

Parameters
injectidis an integer id of a call mechanism payload
Returns
the name of the payload or the empty string
string PcodeInjectLibrary::getCallOtherTarget ( int4  injectid) const

Get the callother-fixup name associated with an id.

Parameters
injectidis an integer id of a callother-fixup payload
Returns
the name of the payload or the empty string

Referenced by InjectedUserOp::restoreXml().

int4 PcodeInjectLibrary::getPayloadId ( int4  type,
const string &  nm 
) const

Map name and type to the payload id.

The given name is looked up in a symbol table depending on the given type. The integer id of the matching InjectPayload is returned.

Parameters
typeis the payload type
nmis the formal name of the payload
Returns
the payload id or -1 if there is no matching payload

References InjectPayload::CALLFIXUP_TYPE, InjectPayload::CALLMECHANISM_TYPE, and InjectPayload::CALLOTHERFIXUP_TYPE.

Referenced by FuncProto::restoreXml().

virtual int4 PcodeInjectLibrary::manualCallFixup ( const string &  name,
const string &  snippetstring 
)
pure virtual

Manually add a call-fixup payload given a compilable snippet of p-code source.

The snippet is compiled immediately to produce the payload.

Parameters
nameis the formal name of the new payload
snippetstringis the compilable snippet of p-code source
Returns
the id of the new payload

Implemented in PcodeInjectLibraryGhidra.

virtual int4 PcodeInjectLibrary::manualCallOtherFixup ( const string &  name,
const string &  outname,
const vector< string > &  inname,
const string &  snippet 
)
pure virtual

Manually add a callother-fixup payload given a compilable snippet of p-code source.

The snippet is compiled immediately to produce the payload. Symbol names for input and output parameters must be provided to the compiler.

Parameters
nameis the formal name of the new payload
outnameis the name of the output symbol
innameis the ordered list of input symbol names
snippetis the compilable snippet of p-code source
Returns
the id of the new payload

Implemented in PcodeInjectLibraryGhidra.

Referenced by UserOpManage::manualCallOtherFixup().

void PcodeInjectLibrary::registerCallFixup ( const string &  fixupName,
int4  injectid 
)
protected

Map a call-fixup name to a payload id.

Parameters
fixupNameis the formal name of the call-fixup
injectidis the integer id
void PcodeInjectLibrary::registerCallMechanism ( const string &  fixupName,
int4  injectid 
)
protected

Map a call mechanism name to a payload id.

Parameters
fixupNameis the formal name of the call mechanism
injectidis the integer id
void PcodeInjectLibrary::registerCallOtherFixup ( const string &  fixupName,
int4  injectid 
)
protected

Map a callother-fixup name to a payload id.

Parameters
fixupNameis the formal name of the callother-fixup
injectidis the integer id
void PcodeInjectLibrary::registerExeScript ( const string &  scriptName,
int4  injectid 
)
protected

Map a p-code script name to a payload id.

Parameters
scriptNameis the formal name of the p-code script
injectidis the integer id
virtual void PcodeInjectLibrary::registerInject ( int4  injectid)
protectedpure virtual

Finalize a payload within the library, once the payload is initialized.

This provides the derived class the opportunity to add the payload name to the symbol tables or do anything else it needs to once the InjectPayload object has been fully initialized.

Parameters
injectidis the id of the InjectPayload to finalize

Implemented in PcodeInjectLibraryGhidra.

virtual void PcodeInjectLibrary::restoreDebug ( const Element el)
inlinevirtual

A method for reading in p-code generated externally for use in debugging.

Instantiate a special InjectPayloadDynamic object initialized with an <injectdebug> tag. Within the library, this replaces the original InjectPayload, allowing its p-code to be replayed for debugging purposes.

Parameters
elis the <injectdebug> element

References InjectParameter::name.

int4 PcodeInjectLibrary::restoreXmlInject ( const string &  src,
const string &  nm,
int4  tp,
const Element el 
)

Read in and register an injection payload from an XML stream.

The root XML element describing the payload is given (<pcode>, <callfixup> <callotherfixup>, etc.), the InjectPayload is allocated and then initialized using the element. Then the InjectPayload is finalized with the library.

Parameters
srcis a string describing the source of the payload being restored
nmis the name of the payload
tpis the type of the payload (CALLFIXUP_TYPE, EXECUTABLEPCODE_TYPE, etc.)
elis the given XML element
Returns
the id of the newly registered payload

Referenced by InjectedUserOp::restoreXml(), SegmentOp::restoreXml(), and JumpAssistOp::restoreXml().


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