Skip to content

Commit ff3b32f

Browse files
Merge remote-tracking branch 'upstream' into dev
2 parents adaac6f + d9ff403 commit ff3b32f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

74 files changed

+2547
-510
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ suite/binaryninja/
7979
build
8080
generator
8181
types/
82+
!/docs/guide/types/
8283

8384
# Rust
8485
rust/**/*.swp

binaryninjaapi.h

Lines changed: 110 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3608,6 +3608,7 @@ namespace BinaryNinja {
36083608
Ref<ProjectFolder> GetParent() const;
36093609
bool SetParent(Ref<ProjectFolder> parent);
36103610
bool Export(const std::string& destination, const ProgressFunction& progressCallback = {}) const;
3611+
std::vector<Ref<ProjectFile>> GetFiles() const;
36113612
};
36123613

36133614
/*!
@@ -3688,6 +3689,8 @@ namespace BinaryNinja {
36883689
Ref<ProjectFile> GetFileById(const std::string& id) const;
36893690
Ref<ProjectFile> GetFileByPathOnDisk(const std::string& path) const;
36903691
std::vector<Ref<ProjectFile>> GetFilesByPathInProject(const std::string& path) const;
3692+
std::vector<Ref<ProjectFile>> GetFilesInFolder(Ref<ProjectFolder> folder) const;
3693+
36913694
bool PushFile(Ref<ProjectFile> file);
36923695
bool DeleteFile_(Ref<ProjectFile> file);
36933696

@@ -6008,8 +6011,9 @@ namespace BinaryNinja {
60086011
*/
60096012
bool IsOffsetBackedByFile(uint64_t offset) const;
60106013
bool IsOffsetCodeSemantics(uint64_t offset) const;
6011-
bool IsOffsetWritableSemantics(uint64_t offset) const;
60126014
bool IsOffsetExternSemantics(uint64_t offset) const;
6015+
bool IsOffsetWritableSemantics(uint64_t offset) const;
6016+
bool IsOffsetReadOnlySemantics(uint64_t offset) const;
60136017

