diff options
Diffstat (limited to 'lang')
| -rw-r--r-- | lang/c/pseudoobjc.cpp | 21 | ||||
| -rw-r--r-- | lang/c/pseudoobjc.h | 3 |
2 files changed, 24 insertions, 0 deletions
diff --git a/lang/c/pseudoobjc.cpp b/lang/c/pseudoobjc.cpp index 56d67c5f..96f0e7c3 100644 --- a/lang/c/pseudoobjc.cpp +++ b/lang/c/pseudoobjc.cpp @@ -4,6 +4,7 @@ #include "highlevelilinstruction.h" #include <optional> #include <string> +#include <string_view> #include <vector> using namespace BinaryNinja; @@ -350,6 +351,11 @@ void PseudoObjCFunction::GetExpr_CONST_PTR(const BinaryNinja::HighLevelILInstruc return; } + if (shortName.rfind("sel_", 0) == 0 + && GetExpr_Selector( + std::string_view(shortName).substr(4), constant, instr, tokens, settings, precedence, statement)) + return; + DataVariable variable {}; auto hasVariable = GetFunction()->GetView()->GetDataVariableAtAddress(constant, variable); if (!hasVariable) @@ -393,6 +399,21 @@ bool PseudoObjCFunction::GetExpr_OBJC_CLASS(const Symbol& symbol, uint64_t const return true; } +bool PseudoObjCFunction::GetExpr_Selector(std::string_view selector, uint64_t constant, + const BinaryNinja::HighLevelILInstruction& instr, BinaryNinja::HighLevelILTokenEmitter& tokens, + BinaryNinja::DisassemblySettings* settings, BNOperatorPrecedence precedence, bool statement) +{ + if (selector.empty()) + return false; + + tokens.Append(KeywordToken, "@selector"); + tokens.AppendOpenParen(); + tokens.Append(DataSymbolToken, ConstDataTokenContext, std::string(selector), instr.address, constant); + tokens.AppendCloseParen(); + + return true; +} + bool PseudoObjCFunction::GetExpr_NSConstantString(Ref<Type> type, uint64_t constant, const BinaryNinja::HighLevelILInstruction& instr, BinaryNinja::HighLevelILTokenEmitter& tokens, BinaryNinja::DisassemblySettings* settings, BNOperatorPrecedence precedence, bool statement) diff --git a/lang/c/pseudoobjc.h b/lang/c/pseudoobjc.h index 9910c4b8..6e49d400 100644 --- a/lang/c/pseudoobjc.h +++ b/lang/c/pseudoobjc.h @@ -31,6 +31,9 @@ private: bool GetExpr_OBJC_CLASS(const BinaryNinja::Symbol& symbol, uint64_t constant, const BinaryNinja::HighLevelILInstruction& expr, BinaryNinja::HighLevelILTokenEmitter& tokens, BinaryNinja::DisassemblySettings* settings, BNOperatorPrecedence precedence, bool statement); + bool GetExpr_Selector(std::string_view selector, uint64_t constant, + const BinaryNinja::HighLevelILInstruction& expr, BinaryNinja::HighLevelILTokenEmitter& tokens, + BinaryNinja::DisassemblySettings* settings, BNOperatorPrecedence precedence, bool statement); bool GetExpr_NSConstantString(BinaryNinja::Ref<BinaryNinja::Type> type, uint64_t constant, const BinaryNinja::HighLevelILInstruction& expr, BinaryNinja::HighLevelILTokenEmitter& tokens, BinaryNinja::DisassemblySettings* settings, BNOperatorPrecedence precedence, bool statement); |
