Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions architecture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -762,6 +762,13 @@ BNArchitecture* Architecture::GetAssociatedArchitectureByAddressCallback(void* c
}


uint64_t Architecture::EncodeFunctionPointerCallback(void* ctxt, uint64_t* addr)
{
CallbackRef<Architecture> arch(ctxt);
return arch->EncodeFunctionPointer(*addr);
}


bool Architecture::GetInstructionInfoCallback(
void* ctxt, const uint8_t* data, uint64_t addr, size_t maxLen, BNInstructionInfo* result)
{
Expand Down Expand Up @@ -1350,6 +1357,7 @@ void Architecture::Register(Architecture* arch)
callbacks.getMaxInstructionLength = GetMaxInstructionLengthCallback;
callbacks.getOpcodeDisplayLength = GetOpcodeDisplayLengthCallback;
callbacks.getAssociatedArchitectureByAddress = GetAssociatedArchitectureByAddressCallback;
callbacks.encodeFunctionPointer = EncodeFunctionPointerCallback;
callbacks.getInstructionInfo = GetInstructionInfoCallback;
callbacks.getInstructionText = GetInstructionTextCallback;
callbacks.getInstructionTextWithContext = GetInstructionTextWithContextCallback;
Expand Down Expand Up @@ -1493,6 +1501,12 @@ Ref<Architecture> Architecture::GetAssociatedArchitectureByAddress(uint64_t&)
}


uint64_t Architecture::EncodeFunctionPointer(uint64_t& addr)
{
return addr;
}


bool Architecture::GetInstructionLowLevelIL(const uint8_t*, uint64_t, size_t&, LowLevelILFunction& il)
{
il.AddInstruction(il.Undefined());
Expand Down Expand Up @@ -2070,6 +2084,12 @@ Ref<Architecture> CoreArchitecture::GetAssociatedArchitectureByAddress(uint64_t&
}


uint64_t CoreArchitecture::EncodeFunctionPointer(uint64_t& addr)
{
return BNArchitectureEncodeFunctionPointer(m_object, &addr);
}


bool CoreArchitecture::GetInstructionInfo(const uint8_t* data, uint64_t addr, size_t maxLen, InstructionInfo& result)
{
return BNGetInstructionInfo(m_object, data, addr, maxLen, &result);
Expand Down Expand Up @@ -2634,6 +2654,12 @@ Ref<Architecture> ArchitectureExtension::GetAssociatedArchitectureByAddress(uint
}


uint64_t ArchitectureExtension::EncodeFunctionPointer(uint64_t& addr)
{
return m_base->EncodeFunctionPointer(addr);
}


bool ArchitectureExtension::GetInstructionInfo(
const uint8_t* data, uint64_t addr, size_t maxLen, InstructionInfo& result)
{
Expand Down
10 changes: 10 additions & 0 deletions binaryninjaapi.h
Original file line number Diff line number Diff line change
Expand Up @@ -9844,6 +9844,7 @@ namespace BinaryNinja {
static size_t GetMaxInstructionLengthCallback(void* ctxt);
static size_t GetOpcodeDisplayLengthCallback(void* ctxt);
static BNArchitecture* GetAssociatedArchitectureByAddressCallback(void* ctxt, uint64_t* addr);
static uint64_t EncodeFunctionPointerCallback(void* ctxt, uint64_t* addr);
static bool GetInstructionInfoCallback(
void* ctxt, const uint8_t* data, uint64_t addr, size_t maxLen, BNInstructionInfo* result);
static bool GetInstructionTextCallback(void* ctxt, const uint8_t* data, uint64_t addr, size_t* len,
Expand Down Expand Up @@ -10009,6 +10010,13 @@ namespace BinaryNinja {

virtual Ref<Architecture> GetAssociatedArchitectureByAddress(uint64_t& addr);

/*! Encode a function pointer for this architecture, e.g. setting the LSB for Thumb functions

\param addr Address of the function
\return The encoded function pointer
*/
virtual uint64_t EncodeFunctionPointer(uint64_t& addr);

/*! Retrieves an InstructionInfo struct for the instruction at the given virtual address

\note Architecture subclasses should implement this method.
Expand Down Expand Up @@ -10538,6 +10546,7 @@ namespace BinaryNinja {
virtual size_t GetMaxInstructionLength() const override;
virtual size_t GetOpcodeDisplayLength() const override;
virtual Ref<Architecture> GetAssociatedArchitectureByAddress(uint64_t& addr) override;
virtual uint64_t EncodeFunctionPointer(uint64_t& addr) override;
virtual bool GetInstructionInfo(
const uint8_t* data, uint64_t addr, size_t maxLen, InstructionInfo& result) override;
virtual bool GetInstructionText(
Expand Down Expand Up @@ -10630,6 +10639,7 @@ namespace BinaryNinja {
virtual size_t GetMaxInstructionLength() const override;
virtual size_t GetOpcodeDisplayLength() const override;
virtual Ref<Architecture> GetAssociatedArchitectureByAddress(uint64_t& addr) override;
virtual uint64_t EncodeFunctionPointer(uint64_t& addr) override;
virtual bool GetInstructionInfo(
const uint8_t* data, uint64_t addr, size_t maxLen, InstructionInfo& result) override;
virtual bool GetInstructionText(
Expand Down
2 changes: 2 additions & 0 deletions binaryninjacore.h
Original file line number Diff line number Diff line change
Expand Up @@ -2250,6 +2250,7 @@ extern "C"
size_t (*getMaxInstructionLength)(void* ctxt);
size_t (*getOpcodeDisplayLength)(void* ctxt);
BNArchitecture* (*getAssociatedArchitectureByAddress)(void* ctxt, uint64_t* addr);
uint64_t (*encodeFunctionPointer)(void* ctxt, uint64_t* addr);
bool (*getInstructionInfo)(
void* ctxt, const uint8_t* data, uint64_t addr, size_t maxLen, BNInstructionInfo* result);
bool (*getInstructionText)(void* ctxt, const uint8_t* data, uint64_t addr, size_t* len,
Expand Down Expand Up @@ -5792,6 +5793,7 @@ extern "C"
BINARYNINJACOREAPI size_t BNGetArchitectureMaxInstructionLength(BNArchitecture* arch);
BINARYNINJACOREAPI size_t BNGetArchitectureOpcodeDisplayLength(BNArchitecture* arch);
BINARYNINJACOREAPI BNArchitecture* BNGetAssociatedArchitectureByAddress(BNArchitecture* arch, uint64_t* addr);
BINARYNINJACOREAPI uint64_t BNArchitectureEncodeFunctionPointer(BNArchitecture* arch, uint64_t* addr);
BINARYNINJACOREAPI bool BNGetInstructionInfo(
BNArchitecture* arch, const uint8_t* data, uint64_t addr, size_t maxLen, BNInstructionInfo* result);
BINARYNINJACOREAPI bool BNGetInstructionText(BNArchitecture* arch, const uint8_t* data, uint64_t addr, size_t* len,
Expand Down
1 change: 1 addition & 0 deletions rust/src/architecture.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2746,6 +2746,7 @@ where
// TODO: Make getOpcodeDisplayLength optional.
getOpcodeDisplayLength: Some(cb_opcode_display_len::<A>),
getAssociatedArchitectureByAddress: Some(cb_associated_arch_by_addr::<A>),
encodeFunctionPointer: None,
getInstructionInfo: Some(cb_instruction_info::<A>),
getInstructionText: Some(cb_get_instruction_text::<A>),
getInstructionTextWithContext: Some(cb_get_instruction_text_with_context::<A>),
Expand Down
Loading