#pragma once #include #include #include #include #include #include #include #include "theme.h" #include "fontsettings.h" #include "expandablegroup.h" #include "viewframe.h" #include "binaryninjaapi.h" #include "binaryninjacore.h" #include "progresstask.h" struct BaseAddressDetectionQtInputs { QComboBox* ArchitectureBox; QComboBox* AnalysisBox; QLineEdit* StrlenLineEdit; QLineEdit* AlignmentLineEdit; QLineEdit* LowerBoundary; QLineEdit* UpperBoundary; QComboBox* POIBox; QLineEdit* MaxPointersPerCluster; }; struct BaseAddressDetectionQtResults { std::string Status; std::set> Scores; BNBaseAddressDetectionConfidence Confidence; std::map> Reasons; uint64_t LastTestedBaseAddress; }; class BaseAddressDetectionThread : public QThread { Q_OBJECT BinaryNinja::Ref m_view; BinaryNinja::BaseAddressDetection* m_baseDetection = nullptr; BaseAddressDetectionQtInputs* m_inputs {}; void run() override; public: BaseAddressDetectionThread(BaseAddressDetectionQtInputs* widgetInputs, BinaryNinja::Ref bv); ~BaseAddressDetectionThread(); void Abort() { m_baseDetection->Abort(); } bool IsAborted() { return m_baseDetection->IsAborted(); } signals: void ResultReady(const BaseAddressDetectionQtResults& result); }; class BaseAddressDetectionWidget : public QWidget { BaseAddressDetectionThread* m_worker; BinaryNinja::Ref m_view; BaseAddressDetectionQtInputs m_inputs; QGridLayout* m_layout {}; QPushButton* m_startButton = nullptr; QPushButton* m_abortButton = nullptr; QLabel* m_preferredBaseLabel; QLabel* m_preferredBase; QLabel* m_confidenceLabel; QLabel* m_confidence; QLabel* m_status; QLineEdit* m_reloadBase; QPushButton* m_rebaseButton; QTableWidget* m_resultsTableWidget; ExpandableGroup* m_advancedSettingsGroup; void DetectBaseAddress(); const std::string GetRebaseViewName(); void RebaseWithFullAnalysis(); void Abort(); void HandleResults(const BaseAddressDetectionQtResults& results); void HideResultsWidgets(bool hide); void CreateAdvancedSettingsGroup(); void GetClickedBaseAddress(const QModelIndex& index); public: BaseAddressDetectionWidget(QWidget* parent, BinaryNinja::Ref bv); };