60146018
/*! GetNextValidOffset implements a query for the next valid readable, writable, or executable virtual memory address after `offset`
60156019

@@ -7836,6 +7840,15 @@ namespace BinaryNinja {
78367840
uint64_t entrySize = 0, const std::string& linkedSection = "", const std::string& infoSection = "",
78377841
uint64_t infoData = 0);
78387842

7843+
/*! Adds multiple automatically defined sections in a batch operation
7844+
7845+
This method is more efficient than calling AddAutoSection multiple times as it only triggers
7846+
one SectionMap rebuild for all sections.
7847+
7848+
\param sections Vector of BNSectionInfo describing the sections to add
7849+
*/
7850+
void AddAutoSections(const std::vector<BNSectionInfo>& sections);
7851+
78397852
/*! Remove an automatically defined section by name
78407853

78417854
\param name Name of the section
@@ -7863,6 +7876,17 @@ namespace BinaryNinja {
78637876
uint64_t entrySize = 0, const std::string& linkedSection = "", const std::string& infoSection = "",
78647877
uint64_t infoData = 0);
78657878

7879+
/*! Adds multiple user-defined sections in a batch operation
7880+
7881+
This method is more efficient than calling AddUserSection multiple times as it only triggers
7882+
one SectionMap rebuild for all sections.
7883+
7884+
Note that all data specified must already be mapped by an existing segment.
7885+
7886+
\param sections Vector of BNSectionInfo describing the sections to add
7887+
*/
7888+
void AddUserSections(const std::vector<BNSectionInfo>& sections);
7889+
78667890
/*! Remove a user defined section by name
78677891

78687892
\param name Name of the section to remove
@@ -8129,6 +8153,22 @@ namespace BinaryNinja {
81298153
std::optional<std::pair<std::string, BNStringType>> StringifyUnicodeData(Architecture* arch, const DataBuffer& buffer, bool nullTerminates = true, bool allowShortStrings = false);
81308154
};
81318155

8156+
/*! MemoryMap provides access to the system-level memory map describing how a BinaryView is loaded into memory.
8157+
8158+
\note Architecture: This API-side MemoryMap class is a proxy that accesses the BinaryView's current
8159+
MemoryMap state through the core API. The proxy provides a simple mutable interface: when you call
8160+
modification operations (AddMemoryRegion, RemoveMemoryRegion, etc.), the proxy automatically accesses
8161+
the updated MemoryMap. Internally, the core uses immutable copy-on-write data structures, but the proxy
8162+
abstracts this away.
8163+
8164+
When you access a BinaryView's MemoryMap, you always see the current state. For lock-free access during
8165+
analysis, AnalysisContext provides memory layout query methods (IsValidOffset, IsOffsetReadable, GetStart,
8166+
GetLength, etc.) that operate on an immutable snapshot of the MemoryMap cached when the analysis was initiated.
8167+
8168+
A MemoryMap can contain multiple, arbitrarily overlapping memory regions. When modified, address space
8169+
segmentation is automatically managed. If multiple regions overlap, the most recently added region takes
8170+
precedence by default.
8171+
*/
81328172
class MemoryMap
81338173
{
81348174
BNBinaryView* m_object;
@@ -8142,6 +8182,22 @@ namespace BinaryNinja {
81428182
BNSetLogicalMemoryMapEnabled(m_object, enabled);
81438183
}
81448184

8185+
/*! Returns true if this MemoryMap represents a parsed BinaryView with real segments.
8186+
8187+
This is determined by whether the BinaryView has a parent view - parsed views
8188+
(ELF, PE, Mach-O, etc.) have a parent Raw view, while Raw views have no parent.
8189+
8190+
Returns true for parsed BinaryViews (ELF, PE, Mach-O, etc.) with segments from
8191+
binary format parsing. Returns false for Raw BinaryViews (flat file view with
8192+
synthetic MemoryMap) or views that failed to parse segments.
8193+
8194+
Use this to gate features that require parsed binary structure (sections, imports,
8195+
relocations, etc.). For basic analysis queries (GetStart, IsOffsetReadable,
8196+
GetLength, etc.), use the MemoryMap directly regardless of activation state - all
8197+
BinaryViews have a usable MemoryMap.
8198+
8199+
\return True if this is an activated (parsed) memory map, false otherwise
8200+
*/
81458201
bool IsActivated()
81468202
{
81478203
return BNIsMemoryMapActivated(m_object);
@@ -11420,8 +11476,61 @@ namespace BinaryNinja {
1142011476
request.Accept(writer);
1142111477
return Inform(buffer.GetString());
1142211478
}
11479+
11480+
// Settings cache access - lock-free access to cached settings
11481+
/*! Get a setting value from the cached settings
11482+
11483+
\code{.cpp}
11484+
bool enabled = analysisContext->GetSetting<bool>("analysis.conservative");
11485+
\endcode
11486+
11487+
\tparam T type for the value you are retrieving
11488+
\param key Key for the setting
11489+
\return Value for the setting, with type T
11490+
*/
11491+
template <typename T>
11492+
T GetSetting(const std::string& key);
11493+
11494+
// Memory map access - lock-free access to cached MemoryMap
11495+
bool IsValidOffset(uint64_t offset);
11496+
bool IsOffsetReadable(uint64_t offset);
11497+
bool IsOffsetWritable(uint64_t offset);
11498+
bool IsOffsetExecutable(uint64_t offset);
11499+
bool IsOffsetBackedByFile(uint64_t offset);
11500+
uint64_t GetStart();
11501+
uint64_t GetEnd();
11502+
uint64_t GetLength();
11503+
uint64_t GetNextValidOffset(uint64_t offset);
11504+
uint64_t GetNextMappedAddress(uint64_t addr, uint32_t flags = 0);
11505+
uint64_t GetNextBackedAddress(uint64_t addr, uint32_t flags = 0);
11506+
Ref<Segment> GetSegmentAt(uint64_t addr);
11507+
std::vector<BNAddressRange> GetMappedAddressRanges();
11508+
std::vector<BNAddressRange> GetBackedAddressRanges();
11509+
11510+
// Section map access - lock-free access to cached SectionMap
11511+
bool IsOffsetCodeSemantics(uint64_t offset);
11512+
bool IsOffsetExternSemantics(uint64_t offset);
11513+
bool IsOffsetWritableSemantics(uint64_t offset);
11514+
bool IsOffsetReadOnlySemantics(uint64_t offset);
11515+
std::vector<Ref<Section>> GetSections();
11516+
Ref<Section> GetSectionByName(const std::string& name);
11517+
std::vector<Ref<Section>> GetSectionsAt(uint64_t addr);
1142311518
};
1142411519

11520+
// Explicit template specialization declarations for AnalysisContext::GetSetting<T>
11521+
template <>
11522+
bool AnalysisContext::GetSetting<bool>(const std::string& key);
11523+
template <>
11524+
double AnalysisContext::GetSetting<double>(const std::string& key);
11525+
template <>
11526+
int64_t AnalysisContext::GetSetting<int64_t>(const std::string& key);
11527+
template <>
11528+
uint64_t AnalysisContext::GetSetting<uint64_t>(const std::string& key);
11529+
template <>
11530+
std::string AnalysisContext::GetSetting<std::string>(const std::string& key);
11531+
template <>
11532+
std::vector<std::string> AnalysisContext::GetSetting<std::vector<std::string>>(const std::string& key);
11533+
1142511534
/*!
1142611535
\ingroup workflow
1142711536
*/

binaryninjacore.h

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
// Current ABI version for linking to the core. This is incremented any time
3838
// there are changes to the API that affect linking, including new functions,
3939
// new types, or modifications to existing functions or types.
40-
#define BN_CURRENT_CORE_ABI_VERSION 147
40+
#define BN_CURRENT_CORE_ABI_VERSION 151
4141

4242
// Minimum ABI version that is supported for loading of plugins. Plugins that
4343
// are linked to an ABI version less than this will not be able to load and
@@ -3682,6 +3682,19 @@ extern "C"
36823682
uint32_t flags;
36833683
} BNSegmentInfo;
36843684

