summaryrefslogtreecommitdiff
path: root/architecture.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2015-05-19 03:24:43 -0400
committerRusty Wagner <rusty@vector35.com>2015-05-19 03:24:43 -0400
commit8a1b1bb5e3bd19dd50787bdb9616de56fea8ce00 (patch)
treedea0b13e0c05a31198edc757d0bcbde85d6238ff /architecture.cpp
parenta4461126be25670aa4339e269270f5107b99439a (diff)
Quick patches in right click menu
Diffstat (limited to 'architecture.cpp')
-rw-r--r--architecture.cpp187
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);
+}