summaryrefslogtreecommitdiff
path: root/stringrecognizer.cpp
diff options
context:
space:
mode:
authorBrian Potchik <brian@vector35.com>2026-04-17 12:10:07 -0400
committerBrian Potchik <brian@vector35.com>2026-04-17 12:10:07 -0400
commitbfd306437f34ebc4d4170c5fb8170261585f6038 (patch)
tree36dd320d130fa23239213dd94546abb9a5ab4114 /stringrecognizer.cpp
parent424dc721f5f2a3a7ffd5a6ccbcc7320b5ae7496d (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.cpp31
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);
+}