diff options
| author | Brian Potchik <brian@vector35.com> | 2026-04-17 12:10:07 -0400 |
|---|---|---|
| committer | Brian Potchik <brian@vector35.com> | 2026-04-17 12:10:07 -0400 |
| commit | bfd306437f34ebc4d4170c5fb8170261585f6038 (patch) | |
| tree | 36dd320d130fa23239213dd94546abb9a5ab4114 /stringrecognizer.cpp | |
| parent | 424dc721f5f2a3a7ffd5a6ccbcc7320b5ae7496d (diff) | |
Add RecognizeConstantData to StringRecognizer API
Adds a new recognize_constant_data method to the StringRecognizer API,
enabling plugins to decode constant data expressions (HLIL_CONST_DATA)
recovered by the outline resolver. The recognizer receives the full
instruction, giving access to the data buffer and builtin type via the
constant_data accessor.
Also fixes a pre-existing ctypes mismatch in get_constant_data_and_builtin
where BNBuiltinType (uint8_t) was incorrectly passed as c_int.
Diffstat (limited to 'stringrecognizer.cpp')
| -rw-r--r-- | stringrecognizer.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/stringrecognizer.cpp b/stringrecognizer.cpp index dc6ac2f8..47e0ca5e 100644 --- a/stringrecognizer.cpp +++ b/stringrecognizer.cpp @@ -136,6 +136,12 @@ std::optional<DerivedString> StringRecognizer::RecognizeImport(const HighLevelIL } +std::optional<DerivedString> StringRecognizer::RecognizeConstantData(const HighLevelILInstruction&) +{ + return std::nullopt; +} + + void StringRecognizer::Register(StringRecognizer* recognizer) { BNCustomStringRecognizer callbacks; @@ -145,6 +151,7 @@ void StringRecognizer::Register(StringRecognizer* recognizer) callbacks.recognizeConstantPointer = RecognizeConstantPointerCallback; callbacks.recognizeExternPointer = RecognizeExternPointerCallback; callbacks.recognizeImport = RecognizeImportCallback; + callbacks.recognizeConstantData = RecognizeConstantDataCallback; recognizer->AddRefForRegistration(); recognizer->m_object = BNRegisterStringRecognizer(recognizer->m_nameForRegister.c_str(), &callbacks); @@ -220,6 +227,20 @@ bool StringRecognizer::RecognizeImportCallback( } +bool StringRecognizer::RecognizeConstantDataCallback( + void* ctxt, BNHighLevelILFunction* hlil, size_t expr, BNDerivedString* result) +{ + StringRecognizer* recognizer = (StringRecognizer*)ctxt; + Ref<HighLevelILFunction> hlilObj = new HighLevelILFunction(BNNewHighLevelILFunctionReference(hlil)); + HighLevelILInstruction instr = hlilObj->GetExpr(expr); + auto str = recognizer->RecognizeConstantData(instr); + if (!str.has_value()) + return false; + *result = str->ToAPIObject(true); + return true; +} + + Ref<StringRecognizer> StringRecognizer::GetByName(const std::string& name) { BNStringRecognizer* recognizer = BNGetStringRecognizerByName(name.c_str()); @@ -298,3 +319,13 @@ std::optional<DerivedString> CoreStringRecognizer::RecognizeImport( return std::nullopt; return DerivedString::FromAPIObject(&str, true); } + + +std::optional<DerivedString> CoreStringRecognizer::RecognizeConstantData( + const HighLevelILInstruction& instr) +{ + BNDerivedString str; + if (!BNStringRecognizerRecognizeConstantData(m_object, instr.function->GetObject(), instr.exprIndex, &str)) + return std::nullopt; + return DerivedString::FromAPIObject(&str, true); +} |