3685+
typedef struct BNSectionInfo {
3686+
const char* name;
3687+
uint64_t start;
3688+
uint64_t length;
3689+
BNSectionSemantics semantics;
3690+
const char* type;
3691+
uint64_t align;
3692+
uint64_t entrySize;
3693+
const char* linkedSection;
3694+
const char* infoSection;
3695+
uint64_t infoData;
3696+
} BNSectionInfo;
3697+
36853698
typedef bool(*BNCollaborationAnalysisConflictHandler)(void*, const char** keys, BNAnalysisMergeConflict** conflicts, size_t conflictCount);
36863699
typedef bool(*BNCollaborationNameChangesetFunction)(void*, BNCollaborationChangeset*);
36873700

@@ -4179,6 +4192,7 @@ extern "C"
41794192
BINARYNINJACOREAPI BNProjectFile* BNProjectGetFileById(BNProject* project, const char* id);
41804193
BINARYNINJACOREAPI BNProjectFile* BNProjectGetFileByPathOnDisk(BNProject* project, const char* path);
41814194
BINARYNINJACOREAPI BNProjectFile** BNProjectGetFilesByPathInProject(BNProject* project, const char* path, size_t* count);
4195+
BINARYNINJACOREAPI BNProjectFile** BNProjectGetFilesInFolder(BNProject* project, BNProjectFolder* folder, size_t* count);
41824196

41834197
BINARYNINJACOREAPI bool BNProjectPushFile(BNProject* project, BNProjectFile* file);
41844198
BINARYNINJACOREAPI bool BNProjectDeleteFile(BNProject* project, BNProjectFile* file);
@@ -4235,6 +4249,7 @@ extern "C"
42354249
BINARYNINJACOREAPI BNProject* BNProjectFolderGetProject(BNProjectFolder* folder);
42364250
BINARYNINJACOREAPI bool BNProjectFolderExport(BNProjectFolder* folder, const char* destination, void* ctxt,
42374251
BNProgressFunction progress);
4252+
BINARYNINJACOREAPI BNProjectFile** BNProjectFolderGetFiles(BNProjectFolder* folder, size_t* count);
42384253

42394254
// ExternalLibrary object
42404255
BINARYNINJACOREAPI BNExternalLibrary* BNNewExternalLibraryReference(BNExternalLibrary* lib);
@@ -4445,6 +4460,7 @@ extern "C"
44454460
BINARYNINJACOREAPI bool BNIsOffsetCodeSemantics(BNBinaryView* view, uint64_t offset);
44464461
BINARYNINJACOREAPI bool BNIsOffsetExternSemantics(BNBinaryView* view, uint64_t offset);
44474462
BINARYNINJACOREAPI bool BNIsOffsetWritableSemantics(BNBinaryView* view, uint64_t offset);
4463+
BINARYNINJACOREAPI bool BNIsOffsetReadOnlySemantics(BNBinaryView* view, uint64_t offset);
44484464
BINARYNINJACOREAPI uint64_t BNGetNextValidOffset(BNBinaryView* view, uint64_t offset);
44494465

