From 32ee51a0ac631a7ce004e1d2d9b2f7ea291fd252 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Wed, 12 Jan 2022 17:34:10 -0700 Subject: Single function mode in linear view --- binaryninjaapi.h | 13 +++++++ binaryninjacore.h | 24 +++++++++++++ linearviewobject.cpp | 84 +++++++++++++++++++++++++++++++++++++++++++++ python/lineardisassembly.py | 84 +++++++++++++++++++++++++++++++++++++++++++++ ui/linearview.h | 16 ++++++++- 5 files changed, 220 insertions(+), 1 deletion(-) diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 2203c803..62d5d839 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -6081,6 +6081,19 @@ __attribute__ ((format (printf, 1, 2))) static Ref CreateHighLevelIL(BinaryView* view, DisassemblySettings* settings); static Ref CreateHighLevelILSSAForm(BinaryView* view, DisassemblySettings* settings); static Ref CreateLanguageRepresentation(BinaryView* view, DisassemblySettings* settings); + static Ref CreateDataOnly(BinaryView* view, DisassemblySettings* settings); + + static Ref CreateSingleFunctionDisassembly(Function* func, DisassemblySettings* settings); + static Ref CreateSingleFunctionLiftedIL(Function* func, DisassemblySettings* settings); + static Ref CreateSingleFunctionLowLevelIL(Function* func, DisassemblySettings* settings); + static Ref CreateSingleFunctionLowLevelILSSAForm(Function* func, DisassemblySettings* settings); + static Ref CreateSingleFunctionMediumLevelIL(Function* func, DisassemblySettings* settings); + static Ref CreateSingleFunctionMediumLevelILSSAForm(Function* func, DisassemblySettings* settings); + static Ref CreateSingleFunctionMappedMediumLevelIL(Function* func, DisassemblySettings* settings); + static Ref CreateSingleFunctionMappedMediumLevelILSSAForm(Function* func, DisassemblySettings* settings); + static Ref CreateSingleFunctionHighLevelIL(Function* func, DisassemblySettings* settings); + static Ref CreateSingleFunctionHighLevelILSSAForm(Function* func, DisassemblySettings* settings); + static Ref CreateSingleFunctionLanguageRepresentation(Function* func, DisassemblySettings* settings); }; class LinearViewCursor: public CoreRefCountObject LinearViewObject::CreateLanguageRepresentation(BinaryView* return new LinearViewObject(BNCreateLinearViewLanguageRepresentation(view->GetObject(), settings ? settings->GetObject() : nullptr)); } + + +Ref LinearViewObject::CreateDataOnly(BinaryView* view, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewDataOnly(view->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref LinearViewObject::CreateSingleFunctionDisassembly(Function* func, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewSingleFunctionDisassembly(func->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref LinearViewObject::CreateSingleFunctionLiftedIL(Function* func, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewSingleFunctionLiftedIL(func->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref LinearViewObject::CreateSingleFunctionLowLevelIL(Function* func, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewSingleFunctionLowLevelIL(func->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref LinearViewObject::CreateSingleFunctionLowLevelILSSAForm(Function* func, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewSingleFunctionLowLevelILSSAForm(func->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref LinearViewObject::CreateSingleFunctionMediumLevelIL(Function* func, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewSingleFunctionMediumLevelIL(func->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref LinearViewObject::CreateSingleFunctionMediumLevelILSSAForm(Function* func, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewSingleFunctionMediumLevelILSSAForm(func->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref LinearViewObject::CreateSingleFunctionMappedMediumLevelIL(Function* func, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewSingleFunctionMappedMediumLevelIL(func->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref LinearViewObject::CreateSingleFunctionMappedMediumLevelILSSAForm(Function* func, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewSingleFunctionMappedMediumLevelILSSAForm(func->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref LinearViewObject::CreateSingleFunctionHighLevelIL(Function* func, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewSingleFunctionHighLevelIL(func->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref LinearViewObject::CreateSingleFunctionHighLevelILSSAForm(Function* func, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewSingleFunctionHighLevelILSSAForm(func->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref LinearViewObject::CreateSingleFunctionLanguageRepresentation(Function* func, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewSingleFunctionLanguageRepresentation(func->GetObject(), + settings ? settings->GetObject() : nullptr)); +} diff --git a/python/lineardisassembly.py b/python/lineardisassembly.py index c295841e..9c3040c9 100644 --- a/python/lineardisassembly.py +++ b/python/lineardisassembly.py @@ -348,6 +348,90 @@ class LinearViewObject: _settings = _settings.handle return LinearViewObject(core.BNCreateLinearViewLanguageRepresentation(view.handle, _settings)) + @staticmethod + def data_only(view:'binaryview.BinaryView', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject': + _settings = settings + if _settings is not None: + _settings = _settings.handle + return LinearViewObject(core.BNCreateLinearViewDataOnly(view.handle, _settings)) + + @staticmethod + def single_function_disassembly(func:'_function.Function', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject': + _settings = settings + if _settings is not None: + _settings = _settings.handle + return LinearViewObject(core.BNCreateLinearViewSingleFunctionDisassembly(func.handle, _settings)) + + @staticmethod + def single_function_lifted_il(func:'_function.Function', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject': + _settings = settings + if _settings is not None: + _settings = _settings.handle + return LinearViewObject(core.BNCreateLinearViewSingleFunctionLiftedIL(func.handle, _settings)) + + @staticmethod + def single_function_llil(func:'_function.Function', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject': + _settings = settings + if _settings is not None: + _settings = _settings.handle + return LinearViewObject(core.BNCreateLinearViewSingleFunctionLowLevelIL(func.handle, _settings)) + + @staticmethod + def single_function_llil_ssa_form(func:'_function.Function', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject': + _settings = settings + if _settings is not None: + _settings = _settings.handle + return LinearViewObject(core.BNCreateLinearViewSingleFunctionLowLevelILSSAForm(func.handle, _settings)) + + @staticmethod + def single_function_mlil(func:'_function.Function', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject': + _settings = settings + if _settings is not None: + _settings = _settings.handle + return LinearViewObject(core.BNCreateLinearViewSingleFunctionMediumLevelIL(func.handle, _settings)) + + @staticmethod + def single_function_mlil_ssa_form(func:'_function.Function', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject': + _settings = settings + if _settings is not None: + _settings = _settings.handle + return LinearViewObject(core.BNCreateLinearViewSingleFunctionMediumLevelILSSAForm(func.handle, _settings)) + + @staticmethod + def single_function_mmlil(func:'_function.Function', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject': + _settings = settings + if _settings is not None: + _settings = _settings.handle + return LinearViewObject(core.BNCreateLinearViewSingleFunctionMappedMediumLevelIL(func.handle, _settings)) + + @staticmethod + def single_function_mmlil_ssa_form(func:'_function.Function', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject': + _settings = settings + if _settings is not None: + _settings = _settings.handle + return LinearViewObject(core.BNCreateLinearViewSingleFunctionMappedMediumLevelILSSAForm(func.handle, _settings)) + + @staticmethod + def single_function_hlil(func:'_function.Function', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject': + _settings = settings + if _settings is not None: + _settings = _settings.handle + return LinearViewObject(core.BNCreateLinearViewSingleFunctionHighLevelIL(func.handle, _settings)) + + @staticmethod + def single_function_hlil_ssa_form(func:'_function.Function', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject': + _settings = settings + if _settings is not None: + _settings = _settings.handle + return LinearViewObject(core.BNCreateLinearViewSingleFunctionHighLevelILSSAForm(func.handle, _settings)) + + @staticmethod + def single_function_language_representation(view:'binaryview.BinaryView', settings:Optional['_function.DisassemblySettings'] = None) -> 'LinearViewObject': + _settings = settings + if _settings is not None: + _settings = _settings.handle + return LinearViewObject(core.BNCreateLinearViewSingleFunctionLanguageRepresentation(view.handle, _settings)) + class LinearViewCursor: def __init__(self, root_object, handle = None): if handle is not None: diff --git a/ui/linearview.h b/ui/linearview.h index 6a319443..f8feb3d7 100644 --- a/ui/linearview.h +++ b/ui/linearview.h @@ -161,6 +161,7 @@ class BINARYNINJAUIAPI LinearView: public QAbstractScrollArea, public View, publ DisassemblySettingsRef m_options; BNFunctionGraphType m_ilViewType; HexEditorHighlightState m_highlightState; + bool m_singleFunctionView = false; InstructionEdit* m_instrEdit; @@ -169,6 +170,7 @@ class BINARYNINJAUIAPI LinearView: public QAbstractScrollArea, public View, publ BinaryNinja::Ref m_topPosition, m_bottomPosition; std::vector m_lines; size_t m_topLine; + std::optional m_topOrderingIndexOffset; QTimer* m_updateTimer; QTimer* m_hoverTimer; @@ -181,16 +183,23 @@ class BINARYNINJAUIAPI LinearView: public QAbstractScrollArea, public View, publ std::string m_navigationMode = ""; + ClickableIcon* m_dataButton = nullptr; + QWidget* m_dataButtonContainer = nullptr; + QHBoxLayout* m_dataButtonLayout = nullptr; + void setTopToAddress(uint64_t addr); void setTopToOrderingIndex(uint64_t idx); void refreshLines(size_t lineOffset = 0, bool refreshUIContext = true); bool cachePreviousLines(); bool cacheNextLines(); void updateCache(); + void updateBounds(); void refreshAtCurrentLocation(bool cursorFixup = false); bool navigateToAddress(uint64_t addr, bool center, bool updateHighlight, bool navByRef = false); - bool navigateToLine(uint64_t offset, size_t instrIndex, bool center, bool updateHighlight, bool navByRef = false); + bool navigateToLine(FunctionRef func, uint64_t offset, size_t instrIndex, bool center, + bool updateHighlight, bool navByRef = false); bool navigateToGotoLabel(uint64_t label); + void viewData(); void scrollLines(int count); @@ -243,6 +252,8 @@ class BINARYNINJAUIAPI LinearView: public QAbstractScrollArea, public View, publ BNDeadStoreElimination getCurrentVariableDeadStoreElimination(); + void setDataButtonVisible(bool visible); + private Q_SLOTS: void adjustSize(int width, int height); void viewInHexEditor(); @@ -405,6 +416,9 @@ public: virtual void setRelatedIndexHighlights(FunctionRef func, const std::set& related) override; virtual void setRelatedInstructionHighlights(FunctionRef func, const std::set& related) override; + bool singleFunctionView() const { return m_singleFunctionView; } + void setSingleFunctionView(bool singleFunctionView); + static void registerActions(); protected: -- cgit v1.3.1