diff options
| author | Rusty Wagner <rusty.wagner@gmail.com> | 2020-12-16 21:45:31 -0500 |
|---|---|---|
| committer | Rusty Wagner <rusty.wagner@gmail.com> | 2020-12-18 00:16:20 -0500 |
| commit | d8030b6c75f638b92c1908d8b427299c2d0abe92 (patch) | |
| tree | 35b663e0eb031dbdb4f7018e4e0bee7cef42ec70 | |
| parent | 70ce5764abacc1a7ea518f5ccef92421a1d6d04e (diff) | |
Add API/UI to control dead store elimination of specific variables
| -rw-r--r-- | binaryninjaapi.h | 3 | ||||
| -rw-r--r-- | binaryninjacore.h | 11 | ||||
| -rw-r--r-- | function.cpp | 20 | ||||
| -rw-r--r-- | python/function.py | 12 | ||||
| -rwxr-xr-x | suite/generator.py | 1 | ||||
| -rw-r--r-- | ui/flowgraphwidget.h | 4 | ||||
| -rw-r--r-- | ui/linearview.h | 4 |
7 files changed, 54 insertions, 1 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 85c9c51b..224ea01c 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -3234,6 +3234,9 @@ __attribute__ ((format (printf, 1, 2))) std::string GetGotoLabelName(uint64_t labelId); void SetGotoLabelName(uint64_t labelId, const std::string& name); + + BNDeadStoreElimination GetVariableDeadStoreElimination(const Variable& var); + void SetVariableDeadStoreElimination(const Variable& var, BNDeadStoreElimination mode); }; class AdvancedFunctionAnalysisDataRequestor diff --git a/binaryninjacore.h b/binaryninjacore.h index 4eab7a44..72f661a9 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -2441,6 +2441,13 @@ extern "C" void* ctx; }; + enum BNDeadStoreElimination + { + DefaultDeadStoreElimination, + PreventDeadStoreElimination, + AllowDeadStoreElimination + }; + BINARYNINJACOREAPI char* BNAllocString(const char* contents); BINARYNINJACOREAPI void BNFreeString(char* str); BINARYNINJACOREAPI char** BNAllocStringList(const char** contents, size_t size); @@ -3275,6 +3282,10 @@ __attribute__ ((format (printf, 1, 2))) BINARYNINJACOREAPI char* BNGetVariableName(BNFunction* func, const BNVariable* var); BINARYNINJACOREAPI uint64_t BNToVariableIdentifier(const BNVariable* var); BINARYNINJACOREAPI BNVariable BNFromVariableIdentifier(uint64_t id); + BINARYNINJACOREAPI BNDeadStoreElimination BNGetFunctionVariableDeadStoreElimination(BNFunction* func, + const BNVariable* var); + BINARYNINJACOREAPI void BNSetFunctionVariableDeadStoreElimination(BNFunction* func, + const BNVariable* var, BNDeadStoreElimination mode); BINARYNINJACOREAPI BNReferenceSource* BNGetFunctionCallSites(BNFunction* func, size_t* count); BINARYNINJACOREAPI uint64_t* BNGetCallees(BNBinaryView* view, BNReferenceSource* callSite, size_t* count); diff --git a/function.cpp b/function.cpp index 2daf5522..340f1e53 100644 --- a/function.cpp +++ b/function.cpp @@ -1900,6 +1900,26 @@ void Function::SetGotoLabelName(uint64_t labelId, const std::string& name) } +BNDeadStoreElimination Function::GetVariableDeadStoreElimination(const Variable& var) +{ + BNVariable varData; + varData.type = var.type; + varData.index = var.index; + varData.storage = var.storage; + return BNGetFunctionVariableDeadStoreElimination(m_object, &varData); +} + + +void Function::SetVariableDeadStoreElimination(const Variable& var, BNDeadStoreElimination mode) +{ + BNVariable varData; + varData.type = var.type; + varData.index = var.index; + varData.storage = var.storage; + BNSetFunctionVariableDeadStoreElimination(m_object, &varData, mode); +} + + AdvancedFunctionAnalysisDataRequestor::AdvancedFunctionAnalysisDataRequestor(Function* func): m_func(func) { if (m_func) diff --git a/python/function.py b/python/function.py index e98f7191..d986fcca 100644 --- a/python/function.py +++ b/python/function.py @@ -35,7 +35,7 @@ from binaryninja import types from binaryninja.enums import (AnalysisSkipReason, FunctionGraphType, BranchType, SymbolType, InstructionTextTokenType, HighlightStandardColor, HighlightColorStyle, RegisterValueType, ImplicitRegisterExtend, DisassemblyOption, IntegerDisplayType, InstructionTextTokenContext, VariableSourceType, - FunctionAnalysisSkipOverride, MediumLevelILOperation) + FunctionAnalysisSkipOverride, MediumLevelILOperation, DeadStoreElimination) # 2-3 compatibility from binaryninja import range @@ -926,6 +926,16 @@ class Variable(object): v.storage = self._storage return v + @property + def dead_store_elimination(self): + if self._function is not None and self._identifier is not None: + return DeadStoreElimination(core.BNGetFunctionVariableDeadStoreElimination(self._function.handle, self.to_BNVariable())) + return None + + @dead_store_elimination.setter + def dead_store_elimination(self, value): + core.BNSetFunctionVariableDeadStoreElimination(self._function.handle, self.to_BNVariable(), value) + @classmethod def from_identifier(self, func, identifier, name=None, var_type=None): var = core.BNFromVariableIdentifier(identifier) diff --git a/suite/generator.py b/suite/generator.py index 63ae64ff..75a83ad6 100755 --- a/suite/generator.py +++ b/suite/generator.py @@ -174,6 +174,7 @@ class OracleTestFile: class UnitTestFile: binary_test_options = {} binary_test_options['binaries/test_corpus/pe_thumb'] = {'analysis.experimental.alternateTypePropagation' : True} + binary_test_options['binaries/test_corpus/quick3dcoreplugin.dll'] = {'analysis.experimental.alternateTypePropagation' : True} def __init__(self, filename, outdir, test_store): self.filename = filename diff --git a/ui/flowgraphwidget.h b/ui/flowgraphwidget.h index fc19c42c..7a2d6add 100644 --- a/ui/flowgraphwidget.h +++ b/ui/flowgraphwidget.h @@ -140,6 +140,8 @@ class BINARYNINJAUIAPI FlowGraphWidget: public QAbstractScrollArea, public View, bool updatePositionForNode(FlowGraphNodeRef oldNode, FlowGraphNodeRef newNode, CursorPosition& pos); void recenterUpdatedGraph(FlowGraphRef oldGraph, int oldXOfs, int oldYOfs); + BNDeadStoreElimination getCurrentVariableDeadStoreElimination(); + protected: virtual void paintEvent(QPaintEvent* event) override; virtual void resizeEvent(QResizeEvent* event) override; @@ -340,4 +342,6 @@ private Q_SLOTS: void editInstruction(); void instrEditDoneEvent(); + + void setCurrentVariableDeadStoreElimination(BNDeadStoreElimination elimination); }; diff --git a/ui/linearview.h b/ui/linearview.h index 3bd446be..7498bdef 100644 --- a/ui/linearview.h +++ b/ui/linearview.h @@ -209,6 +209,8 @@ class BINARYNINJAUIAPI LinearView: public QAbstractScrollArea, public View, publ void getCurrentOffsetByTypeInternal(TypeRef resType, uint64_t baseAddr, uint64_t& begin, uint64_t& end, bool singleLine, std::set<TypeRef>& seen); + BNDeadStoreElimination getCurrentVariableDeadStoreElimination(); + private Q_SLOTS: void adjustSize(int width, int height); void viewInHexEditor(); @@ -274,6 +276,8 @@ private Q_SLOTS: void editInstruction(); void instrEditDoneEvent(); + void setCurrentVariableDeadStoreElimination(BNDeadStoreElimination elimination); + Q_SIGNALS: void notifyResizeEvent(int width, int height); |
