Skip to content

Commit 0de6276

Browse files
committed
Adding settings system apis, and binaryview metadata apis
1 parent b0778fc commit 0de6276

9 files changed

Lines changed: 814 additions & 1 deletion

File tree

binaryninjaapi.h

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,7 @@ namespace BinaryNinja
375375
void InitCorePlugins();
376376
void InitUserPlugins();
377377
void InitRepoPlugins();
378+
378379
std::string GetBundledPluginDirectory();
379380
void SetBundledPluginDirectory(const std::string& path);
380381
std::string GetInstallDirectory();
@@ -845,6 +846,15 @@ namespace BinaryNinja
845846
};
846847

847848
struct QualifiedNameAndType;
849+
class Metadata;
850+
851+
class QueryMetadataException: public std::exception
852+
{
853+
const std::string m_error;
854+
public:
855+
QueryMetadataException(const std::string& error): std::exception(), m_error(error) {}
856+
virtual const char* what() const NOEXCEPT { return m_error.c_str(); }
857+
};
848858

849859
/*! BinaryView is the base class for creating views on binary data (e.g. ELF, PE, Mach-O).
850860
BinaryView should be subclassed to create a new BinaryView
@@ -1116,6 +1126,12 @@ namespace BinaryNinja
11161126
std::vector<std::string> GetUniqueSectionNames(const std::vector<std::string>& names);
11171127

11181128
std::vector<BNAddressRange> GetAllocatedRanges();
1129+
1130+
void StoreMetadata(const std::string& key, Metadata* inValue);
1131+
bool QueryMetadata(const std::string& key, Metadata** outValue);
1132+
std::string GetStringMetadata(const std::string& key);
1133+
std::vector<uint8_t> GetRawMetadata(const std::string& key);
1134+
uint64_t GetUIntMetadata(const std::string& key);
11191135
};
11201136

11211137
class BinaryData: public BinaryView
@@ -1195,7 +1211,11 @@ namespace BinaryNinja
11951211

11961212
void Read(void* dest, size_t len);
11971213
DataBuffer Read(size_t len);
1214+
template <typename T> T Read();
1215+
template <typename T> std::vector<T> ReadVector(size_t count);
11981216
std::string ReadString(size_t len);
1217+
std::string ReadCString(size_t maxLength=-1);
1218+
11991219
uint8_t Read8();
12001220
uint16_t Read16();
12011221
uint32_t Read32();
@@ -2842,4 +2862,88 @@ namespace BinaryNinja
28422862
bool UninstallPlugin(const std::string& repoName, const std::string& pluginPath);
28432863
Ref<Repository> GetDefaultRepository();
28442864
};
2865+
2866+
class Setting
2867+
{
2868+
public:
2869+
static bool ProcessMainSettingsFile();
2870+
static bool GetBool(const std::string& settingGroup, const std::string& name, bool defaultValue);
2871+
static uint64_t GetInteger(const std::string& settingGroup, const std::string& name, uint64_t defaultValue=0);
2872+
static std::string GetString(const std::string& settingGroup, const std::string& name, const std::string& defaultValue="");
2873+
static std::vector<uint64_t> GetIntegerList(const std::string& settingGroup, const std::string& name, const std::vector<uint64_t>& defaultValue={});
2874+
static std::vector<std::string> GetStringList(const std::string& settingGroup, const std::string& name, const std::vector<std::string>& defaultValue={});
2875+
static double GetDouble(const std::string& settingGroup, const std::string& name, double defaultValue=0.0);
2876+
2877+
static bool IsPresent(const std::string& settingGroup, const std::string& name);
2878+
static bool IsBool(const std::string& settingGroup, const std::string& name);
2879+
static bool IsInteger(const std::string& settingGroup, const std::string& name);
2880+
static bool IsString(const std::string& settingGroup, const std::string& name);
2881+
static bool IsIntegerList(const std::string& settingGroup, const std::string& name);
2882+
static bool IsStringList(const std::string& settingGroup, const std::string& name);
2883+
static bool IsDouble(const std::string& settingGroup, const std::string& name);
2884+
};
2885+
2886+
class CoreSetting
2887+
{
2888+
public:
2889+
static bool GetBool(const std::string& name, bool defaultValue);
2890+
static uint64_t GetInteger(const std::string& name, uint64_t defaultValue=0);
2891+
static std::string GetString(const std::string& name, const std::string& defaultValue="");
2892+
static std::vector<uint64_t> GetIntegerList(const std::string& name, const std::vector<uint64_t>& defaultValue={});
2893+
static std::vector<std::string> GetStringList(const std::string& name, const std::vector<std::string>& defaultValue={});
2894+
static double GetDouble(const std::string& name, double defaultValue=0.0);
2895+
2896+
static bool IsPresent(const std::string& name);
2897+
static bool IsBool(const std::string& name);
2898+
static bool IsInteger(const std::string& name);
2899+
static bool IsString(const std::string& name);
2900+
static bool IsIntegerList(const std::string& name);
2901+
static bool IsStringList(const std::string& name);
2902+
static bool IsDouble(const std::string& name);
2903+
};
2904+
2905+
typedef BNMetadataType MetadataType;
2906+
2907+
class Metadata: public CoreRefCountObject<BNMetadata, BNNewMetadataReference, BNFreeMetadata>
2908+
{
2909+
public:
2910+
Metadata(BNMetadata* structuredData);
2911+
Metadata(bool data);
2912+
Metadata(const std::string& data);
2913+
Metadata(uint64_t data);
2914+
Metadata(int64_t data);
2915+
Metadata(double data);
2916+
Metadata(const std::vector<bool>& data);
2917+
Metadata(const std::vector<std::string>& data);
2918+
Metadata(const std::vector<uint64_t>& data);
2919+
Metadata(const std::vector<int64_t>& data);
2920+
Metadata(const std::vector<double>& data);
2921+
Metadata(const std::vector<uint8_t>& data);
2922+
virtual ~Metadata() {}
2923+
2924+
MetadataType GetType() const;
2925+
bool GetBoolean() const;
2926+
std::string GetString() const;
2927+
uint64_t GetUnsignedInteger() const;
2928+
int64_t GetSignedInteger() const;
2929+
double GetDouble() const;
2930+
std::vector<bool> GetBooleanList() const;
2931+
std::vector<std::string> GetStringList() const;
2932+
std::vector<uint64_t> GetUnsignedIntegerList() const;
2933+
std::vector<int64_t> GetSignedIntegerList() const;
2934+
std::vector<double> GetDoubleList() const;
2935+
std::vector<uint8_t> GetRaw() const;
2936+
2937+
bool IsBoolean() const;
2938+
bool IsString() const;
2939+
bool IsUnsignedInteger() const;
2940+
bool IsSignedInteger() const;
2941+
bool IsDouble() const;
2942+
bool IsBooleanList() const;
2943+
bool IsStringList() const;
2944+
bool IsUnsignedIntegerList() const;
2945+
bool IsSignedIntegerList() const;
2946+
bool IsDoubleList() const;
2947+
bool IsRaw() const;
2948+
};
28452949
}

binaryninjacore.h

Lines changed: 106 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ extern "C"
137137
struct BNRepository;
138138
struct BNRepoPlugin;
139139
struct BNRepositoryManager;
140+
struct BNMetadata;
140141

141142
typedef bool (*BNLoadPluginCallback)(const char* repoPath, const char* pluginPath, void* ctx);
142143

@@ -1257,6 +1258,7 @@ extern "C"
12571258
SuccessfulScriptExecution
12581259
};
12591260

1261+
12601262
struct BNScriptingInstanceCallbacks
12611263
{
12621264
void* context;
@@ -1474,6 +1476,21 @@ extern "C"
14741476
double seconds;
14751477
};
14761478

1479+
enum BNMetadataType
1480+
{
1481+
BooleanDataType,
1482+
StringDataType,
1483+
UnsignedIntegerDataType,
1484+
SignedIntegerDataType,
1485+
DoubleDataType,
1486+
BooleanListDataType,
1487+
StringListDataType,
1488+
UnsignedIntegerListDataType,
1489+
SignedIntegerListDataType,
1490+
DoubleListDataType,
1491+
RawDataType
1492+
};
1493+
14771494
BINARYNINJACOREAPI char* BNAllocString(const char* contents);
14781495
BINARYNINJACOREAPI void BNFreeString(char* str);
14791496
BINARYNINJACOREAPI void BNFreeStringList(char** strs, size_t count);
@@ -1504,6 +1521,7 @@ extern "C"
15041521
BINARYNINJACOREAPI char* BNGetUserDirectory(void);
15051522
BINARYNINJACOREAPI char* BNGetUserPluginDirectory(void);
15061523
BINARYNINJACOREAPI char* BNGetRepositoriesDirectory(void);
1524+
BINARYNINJACOREAPI char* BNGetSettingsFileName(void);
15071525
BINARYNINJACOREAPI void BNSaveLastRun(void);
15081526

15091527
BINARYNINJACOREAPI char* BNGetPathRelativeToBundledPluginDirectory(const char* path);
@@ -2859,7 +2877,94 @@ extern "C"
28592877
// Filesystem functionality
28602878
BINARYNINJACOREAPI int BNDeleteFile(const char* path);
28612879
BINARYNINJACOREAPI int BNDeleteDirectory(const char* path, int contentsOnly);
2862-
BINARYNINJACOREAPI int BNCreateDirectory(const char* path);
2880+
BINARYNINJACOREAPI bool BNCreateDirectory(const char* path, bool createSubdirectories);
2881+
BINARYNINJACOREAPI bool BNPathExists(const char* path);
2882+
BINARYNINJACOREAPI bool BNIsPathDirectory(const char* path);
2883+
BINARYNINJACOREAPI bool BNIsPathRegularFile(const char* path);
2884+
2885+
// Settings APIs
2886+
BINARYNINJACOREAPI bool BNProcessMainSettingsFile();
2887+
BINARYNINJACOREAPI bool BNSettingGetBool(const char* settingGroup, const char* name, bool defaultValue);
2888+
BINARYNINJACOREAPI uint64_t BNSettingGetInteger(const char* settingGroup, const char* name, uint64_t defaultValue);
2889+
BINARYNINJACOREAPI char* BNSettingGetString(const char* settingGroup, const char* name, const char* defaultValue);
2890+
// intoutSize is number of elements in defaultValue one entry and number of elements in return type on exit
2891+
BINARYNINJACOREAPI uint64_t* BNSettingGetIntegerList(const char* settingGroup, const char* name, uint64_t* defaultValue, size_t* inoutSize);
2892+
// intoutSize is number of elements in defaultValue one entry and number of elements in return type on exit
2893+
BINARYNINJACOREAPI const char** BNSettingGetStringList(const char* settingGroup, const char* name, const char** defaultValue, size_t* inoutSize);
2894+
BINARYNINJACOREAPI double BNSettingGetDouble(const char* settingGroup, const char* name, double defaultValue);
2895+
2896+
BINARYNINJACOREAPI void BNFreeSettingStringList(char** stringList, size_t size);
2897+
BINARYNINJACOREAPI void BNFreeSettingIntegerList(uint64_t* integerList);
2898+
//Check the type of a core setting
2899+
BINARYNINJACOREAPI bool BNSettingIsBool(const char* name, const char* settingGroup);
2900+
BINARYNINJACOREAPI bool BNSettingIsInteger(const char* name, const char* settingGroup);
2901+
BINARYNINJACOREAPI bool BNSettingIsString(const char* name, const char* settingGroup);
2902+
BINARYNINJACOREAPI bool BNSettingIsStringList(const char* name, const char* settingGroup);
2903+
BINARYNINJACOREAPI bool BNSettingIsIntegerList(const char* name, const char* settingGroup);
2904+
BINARYNINJACOREAPI bool BNSettingIsDouble(const char* name, const char* settingGroup);
2905+
// Check if a plugin setting is present
2906+
BINARYNINJACOREAPI bool BNSettingIsPresent(const char* settingGroup, const char* name);
2907+
2908+
BINARYNINJACOREAPI bool BNSettingSetBool(const char* settingGroup, const char* name, bool value, bool autoFlush);
2909+
BINARYNINJACOREAPI bool BNSettingSetInteger(const char* settingGroup, const char* name, uint64_t value, bool autoFlush);
2910+
BINARYNINJACOREAPI bool BNSettingSetString(const char* settingGroup, const char* name, const char* value, bool autoFlush);
2911+
BINARYNINJACOREAPI bool BNSettingSetDouble(const char* settingGroup, const char* name, double value, bool autoFlush);
2912+
BINARYNINJACOREAPI bool BNSettingSetIntegerList(const char* settingGroup, const char* name, const uint64_t* value, size_t size, bool autoFlush);
2913+
BINARYNINJACOREAPI bool BNSettingSetStringList(const char* settingGroup, const char* name, const char** value, size_t size, bool autoFlush);
2914+
2915+
BINARYNINJACOREAPI bool BNSettingFlushSettings();
2916+
2917+
//Metadata APIs
2918+
2919+
// Create Metadata of various types
2920+
BINARYNINJACOREAPI BNMetadata* BNNewMetadataReference(BNMetadata* data);
2921+
BINARYNINJACOREAPI BNMetadata* BNCreateStructuredBooleanData(bool data);
2922+
BINARYNINJACOREAPI BNMetadata* BNCreateStructuredStringData(const char* data);
2923+
BINARYNINJACOREAPI BNMetadata* BNCreateStructuredUnsignedIntegerData(uint64_t data);
2924+
BINARYNINJACOREAPI BNMetadata* BNCreateStructuredSignedIntegerData(int64_t data);
2925+
BINARYNINJACOREAPI BNMetadata* BNCreateStructuredDoubleData(double data);
2926+
BINARYNINJACOREAPI BNMetadata* BNCreateStructuredBooleanListData(const bool* data, size_t size);
2927+
BINARYNINJACOREAPI BNMetadata* BNCreateStructuredStringListData(const char** data, size_t size);
2928+
BINARYNINJACOREAPI BNMetadata* BNCreateStructuredUnsignedIntegerListData(const uint64_t* data, size_t size);
2929+
BINARYNINJACOREAPI BNMetadata* BNCreateStructuredSignedIntegerListData(const int64_t* data, size_t size);
2930+
BINARYNINJACOREAPI BNMetadata* BNCreateStructuredDoubleListData(const double* data, size_t size);
2931+
BINARYNINJACOREAPI BNMetadata* BNCreateStructuredRawData(const uint8_t* data, size_t size);
2932+
BINARYNINJACOREAPI void BNFreeMetadata(BNMetadata* data);
2933+
BINARYNINJACOREAPI void BNFreeMetadataBooleanList(bool* data);
2934+
BINARYNINJACOREAPI void BNFreeMetadataStringList(char** data, size_t size);
2935+
BINARYNINJACOREAPI void BNFreeMetadataUnsignedIntegerList(uint64_t* data);
2936+
BINARYNINJACOREAPI void BNFreeMetadataSignedIntegerList(int64_t* data);
2937+
BINARYNINJACOREAPI void BNFreeMetadataDoubleList(double* data);
2938+
BINARYNINJACOREAPI void BNFreeMetadataRaw(uint8_t* data);
2939+
// Retrieve Structured Data
2940+
BINARYNINJACOREAPI bool BNMetadataGetBoolean(BNMetadata* data);
2941+
BINARYNINJACOREAPI char* BNMetadataGetString(BNMetadata* data);
2942+
BINARYNINJACOREAPI uint64_t BNMetadataGetUnsignedInteger(BNMetadata* data);
2943+
BINARYNINJACOREAPI int64_t BNMetadataGetSignedInteger(BNMetadata* data);
2944+
BINARYNINJACOREAPI double BNMetadataGetDouble(BNMetadata* data);
2945+
BINARYNINJACOREAPI bool* BNMetadataGetBooleanList(BNMetadata* data, size_t* size);
2946+
BINARYNINJACOREAPI char** BNMetadataGetStringList(BNMetadata* data, size_t* size);
2947+
BINARYNINJACOREAPI uint64_t* BNMetadataGetUnsignedIntegerList(BNMetadata* data, size_t* size);
2948+
BINARYNINJACOREAPI int64_t* BNMetadataGetSignedIntegerList(BNMetadata* data, size_t* size);
2949+
BINARYNINJACOREAPI double* BNMetadataGetDoubleList(BNMetadata* data, size_t* size);
2950+
BINARYNINJACOREAPI uint8_t* BNMetadataGetRaw(BNMetadata* data, size_t* size);
2951+
//Query type of Metadata
2952+
BINARYNINJACOREAPI BNMetadataType BNMetadataGetType(BNMetadata* data);
2953+
BINARYNINJACOREAPI bool BNMetadataIsBoolean(BNMetadata* data);
2954+
BINARYNINJACOREAPI bool BNMetadataIsString(BNMetadata* data);
2955+
BINARYNINJACOREAPI bool BNMetadataIsUnsignedInteger(BNMetadata* data);
2956+
BINARYNINJACOREAPI bool BNMetadataIsSignedInteger(BNMetadata* data);
2957+
BINARYNINJACOREAPI bool BNMetadataIsDouble(BNMetadata* data);
2958+
BINARYNINJACOREAPI bool BNMetadataIsBooleanList(BNMetadata* data);
2959+
BINARYNINJACOREAPI bool BNMetadataIsStringList(BNMetadata* data);
2960+
BINARYNINJACOREAPI bool BNMetadataIsUnsignedIntegerList(BNMetadata* data);
2961+
BINARYNINJACOREAPI bool BNMetadataIsSignedIntegerList(BNMetadata* data);
2962+
BINARYNINJACOREAPI bool BNMetadataIsDoubleList(BNMetadata* data);
2963+
BINARYNINJACOREAPI bool BNMetadataIsRaw(BNMetadata* data);
2964+
2965+
// Store/Query structured data to/from a BinaryView
2966+
BINARYNINJACOREAPI void BNBinaryViewStoreMetadata(BNBinaryView* view, const char* key, BNMetadata* value);
2967+
BINARYNINJACOREAPI bool BNBinaryViewQueryMetadata(BNBinaryView* view, const char* key, BNMetadata** value);
28632968
#ifdef __cplusplus
28642969
}
28652970
#endif

binaryreader.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,3 +266,40 @@ bool BinaryReader::IsEndOfFile() const
266266
{
267267
return BNIsEndOfFile(m_stream);
268268
}
269+
270+
271+
template <typename T>
272+
T BinaryReader::Read()
273+
{
274+
T value;
275+
Read((char*)&value, sizeof(T));
276+
return value;
277+
}
278+
279+
template<typename T>
280+
vector<T> BinaryReader::ReadVector(size_t count)
281+
{
282+
T* buff = new T[count];
283+
Read((char*)buff, count * sizeof(T));
284+
std::vector<T> out(buff, buff + count);
285+
return out;
286+
}
287+
288+
289+
string BinaryReader::ReadCString(size_t maxSize)
290+
{
291+
string result;
292+
try
293+
{
294+
for (size_t i = 0; i < maxSize; i++)
295+
{
296+
char cur = Read8();
297+
if (cur == 0)
298+
break;
299+
result.push_back(cur);
300+
}
301+
}
302+
catch (ReadException& r)
303+
{;}
304+
return result;
305+
}

binaryview.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1826,6 +1826,57 @@ vector<BNAddressRange> BinaryView::GetAllocatedRanges()
18261826
}
18271827

18281828

1829+
void BinaryView::StoreMetadata(const std::string& key, Metadata* inValue)
1830+
{
1831+
if (!inValue)
1832+
return;
1833+
BNBinaryViewStoreMetadata(m_object, key.c_str(), inValue->GetObject());
1834+
}
1835+
1836+
1837+
bool BinaryView::QueryMetadata(const std::string& key, Metadata** outValue)
1838+
{
1839+
BNMetadata* value = nullptr;
1840+
bool status = BNBinaryViewQueryMetadata(m_object, key.c_str(), &value);
1841+
if (!status)
1842+
{
1843+
*outValue = nullptr;
1844+
return false;
1845+
}
1846+
*outValue = new Metadata(value);
1847+
return true;
1848+
}
1849+
1850+
string BinaryView::GetStringMetadata(const string& key)
1851+
{
1852+
Metadata* data;
1853+
if (!QueryMetadata(key, &data) || !data || data->IsString())
1854+
throw QueryMetadataException("Failed to find key: " + key);
1855+
auto result = data->GetString();
1856+
delete data;
1857+
return result;
1858+
}
1859+
1860+
vector<uint8_t> BinaryView::GetRawMetadata(const string& key)
1861+
{
1862+
Metadata* data;
1863+
if (!QueryMetadata(key, &data) || !data || data->IsRaw())
1864+
throw QueryMetadataException("Failed to find key: " + key);
1865+
auto result = data->GetRaw();
1866+
delete data;
1867+
return result;
1868+
}
1869+
1870+
uint64_t BinaryView::GetUIntMetadata(const string& key)
1871+
{
1872+
Metadata* data;
1873+
if (!QueryMetadata(key, &data) || !data || data->IsUnsignedInteger())
1874+
throw QueryMetadataException("Failed to find key: " + key);
1875+
auto result = data->GetUnsignedInteger();
1876+
delete data;
1877+
return result;
1878+
}
1879+
18291880
BinaryData::BinaryData(FileMetadata* file): BinaryView(BNCreateBinaryDataView(file->GetObject()))
18301881
{
18311882
}

0 commit comments

Comments
 (0)