44504466
BINARYNINJACOREAPI uint64_t BNGetImageBase(BNBinaryView* view);
@@ -4563,10 +4579,12 @@ extern "C"
45634579
BINARYNINJACOREAPI void BNAddAutoSection(BNBinaryView* view, const char* name, uint64_t start, uint64_t length,
45644580
BNSectionSemantics semantics, const char* type, uint64_t align, uint64_t entrySize, const char* linkedSection,
45654581
const char* infoSection, uint64_t infoData);
4582+
BINARYNINJACOREAPI void BNAddAutoSections(BNBinaryView* view, const BNSectionInfo* sectionInfo, size_t count);
45664583
BINARYNINJACOREAPI void BNRemoveAutoSection(BNBinaryView* view, const char* name);
45674584
BINARYNINJACOREAPI void BNAddUserSection(BNBinaryView* view, const char* name, uint64_t start, uint64_t length,
45684585
BNSectionSemantics semantics, const char* type, uint64_t align, uint64_t entrySize, const char* linkedSection,
45694586
const char* infoSection, uint64_t infoData);
4587+
BINARYNINJACOREAPI void BNAddUserSections(BNBinaryView* view, const BNSectionInfo* sectionInfo, size_t count);
45704588
BINARYNINJACOREAPI void BNRemoveUserSection(BNBinaryView* view, const char* name);
45714589
BINARYNINJACOREAPI BNSection** BNGetSections(BNBinaryView* view, size_t* count);
45724590
BINARYNINJACOREAPI BNSection** BNGetSectionsAt(BNBinaryView* view, uint64_t addr, size_t* count);
@@ -5930,6 +5948,37 @@ extern "C"
59305948
BNAnalysisContext* analysisContext, BNHighLevelILFunction* highLevelIL);
59315949
BINARYNINJACOREAPI bool BNAnalysisContextInform(BNAnalysisContext* analysisContext, const char* request);
59325950

