|
decompiler
1.0.0
|
Emulation based on (existing) PcodeOps and Varnodes. More...
#include <emulateutil.hh>
Public Member Functions | |
| EmulatePcodeOp (Architecture *g) | |
| Constructor. More... | |
| void | setCurrentOp (PcodeOp *op) |
| Establish the current PcodeOp being emulated. More... | |
| virtual Address | getExecuteAddress (void) const |
| Get the address of the current instruction being executed. | |
| virtual void | setVarnodeValue (Varnode *vn, uintb val)=0 |
| Given a specific Varnode, set the given value for it in the current machine state. More... | |
| virtual uintb | getVarnodeValue (Varnode *vn) const =0 |
| Given a specific Varnode, retrieve the current value for it from the machine state. More... | |
Public Member Functions inherited from Emulate | |
| Emulate (void) | |
| generic emulator constructor | |
| void | setHalt (bool val) |
| Set the halt state of the emulator. More... | |
| bool | getHalt (void) const |
| Get the halt state of the emulator. More... | |
| virtual void | setExecuteAddress (const Address &addr)=0 |
| Set the address of the next instruction to emulate. | |
| void | executeCurrentOp (void) |
| Do a single pcode op step. More... | |
Protected Member Functions | |
| virtual uintb | getLoadImageValue (AddrSpace *spc, uintb offset, int4 sz) const |
| Pull a value from the load-image given a specific address. More... | |
| virtual void | executeUnary (void) |
| Execute a unary arithmetic/logical operation. | |
| virtual void | executeBinary (void) |
| Execute a binary arithmetic/logical operation. | |
| virtual void | executeLoad (void) |
| Standard behavior for a p-code LOAD. | |
| virtual void | executeStore (void) |
| Standard behavior for a p-code STORE. | |
| virtual bool | executeCbranch (void) |
| Check if the conditional of a CBRANCH is true. More... | |
| virtual void | executeMultiequal (void) |
| Standard behavior for a MULTIEQUAL (phi-node) | |
| virtual void | executeIndirect (void) |
| Standard behavior for an INDIRECT op. | |
| virtual void | executeSegmentOp (void) |
| Behavior for a SEGMENTOP. | |
| virtual void | executeCpoolRef (void) |
| Standard behavior for a CPOOLREF (constant pool reference) op. | |
| virtual void | executeNew (void) |
| Standard behavior for (low-level) NEW op. | |
Protected Member Functions inherited from Emulate | |
| virtual void | executeBranch (void)=0 |
| Standard behavior for a BRANCH. More... | |
| virtual void | executeBranchind (void)=0 |
| Standard behavior for a BRANCHIND. | |
| virtual void | executeCall (void)=0 |
| Standard behavior for a p-code CALL. | |
| virtual void | executeCallind (void)=0 |
| Standard behavior for a CALLIND. | |
| virtual void | executeCallother (void)=0 |
| Standard behavior for a user-defined p-code op. | |
| virtual void | fallthruOp (void)=0 |
| Standard p-code fall-thru semantics. | |
Protected Attributes | |
| Architecture * | glb |
| The underlying Architecture for the program being emulated. | |
| PcodeOp * | currentOp |
| Current PcodeOp being executed. | |
| PcodeOp * | lastOp |
| Last PcodeOp that was executed. | |
Protected Attributes inherited from Emulate | |
| bool | emu_halted |
| Set to true if the emulator is halted. | |
| OpBehavior * | currentBehave |
| Behavior of the next op to execute. | |
Emulation based on (existing) PcodeOps and Varnodes.
This is still an abstract class. It does most of the work of emulating p-code using PcodeOp and Varnode objects (as opposed to PcodeOpRaw and VarnodeData). This class leaves implementation of control-flow to the derived class. This class implements most operations by going through new virtual methods:
The default executeLoad() implementation pulls values from the underlying LoadImage object. The following p-code ops are provided NULL implementations, as some tasks don't need hard emulation of them:
| EmulatePcodeOp::EmulatePcodeOp | ( | Architecture * | g | ) |
Constructor.
| g | is the Architecture providing the LoadImage |
|
protectedvirtual |
Check if the conditional of a CBRANCH is true.
This routine only checks if the condition for a p-code CBRANCH is true. It does not perform the actual branch.
Implements Emulate.
References currentOp, PcodeOp::getIn(), getVarnodeValue(), and PcodeOp::isBooleanFlip().
|
protectedvirtual |
Pull a value from the load-image given a specific address.
A contiguous chunk of memory is pulled from the load-image and returned as a constant value, respecting the endianess of the address space. The default implementation of this method pulls the value directly from the LoadImage object.
| spc | is the address space to pull the value from |
| offset | is the starting address offset (from within the space) to pull the value from |
| sz | is the number of bytes to pull from memory |
References byte_swap(), calc_mask(), glb, AddrSpace::isBigEndian(), Architecture::loader, and LoadImage::loadFill().
Referenced by executeLoad(), EmulateSnippet::executeLoad(), EmulateFunction::getVarnodeValue(), and EmulateSnippet::getVarnodeValue().
|
pure virtual |
Given a specific Varnode, retrieve the current value for it from the machine state.
This is the placeholder internal operation for obtaining a Varnode value during emulation. The value is loaded using the Varnode as the address and storage size.
| vn | is the specific Varnode |
Implemented in EmulateFunction.
Referenced by executeBinary(), EmulateSnippet::executeBinary(), executeCbranch(), EmulateSnippet::executeCbranch(), executeIndirect(), executeLoad(), EmulateSnippet::executeLoad(), executeMultiequal(), executeSegmentOp(), executeUnary(), EmulateSnippet::executeUnary(), getExecuteAddress(), and EmulateSnippet::setVarnodeValue().
|
inline |
Establish the current PcodeOp being emulated.
| op | is the PcodeOp that will next be executed via executeCurrentOp() |
References Emulate::currentBehave, TypeOp::getBehavior(), and PcodeOp::getOpcode().
Referenced by EmulateFunction::emulatePath(), EmulateSnippet::executeBranch(), EmulateSnippet::fallthruOp(), EmulateSnippet::resetMemory(), and EmulateSnippet::setExecuteAddress().
|
pure virtual |
Given a specific Varnode, set the given value for it in the current machine state.
This is the placeholder internal operation for setting a Varnode value during emulation. The value is stored using the Varnode as the address and storage size.
| vn | is the specific Varnode |
| val | is the constant value to store |
Implemented in EmulateFunction.
Referenced by executeBinary(), EmulateSnippet::executeBinary(), executeIndirect(), executeLoad(), EmulateSnippet::executeLoad(), executeMultiequal(), executeSegmentOp(), executeUnary(), EmulateSnippet::executeUnary(), and getExecuteAddress().
1.8.11