diff options
| author | Rusty Wagner <rusty@vector35.com> | 2015-05-19 03:24:43 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2015-05-19 03:24:43 -0400 |
| commit | 8a1b1bb5e3bd19dd50787bdb9616de56fea8ce00 (patch) | |
| tree | dea0b13e0c05a31198edc757d0bcbde85d6238ff /architecture.cpp | |
| parent | a4461126be25670aa4339e269270f5107b99439a (diff) | |
Quick patches in right click menu
Diffstat (limited to 'architecture.cpp')
| -rw-r--r-- | architecture.cpp | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/architecture.cpp b/architecture.cpp index 268fcece..da18e9c1 100644 --- a/architecture.cpp +++ b/architecture.cpp @@ -115,6 +115,69 @@ bool Architecture::AssembleCallback(void* ctxt, const char* code, uint64_t addr, } +bool Architecture::IsNeverBranchPatchAvailableCallback(void* ctxt, const uint8_t* data, uint64_t addr, size_t len) +{ + Architecture* arch = (Architecture*)ctxt; + return arch->IsNeverBranchPatchAvailable(data, addr, len); +} + + +bool Architecture::IsAlwaysBranchPatchAvailableCallback(void* ctxt, const uint8_t* data, uint64_t addr, size_t len) +{ + Architecture* arch = (Architecture*)ctxt; + return arch->IsAlwaysBranchPatchAvailable(data, addr, len); +} + + +bool Architecture::IsInvertBranchPatchAvailableCallback(void* ctxt, const uint8_t* data, uint64_t addr, size_t len) +{ + Architecture* arch = (Architecture*)ctxt; + return arch->IsInvertBranchPatchAvailable(data, addr, len); +} + + +bool Architecture::IsSkipAndReturnZeroPatchAvailableCallback(void* ctxt, const uint8_t* data, uint64_t addr, size_t len) +{ + Architecture* arch = (Architecture*)ctxt; + return arch->IsSkipAndReturnZeroPatchAvailable(data, addr, len); +} + + +bool Architecture::IsSkipAndReturnValuePatchAvailableCallback(void* ctxt, const uint8_t* data, uint64_t addr, size_t len) +{ + Architecture* arch = (Architecture*)ctxt; + return arch->IsSkipAndReturnValuePatchAvailable(data, addr, len); +} + + +bool Architecture::ConvertToNopCallback(void* ctxt, uint8_t* data, uint64_t addr, size_t len) +{ + Architecture* arch = (Architecture*)ctxt; + return arch->ConvertToNop(data, addr, len); +} + + +bool Architecture::AlwaysBranchCallback(void* ctxt, uint8_t* data, uint64_t addr, size_t len) +{ + Architecture* arch = (Architecture*)ctxt; + return arch->AlwaysBranch(data, addr, len); +} + + +bool Architecture::InvertBranchCallback(void* ctxt, uint8_t* data, uint64_t addr, size_t len) +{ + Architecture* arch = (Architecture*)ctxt; + return arch->InvertBranch(data, addr, len); +} + + +bool Architecture::SkipAndReturnValueCallback(void* ctxt, uint8_t* data, uint64_t addr, size_t len, uint64_t value) +{ + Architecture* arch = (Architecture*)ctxt; + return arch->SkipAndReturnValue(data, addr, len, value); +} + + void Architecture::Register(Architecture* arch) { BNCustomArchitecture callbacks; @@ -125,6 +188,15 @@ void Architecture::Register(Architecture* arch) callbacks.getInstructionText = GetInstructionTextCallback; callbacks.freeInstructionText = FreeInstructionTextCallback; callbacks.assemble = AssembleCallback; + callbacks.isNeverBranchPatchAvailable = IsNeverBranchPatchAvailableCallback; + callbacks.isAlwaysBranchPatchAvailable = IsAlwaysBranchPatchAvailableCallback; + callbacks.isInvertBranchPatchAvailable = IsInvertBranchPatchAvailableCallback; + callbacks.isSkipAndReturnZeroPatchAvailable = IsSkipAndReturnZeroPatchAvailableCallback; + callbacks.isSkipAndReturnValuePatchAvailable = IsSkipAndReturnValuePatchAvailableCallback; + callbacks.convertToNop = ConvertToNopCallback; + callbacks.alwaysBranch = AlwaysBranchCallback; + callbacks.invertBranch = InvertBranchCallback; + callbacks.skipAndReturnValue = SkipAndReturnValueCallback; arch->m_arch = BNRegisterArchitecture(arch->m_nameForRegister.c_str(), &callbacks); } @@ -162,6 +234,67 @@ string Architecture::GetName() const } +bool Architecture::Assemble(const std::string&, uint64_t, DataBuffer&, std::string& errors) +{ + errors = "Architecture does not implement an assembler.\n"; + return false; +} + + +bool Architecture::IsNeverBranchPatchAvailable(const uint8_t*, uint64_t, size_t) +{ + return false; +} + + +bool Architecture::IsAlwaysBranchPatchAvailable(const uint8_t*, uint64_t, size_t) +{ + return false; +} + + +bool Architecture::IsInvertBranchPatchAvailable(const uint8_t*, uint64_t, size_t) +{ + return false; +} + + +bool Architecture::IsSkipAndReturnZeroPatchAvailable(const uint8_t*, uint64_t, size_t) +{ + return false; +} + + +bool Architecture::IsSkipAndReturnValuePatchAvailable(const uint8_t*, uint64_t, size_t) +{ + return false; +} + + +bool Architecture::ConvertToNop(uint8_t*, uint64_t, size_t) +{ + return false; +} + + +bool Architecture::AlwaysBranch(uint8_t*, uint64_t, size_t) +{ + return false; +} + + +bool Architecture::InvertBranch(uint8_t*, uint64_t, size_t) +{ + return false; +} + + +bool Architecture::SkipAndReturnValue(uint8_t*, uint64_t, size_t, uint64_t) +{ + return false; +} + + CoreArchitecture::CoreArchitecture(BNArchitecture* arch): Architecture(arch) { } @@ -211,3 +344,57 @@ bool CoreArchitecture::Assemble(const string& code, uint64_t addr, DataBuffer& r } return ok; } + + +bool CoreArchitecture::IsNeverBranchPatchAvailable(const uint8_t* data, uint64_t addr, size_t len) +{ + return BNIsArchitectureNeverBranchPatchAvailable(m_arch, data, addr, len); +} + + +bool CoreArchitecture::IsAlwaysBranchPatchAvailable(const uint8_t* data, uint64_t addr, size_t len) +{ + return BNIsArchitectureAlwaysBranchPatchAvailable(m_arch, data, addr, len); +} + + +bool CoreArchitecture::IsInvertBranchPatchAvailable(const uint8_t* data, uint64_t addr, size_t len) +{ + return BNIsArchitectureInvertBranchPatchAvailable(m_arch, data, addr, len); +} + + +bool CoreArchitecture::IsSkipAndReturnZeroPatchAvailable(const uint8_t* data, uint64_t addr, size_t len) +{ + return BNIsArchitectureSkipAndReturnZeroPatchAvailable(m_arch, data, addr, len); +} + + +bool CoreArchitecture::IsSkipAndReturnValuePatchAvailable(const uint8_t* data, uint64_t addr, size_t len) +{ + return BNIsArchitectureSkipAndReturnValuePatchAvailable(m_arch, data, addr, len); +} + + +bool CoreArchitecture::ConvertToNop(uint8_t* data, uint64_t addr, size_t len) +{ + return BNArchitectureConvertToNop(m_arch, data, addr, len); +} + + +bool CoreArchitecture::AlwaysBranch(uint8_t* data, uint64_t addr, size_t len) +{ + return BNArchitectureAlwaysBranch(m_arch, data, addr, len); +} + + +bool CoreArchitecture::InvertBranch(uint8_t* data, uint64_t addr, size_t len) +{ + return BNArchitectureInvertBranch(m_arch, data, addr, len); +} + + +bool CoreArchitecture::SkipAndReturnValue(uint8_t* data, uint64_t addr, size_t len, uint64_t value) +{ + return BNArchitectureSkipAndReturnValue(m_arch, data, addr, len, value); +} |