5951+
// Settings cache access
5952+
BINARYNINJACOREAPI bool BNAnalysisContextGetSettingBool(BNAnalysisContext* analysisContext, const char* key);
5953+
BINARYNINJACOREAPI double BNAnalysisContextGetSettingDouble(BNAnalysisContext* analysisContext, const char* key);
5954+
BINARYNINJACOREAPI int64_t BNAnalysisContextGetSettingInt64(BNAnalysisContext* analysisContext, const char* key);
5955+
BINARYNINJACOREAPI uint64_t BNAnalysisContextGetSettingUInt64(BNAnalysisContext* analysisContext, const char* key);
5956+
BINARYNINJACOREAPI char* BNAnalysisContextGetSettingString(BNAnalysisContext* analysisContext, const char* key);
5957+
BINARYNINJACOREAPI char** BNAnalysisContextGetSettingStringList(BNAnalysisContext* analysisContext, const char* key, size_t* count);
5958+
5959+
// Memory map access
5960+
BINARYNINJACOREAPI bool BNAnalysisContextIsValidOffset(BNAnalysisContext* analysisContext, uint64_t offset);
5961+
BINARYNINJACOREAPI bool BNAnalysisContextIsOffsetReadable(BNAnalysisContext* analysisContext, uint64_t offset);
5962+
BINARYNINJACOREAPI bool BNAnalysisContextIsOffsetWritable(BNAnalysisContext* analysisContext, uint64_t offset);
5963+
BINARYNINJACOREAPI bool BNAnalysisContextIsOffsetExecutable(BNAnalysisContext* analysisContext, uint64_t offset);
5964+
BINARYNINJACOREAPI bool BNAnalysisContextIsOffsetBackedByFile(BNAnalysisContext* analysisContext, uint64_t offset);
5965+
BINARYNINJACOREAPI bool BNAnalysisContextIsOffsetCodeSemantics(BNAnalysisContext* analysisContext, uint64_t offset);
5966+
BINARYNINJACOREAPI bool BNAnalysisContextIsOffsetExternSemantics(BNAnalysisContext* analysisContext, uint64_t offset);
5967+
BINARYNINJACOREAPI bool BNAnalysisContextIsOffsetWritableSemantics(BNAnalysisContext* analysisContext, uint64_t offset);
5968+
BINARYNINJACOREAPI bool BNAnalysisContextIsOffsetReadOnlySemantics(BNAnalysisContext* analysisContext, uint64_t offset);
5969+
BINARYNINJACOREAPI BNSection** BNAnalysisContextGetSections(BNAnalysisContext* analysisContext, size_t* count);
5970+
BINARYNINJACOREAPI BNSection* BNAnalysisContextGetSectionByName(BNAnalysisContext* analysisContext, const char* name);
5971+
BINARYNINJACOREAPI BNSection** BNAnalysisContextGetSectionsAt(BNAnalysisContext* analysisContext, uint64_t addr, size_t* count);
5972+
BINARYNINJACOREAPI uint64_t BNAnalysisContextGetStart(BNAnalysisContext* analysisContext);
5973+
BINARYNINJACOREAPI uint64_t BNAnalysisContextGetEnd(BNAnalysisContext* analysisContext);
5974+
BINARYNINJACOREAPI uint64_t BNAnalysisContextGetLength(BNAnalysisContext* analysisContext);
5975+
BINARYNINJACOREAPI uint64_t BNAnalysisContextGetNextValidOffset(BNAnalysisContext* analysisContext, uint64_t offset);
5976+
BINARYNINJACOREAPI uint64_t BNAnalysisContextGetNextMappedAddress(BNAnalysisContext* analysisContext, uint64_t addr, uint32_t flags);
5977+
BINARYNINJACOREAPI uint64_t BNAnalysisContextGetNextBackedAddress(BNAnalysisContext* analysisContext, uint64_t addr, uint32_t flags);
5978+
BINARYNINJACOREAPI BNSegment* BNAnalysisContextGetSegmentAt(BNAnalysisContext* analysisContext, uint64_t addr);
5979+
BINARYNINJACOREAPI BNAddressRange* BNAnalysisContextGetMappedAddressRanges(BNAnalysisContext* analysisContext, size_t* count);
5980+
BINARYNINJACOREAPI BNAddressRange* BNAnalysisContextGetBackedAddressRanges(BNAnalysisContext* analysisContext, size_t* count);
5981+
59335982
// Activity
59345983
BINARYNINJACOREAPI BNActivity* BNCreateActivity(const char* configuration, void* ctxt, void (*action)(void*, BNAnalysisContext*));
59355984
BINARYNINJACOREAPI BNActivity* BNCreateActivityWithEligibility(const char* configuration, void* ctxt, void (*action)(void*, BNAnalysisContext*), bool (*eligibilityHandler)(void*, BNActivity*, BNAnalysisContext*));

binaryview.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2013,6 +2013,12 @@ bool BinaryView::IsOffsetWritableSemantics(uint64_t offset) const
20132013
}
20142014

20152015

2016+
bool BinaryView::IsOffsetReadOnlySemantics(uint64_t offset) const
2017+
{
2018+
return BNIsOffsetReadOnlySemantics(m_object, offset);
2019+
}
2020+
2021+
20162022
uint64_t BinaryView::GetNextValidOffset(uint64_t offset) const
20172023
{
20182024
return BNGetNextValidOffset(m_object, offset);
@@ -5263,6 +5269,12 @@ void BinaryView::AddAutoSection(const string& name, uint64_t start, uint64_t len
52635269
}
52645270

52655271

5272+
void BinaryView::AddAutoSections(const vector<BNSectionInfo>& sections)
5273+
{
5274+
BNAddAutoSections(m_object, sections.data(), sections.size());
5275+
}
5276+
5277+
52665278
void BinaryView::RemoveAutoSection(const string& name)
52675279
{
52685280
BNRemoveAutoSection(m_object, name.c_str());
@@ -5278,6 +5290,12 @@ void BinaryView::AddUserSection(const string& name, uint64_t start, uint64_t len
52785290
}
52795291

52805292

5293+
void BinaryView::AddUserSections(const vector<BNSectionInfo>& sections)
5294+
{
5295+
BNAddUserSections(m_object, sections.data(), sections.size());
5296+
}
5297+
5298+
52815299
void BinaryView::RemoveUserSection(const string& name)
52825300
{
52835301
BNRemoveUserSection(m_object, name.c_str());

0 commit comments

Comments
 (0)