diff options
| author | Rusty Wagner <rusty.wagner@gmail.com> | 2022-01-12 17:34:10 -0700 |
|---|---|---|
| committer | Rusty Wagner <rusty.wagner@gmail.com> | 2022-01-17 17:58:50 -0500 |
| commit | 32ee51a0ac631a7ce004e1d2d9b2f7ea291fd252 (patch) | |
| tree | 117d10f1de01f22e884ab217c3a766a599281eb9 | |
| parent | 9c7ed0cc4ebe08871a7b83e0f56a542c0f31f835 (diff) | |
Single function mode in linear view
| -rw-r--r-- | binaryninjaapi.h | 13 | ||||
| -rw-r--r-- | binaryninjacore.h | 24 | ||||
| -rw-r--r-- | linearviewobject.cpp | 84 | ||||
| -rw-r--r-- | python/lineardisassembly.py | 84 | ||||
| -rw-r--r-- | ui/linearview.h | 16 |
5 files changed, 220 insertions, 1 deletions
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<LinearViewObject> CreateHighLevelIL(BinaryView* view, DisassemblySettings* settings); static Ref<LinearViewObject> CreateHighLevelILSSAForm(BinaryView* view, DisassemblySettings* settings); static Ref<LinearViewObject> CreateLanguageRepresentation(BinaryView* view, DisassemblySettings* settings); + static Ref<LinearViewObject> CreateDataOnly(BinaryView* view, DisassemblySettings* settings); + + static Ref<LinearViewObject> CreateSingleFunctionDisassembly(Function* func, DisassemblySettings* settings); + static Ref<LinearViewObject> CreateSingleFunctionLiftedIL(Function* func, DisassemblySettings* settings); + static Ref<LinearViewObject> CreateSingleFunctionLowLevelIL(Function* func, DisassemblySettings* settings); + static Ref<LinearViewObject> CreateSingleFunctionLowLevelILSSAForm(Function* func, DisassemblySettings* settings); + static Ref<LinearViewObject> CreateSingleFunctionMediumLevelIL(Function* func, DisassemblySettings* settings); + static Ref<LinearViewObject> CreateSingleFunctionMediumLevelILSSAForm(Function* func, DisassemblySettings* settings); + static Ref<LinearViewObject> CreateSingleFunctionMappedMediumLevelIL(Function* func, DisassemblySettings* settings); + static Ref<LinearViewObject> CreateSingleFunctionMappedMediumLevelILSSAForm(Function* func, DisassemblySettings* settings); + static Ref<LinearViewObject> CreateSingleFunctionHighLevelIL(Function* func, DisassemblySettings* settings); + static Ref<LinearViewObject> CreateSingleFunctionHighLevelILSSAForm(Function* func, DisassemblySettings* settings); + static Ref<LinearViewObject> CreateSingleFunctionLanguageRepresentation(Function* func, DisassemblySettings* settings); }; class LinearViewCursor: public CoreRefCountObject<BNLinearViewCursor, diff --git a/binaryninjacore.h b/binaryninjacore.h index fca627c3..c45729a0 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -3837,6 +3837,30 @@ __attribute__ ((format (printf, 1, 2))) BNDisassemblySettings* settings); BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewLanguageRepresentation(BNBinaryView* view, BNDisassemblySettings* settings); + BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewDataOnly(BNBinaryView* view, + BNDisassemblySettings* settings); + BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionDisassembly( + BNFunction* func, BNDisassemblySettings* settings); + BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionLiftedIL( + BNFunction* func, BNDisassemblySettings* settings); + BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionLowLevelIL( + BNFunction* func, BNDisassemblySettings* settings); + BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionLowLevelILSSAForm( + BNFunction* func, BNDisassemblySettings* settings); + BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionMediumLevelIL( + BNFunction* func, BNDisassemblySettings* settings); + BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionMediumLevelILSSAForm( + BNFunction* func, BNDisassemblySettings* settings); + BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionMappedMediumLevelIL( + BNFunction* func, BNDisassemblySettings* settings); + BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionMappedMediumLevelILSSAForm( + BNFunction* func, BNDisassemblySettings* settings); + BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionHighLevelIL( + BNFunction* func, BNDisassemblySettings* settings); + BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionHighLevelILSSAForm( + BNFunction* func, BNDisassemblySettings* settings); + BINARYNINJACOREAPI BNLinearViewObject* BNCreateLinearViewSingleFunctionLanguageRepresentation( + BNFunction* func, BNDisassemblySettings* settings); BINARYNINJACOREAPI BNLinearViewObject* BNNewLinearViewObjectReference(BNLinearViewObject* obj); BINARYNINJACOREAPI void BNFreeLinearViewObject(BNLinearViewObject* obj); BINARYNINJACOREAPI BNLinearViewObject* BNGetFirstLinearViewObjectChild(BNLinearViewObject* obj); diff --git a/linearviewobject.cpp b/linearviewobject.cpp index 17229836..17df452b 100644 --- a/linearviewobject.cpp +++ b/linearviewobject.cpp @@ -283,3 +283,87 @@ Ref<LinearViewObject> LinearViewObject::CreateLanguageRepresentation(BinaryView* return new LinearViewObject(BNCreateLinearViewLanguageRepresentation(view->GetObject(), settings ? settings->GetObject() : nullptr)); } + + +Ref<LinearViewObject> LinearViewObject::CreateDataOnly(BinaryView* view, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewDataOnly(view->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref<LinearViewObject> LinearViewObject::CreateSingleFunctionDisassembly(Function* func, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewSingleFunctionDisassembly(func->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref<LinearViewObject> LinearViewObject::CreateSingleFunctionLiftedIL(Function* func, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewSingleFunctionLiftedIL(func->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref<LinearViewObject> LinearViewObject::CreateSingleFunctionLowLevelIL(Function* func, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewSingleFunctionLowLevelIL(func->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref<LinearViewObject> LinearViewObject::CreateSingleFunctionLowLevelILSSAForm(Function* func, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewSingleFunctionLowLevelILSSAForm(func->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref<LinearViewObject> LinearViewObject::CreateSingleFunctionMediumLevelIL(Function* func, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewSingleFunctionMediumLevelIL(func->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref<LinearViewObject> LinearViewObject::CreateSingleFunctionMediumLevelILSSAForm(Function* func, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewSingleFunctionMediumLevelILSSAForm(func->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref<LinearViewObject> LinearViewObject::CreateSingleFunctionMappedMediumLevelIL(Function* func, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewSingleFunctionMappedMediumLevelIL(func->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref<LinearViewObject> LinearViewObject::CreateSingleFunctionMappedMediumLevelILSSAForm(Function* func, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewSingleFunctionMappedMediumLevelILSSAForm(func->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref<LinearViewObject> LinearViewObject::CreateSingleFunctionHighLevelIL(Function* func, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewSingleFunctionHighLevelIL(func->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref<LinearViewObject> LinearViewObject::CreateSingleFunctionHighLevelILSSAForm(Function* func, DisassemblySettings* settings) +{ + return new LinearViewObject(BNCreateLinearViewSingleFunctionHighLevelILSSAForm(func->GetObject(), + settings ? settings->GetObject() : nullptr)); +} + + +Ref<LinearViewObject> 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<BinaryNinja::LinearViewCursor> m_topPosition, m_bottomPosition; std::vector<LinearViewLine> m_lines; size_t m_topLine; + std::optional<double> 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<size_t>& related) override; virtual void setRelatedInstructionHighlights(FunctionRef func, const std::set<uint64_t>& related) override; + bool singleFunctionView() const { return m_singleFunctionView; } + void setSingleFunctionView(bool singleFunctionView); + static void registerActions(); protected: |
