decompiler 1.0.0
Public Member Functions | Protected Member Functions | Private Member Functions | Private Attributes | List of all members
ghidra::PcodeInjectLibrarySleigh Class Reference

An implementation of an injection library using the internal SLEIGH engine to build payloads. More...

#include <inject_sleigh.hh>

Inheritance diagram for ghidra::PcodeInjectLibrarySleigh:
ghidra::PcodeInjectLibrary

Public Member Functions

 PcodeInjectLibrarySleigh (Architecture *g)
 Constructor.
 
virtual void decodeDebug (Decoder &decoder)
 A method for parsing p-code generated externally for use in debugging.
 
virtual int4 manualCallFixup (const string &name, const string &snippetstring)
 Manually add a call-fixup payload given a compilable snippet of p-code source.
 
virtual int4 manualCallOtherFixup (const string &name, const string &outname, const vector< string > &inname, const string &snippet)
 Manually add a callother-fixup payload given a compilable snippet of p-code source.
 
virtual InjectContextgetCachedContext (void)
 Retrieve a reusable context object for this library.
 
virtual const vector< OpBehavior * > & getBehaviors (void)
 Get the array of op-code behaviors for initializing and emulator.
 
- Public Member Functions inherited from ghidra::PcodeInjectLibrary
 PcodeInjectLibrary (Architecture *g, uint4 tmpbase)
 Constructor.
 
virtual ~PcodeInjectLibrary (void)
 Destructor.
 
uint4 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.
 
InjectPayloadgetPayload (int4 id) const
 Get the InjectPayload by id.
 
string getCallFixupName (int4 injectid) const
 Get the call-fixup name associated with an id.
 
string getCallOtherTarget (int4 injectid) const
 Get the callother-fixup name associated with an id.
 
string getCallMechanismName (int4 injectid) const
 Get the call mechanism name associated with an id.
 
int4 decodeInject (const string &src, const string &suffix, int4 tp, Decoder &decoder)
 Parse and register an injection payload from a stream element.
 

Protected Member Functions

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

Private Member Functions

InjectPayloadDynamicforceDebugDynamic (int4 injectid)
 Force a payload to be dynamic for debug purposes.
 
void parseInject (InjectPayload *payload)
 Convert SLEIGH syntax to p-code templates for the given InjectPayload.
 

Private Attributes

const SleighBaseslgh
 The SLEIGH engine for parsing payloads.
 
vector< OpBehavior * > inst
 P-code behaviors used for p-code scripts.
 
InjectContextSleigh contextCache
 Reusable context for emitting p-code payloads.
 

Additional Inherited Members

- Protected Attributes inherited from ghidra::PcodeInjectLibrary
Architectureglb
 The Architecture to which the injection payloads apply.
 
uint4 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

An implementation of an injection library using the internal SLEIGH engine to build payloads.

Payloads from compiler specs and other sources are parsed as SLEIGH syntax and stored internally as InjectPayloadSleigh objects.

Member Function Documentation

◆ allocateInject()

int4 ghidra::PcodeInjectLibrarySleigh::allocateInject ( const string &  sourceName,
const string &  name,
int4  type 
)
protectedvirtual

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

Implements ghidra::PcodeInjectLibrary.

References ghidra::InjectPayload::CALLFIXUP_TYPE, ghidra::InjectPayload::CALLOTHERFIXUP_TYPE, ghidra::InjectPayload::EXECUTABLEPCODE_TYPE, ghidra::PcodeInjectLibrary::glb, and ghidra::PcodeInjectLibrary::injection.

Referenced by manualCallFixup(), and manualCallOtherFixup().

◆ decodeDebug()

void ghidra::PcodeInjectLibrarySleigh::decodeDebug ( Decoder decoder)
virtual

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

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

Parameters
decoderis the stream decoder

Reimplemented from ghidra::PcodeInjectLibrary.

References ghidra::Decoder::closeElement(), ghidra::InjectPayloadDynamic::decodeEntry(), forceDebugDynamic(), ghidra::PcodeInjectLibrary::getPayload(), ghidra::PcodeInjectLibrary::getPayloadId(), ghidra::Decoder::openElement(), ghidra::Decoder::readSignedInteger(), and ghidra::Decoder::readString().

◆ forceDebugDynamic()

InjectPayloadDynamic * ghidra::PcodeInjectLibrarySleigh::forceDebugDynamic ( int4  injectid)
private

Force a payload to be dynamic for debug purposes.

Debug information may include inject information for payloads that aren't dynamic. We substitute a dynamic payload so that analysis uses the debug info to inject, rather than the hard-coded payload information.

Parameters
injectidis the id of the payload to treat dynamic
Returns
the new dynamic payload object

References ghidra::PcodeInjectLibrary::glb, and ghidra::PcodeInjectLibrary::injection.

Referenced by decodeDebug().

◆ getBehaviors()

const vector< OpBehavior * > & ghidra::PcodeInjectLibrarySleigh::getBehaviors ( void  )
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

Implements ghidra::PcodeInjectLibrary.

References ghidra::Architecture::collectBehaviors(), ghidra::PcodeInjectLibrary::glb, and inst.

◆ getCachedContext()

virtual InjectContext & ghidra::PcodeInjectLibrarySleigh::getCachedContext ( void  )
inlinevirtual

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

Implements ghidra::PcodeInjectLibrary.

References contextCache.

◆ manualCallFixup()

int4 ghidra::PcodeInjectLibrarySleigh::manualCallFixup ( const string &  name,
const string &  snippetstring 
)
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

Implements ghidra::PcodeInjectLibrary.

References allocateInject(), ghidra::InjectPayload::CALLFIXUP_TYPE, ghidra::PcodeInjectLibrary::getPayload(), ghidra::InjectPayloadSleigh::parsestring, and registerInject().

◆ manualCallOtherFixup()

int4 ghidra::PcodeInjectLibrarySleigh::manualCallOtherFixup ( const string &  name,
const string &  outname,
const vector< string > &  inname,
const string &  snippet 
)
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

Implements ghidra::PcodeInjectLibrary.

References allocateInject(), ghidra::InjectPayload::CALLOTHERFIXUP_TYPE, ghidra::PcodeInjectLibrary::getPayload(), ghidra::InjectPayload::inputlist, ghidra::InjectPayload::orderParameters(), ghidra::InjectPayload::output, ghidra::InjectPayloadSleigh::parsestring, and registerInject().

◆ parseInject()

void ghidra::PcodeInjectLibrarySleigh::parseInject ( InjectPayload payload)
private

◆ registerInject()

void ghidra::PcodeInjectLibrarySleigh::registerInject ( int4  injectid)
protectedvirtual

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