Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
3f441ba
[Rust] Provide setters useful for creating NTR references
emesare Jan 29, 2026
a15837e
[Rust] Improve API surrounding binary view type libraries
emesare Jan 29, 2026
f203aa6
[Rust] Pass `type_reference` by ref to `TypeBuilder::named_type`
emesare Jan 29, 2026
2d457ca
[Rust] Add `BinaryViewExt::type_libraries`
emesare Feb 5, 2026
4af187f
[Rust] Impl `Debug` for `BinaryViewType`
emesare Feb 5, 2026
07c28a9
[Rust] Add `Symbol::ordinal`
emesare Feb 5, 2026
d27c45e
[Rust] Fix UB when passing include directories to `CoreTypeParser`
emesare Feb 5, 2026
73d7d44
[Rust] Impl `Send` and `Sync` for `TypeLibrary`
emesare Feb 5, 2026
fe9cb76
[Rust] Fix plugins being referenced in `cargo about` output
emesare Feb 6, 2026
5d0443e
[Rust] Fix rust version in `binaryninja` crate being outdated
emesare Feb 6, 2026
f4be569
[Rust] Misc documentation improvements
emesare Feb 6, 2026
6323a2f
[Rust] Fix unbalanced ref returned in `RemoteFile::core_file`
emesare Feb 10, 2026
2f20590
[Rust] Impl `From<BnString>` for `QualifiedName`
emesare Feb 10, 2026
aab46ab
[Rust] Use `PathBuf` instead of `String` for include directories para…
emesare Feb 10, 2026
9044577
[Rust] Fix clippy lints
emesare Feb 12, 2026
dbaea1d
[Rust] Impl `Debug` for `RemoteProject`
emesare Feb 10, 2026
3e10088
[Rust] Impl `Debug` for `RemoteFolder`
emesare Feb 10, 2026
9039340
[Rust] Refactor `FileMetadata` file information
emesare Feb 12, 2026
31b02eb
[Rust] Impl `Send` and `Sync` for `RemoteFile`
emesare Feb 12, 2026
5a4ef19
[Rust] Impl `Send` and `Sync` for `RemoteFolder`
emesare Feb 12, 2026
6f83b40
[Rust] Impl `Send` and `Sync` for `RemoteProject`
emesare Feb 12, 2026
39decde
[Rust] Add a precondition check to make sure metadata has been pulled…
emesare Feb 12, 2026
8c741ce
[Rust] Add `OwnedBackgroundTaskGuard` for finishing background task a…
emesare Feb 12, 2026
24a4887
[Rust] Add `load_project_file` and `load_project_file_with_progress`
emesare Feb 18, 2026
fccff9c
[Rust] Update allowed licenses
emesare Feb 12, 2026
7522595
[Python] Add missing `TypeLibrary.duplicate` API
emesare Feb 14, 2026
cdf41a0
[BNTL] Add API to remove data
emesare Feb 15, 2026
868c513
[Python] Add `TypeLibrary.remove_named_object` and `TypeLibrary.remov…
emesare Feb 14, 2026
af731ce
[Rust] Misc TypeLibrary API improvements
emesare Feb 14, 2026
164589c
[Rust] Add `TypeLibrary::remove_named_object` and `TypeLibrary::remov…
emesare Feb 14, 2026
ce235f0
[BNTL] Allow decompressing standalone TypeLibrary objects
emesare Feb 18, 2026
4f5c8fb
[Rust] Misc documentation cleanup
emesare Feb 18, 2026
e588c21
Add BNTL utility plugin
emesare Feb 12, 2026
b38d1b3
[BNTL Utils] Fix misc clippy lints
emesare Feb 18, 2026
018b5c1
[BNTL] Misc improvements
emesare Feb 19, 2026
f8f7f59
[Rust] Misc type library doc improvements
emesare Feb 19, 2026
18d89e8
[Rust] Fix `OwnedBackgroundTaskGuard` requiring mutable self
emesare Feb 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
554 changes: 520 additions & 34 deletions Cargo.lock

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ members = [
"plugins/warp/examples/headless",
"plugins/workflow_objc",
"plugins/workflow_objc/demo",
"plugins/bntl_utils",
"plugins/bntl_utils/cli",
]

[workspace.dependencies]
Expand Down
1 change: 1 addition & 0 deletions about.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ accepted = [
"LicenseRef-scancode-google-patent-license-fuchsia",
"MPL-2.0",
"LicenseRef-scancode-unknown-license-reference",
"BSD-2-Clause"
]
1 change: 1 addition & 0 deletions arch/msp430/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ version = "0.1.0"
authors = ["jrozner"]
edition = "2021"
license = "Apache-2.0"
publish = false

[dependencies]
binaryninja.workspace = true
Expand Down
1 change: 1 addition & 0 deletions arch/riscv/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ version = "0.1.0"
authors = ["Ryan Snyder <ryan.snyder.or@gmail.com>"]
edition = "2021"
license = "Apache-2.0"
publish = false

[dependencies]
binaryninja.workspace = true
Expand Down
23 changes: 8 additions & 15 deletions binaryninjaapi.h
Original file line number Diff line number Diff line change
Expand Up @@ -19915,21 +19915,6 @@ namespace BinaryNinja {
*/
TypeLibrary(Ref<Architecture> arch, const std::string& name);

/*! Decompresses a type library from a file

\param path
\return The string contents of the decompressed type library
*/
std::string Decompress(const std::string& path);

/*! Decompresses a type library from a file

\param path
\param output
\return True if the type library was successfully decompressed
*/
static bool DecompressToFile(const std::string& path, const std::string& output);

/*! Loads a finalized type library instance from file

\param path
Expand Down Expand Up @@ -19957,9 +19942,17 @@ namespace BinaryNinja {
/*! Saves a finalized type library instance to file

\param path
\return True if the type library was successfully written to the file
*/
bool WriteToFile(const std::string& path);

/*! Decompresses the type library to a JSON file

\param path
\return True if the type library was successfully decompressed
*/
bool DecompressToFile(const std::string& path);

/*! The Architecture this type library is associated with

\return
Expand Down
5 changes: 4 additions & 1 deletion binaryninjacore.h
Original file line number Diff line number Diff line change
Expand Up @@ -6814,7 +6814,7 @@ extern "C"
BINARYNINJACOREAPI BNTypeLibrary* BNNewTypeLibraryReference(BNTypeLibrary* lib);
BINARYNINJACOREAPI BNTypeLibrary* BNDuplicateTypeLibrary(BNTypeLibrary* lib);
BINARYNINJACOREAPI BNTypeLibrary* BNLoadTypeLibraryFromFile(const char* path);
BINARYNINJACOREAPI bool BNTypeLibraryDecompressToFile(const char* file, const char* output);
BINARYNINJACOREAPI bool BNTypeLibraryDecompressToFile(BNTypeLibrary* lib, const char* output);
BINARYNINJACOREAPI void BNFreeTypeLibrary(BNTypeLibrary* lib);

BINARYNINJACOREAPI BNTypeLibrary* BNLookupTypeLibraryByName(BNArchitecture* arch, const char* name);
Expand Down Expand Up @@ -6851,11 +6851,14 @@ extern "C"
BINARYNINJACOREAPI BNTypeContainer* BNGetTypeLibraryTypeContainer(BNTypeLibrary* lib);

BINARYNINJACOREAPI void BNAddTypeLibraryNamedObject(BNTypeLibrary* lib, BNQualifiedName* name, BNType* type);
BINARYNINJACOREAPI void BNRemoveTypeLibraryNamedObject(BNTypeLibrary* lib, BNQualifiedName* name);
BINARYNINJACOREAPI void BNAddTypeLibraryNamedType(BNTypeLibrary* lib, BNQualifiedName* name, BNType* type);
BINARYNINJACOREAPI void BNRemoveTypeLibraryNamedType(BNTypeLibrary* lib, BNQualifiedName* name);
BINARYNINJACOREAPI void BNAddTypeLibraryNamedTypeSource(BNTypeLibrary* lib, BNQualifiedName* name, const char* source);

BINARYNINJACOREAPI BNType* BNGetTypeLibraryNamedObject(BNTypeLibrary* lib, BNQualifiedName* name);
BINARYNINJACOREAPI BNType* BNGetTypeLibraryNamedType(BNTypeLibrary* lib, BNQualifiedName* name);
BINARYNINJACOREAPI char* BNGetTypeLibraryNamedTypeSource(BNTypeLibrary* lib, BNQualifiedName* name);

BINARYNINJACOREAPI BNQualifiedNameAndType* BNGetTypeLibraryNamedObjects(BNTypeLibrary* lib, size_t* count);
BINARYNINJACOREAPI BNQualifiedNameAndType* BNGetTypeLibraryNamedTypes(BNTypeLibrary* lib, size_t* count);
Expand Down
168 changes: 168 additions & 0 deletions plugins/bntl_utils/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
cmake_minimum_required(VERSION 3.15 FATAL_ERROR)

project(bntl_utils)

if(NOT BN_API_BUILD_EXAMPLES AND NOT BN_INTERNAL_BUILD)
if(NOT BN_API_PATH)
# If we have not already defined the API source directory try and find it.
find_path(
BN_API_PATH
NAMES binaryninjaapi.h
# List of paths to search for the clone of the api
HINTS ../../.. ../../binaryninja/api/ binaryninjaapi binaryninja-api $ENV{BN_API_PATH}
REQUIRED
)
endif()
set(CARGO_STABLE_VERSION 1.91.1)
add_subdirectory(${BN_API_PATH} binaryninjaapi)
endif()

file(GLOB_RECURSE PLUGIN_SOURCES CONFIGURE_DEPENDS
${PROJECT_SOURCE_DIR}/Cargo.toml
${PROJECT_SOURCE_DIR}/src/*.rs)

if(CMAKE_BUILD_TYPE MATCHES Debug)
if(DEMO)
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/dev-demo)
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --profile=dev-demo)
else()
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/debug)
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target)
endif()
else()
if(DEMO)
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/release-demo)
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --profile=release-demo)
else()
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/release)
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --release)
endif()
endif()

if(FORCE_COLORED_OUTPUT)
set(CARGO_OPTS ${CARGO_OPTS} --color always)
endif()

if(DEMO)
set(CARGO_FEATURES --features demo --manifest-path ${PROJECT_SOURCE_DIR}/demo/Cargo.toml)

set(OUTPUT_FILE_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}${PROJECT_NAME}_static${CMAKE_STATIC_LIBRARY_SUFFIX})
set(OUTPUT_PDB_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}${PROJECT_NAME}.pdb)
set(OUTPUT_FILE_PATH ${CMAKE_BINARY_DIR}/${OUTPUT_FILE_NAME})
set(OUTPUT_PDB_PATH ${CMAKE_BINARY_DIR}/${OUTPUT_PDB_NAME})

set(BINJA_LIB_DIR $<TARGET_FILE_DIR:binaryninjacore>)
else()
# NOTE: --no-default-features is set to disable building artifacts used for testing
# NOTE: the linker is looking in the target dir and linking on it apparently.
set(CARGO_FEATURES "--no-default-features")

set(OUTPUT_FILE_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX})
set(OUTPUT_PDB_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}.pdb)
set(OUTPUT_FILE_PATH ${BN_CORE_PLUGIN_DIR}/${OUTPUT_FILE_NAME})
set(OUTPUT_PDB_PATH ${BN_CORE_PLUGIN_DIR}/${OUTPUT_PDB_NAME})

set(BINJA_LIB_DIR ${BN_INSTALL_BIN_DIR})
endif()


add_custom_target(${PROJECT_NAME} ALL DEPENDS ${OUTPUT_FILE_PATH})
add_dependencies(${PROJECT_NAME} binaryninjaapi)
get_target_property(BN_API_SOURCE_DIR binaryninjaapi SOURCE_DIR)
list(APPEND CMAKE_MODULE_PATH "${BN_API_SOURCE_DIR}/cmake")
find_package(BinaryNinjaCore REQUIRED)

set_property(TARGET ${PROJECT_NAME} PROPERTY OUTPUT_FILE_PATH ${OUTPUT_FILE_PATH})

# Add the whole api to the depends too
file(GLOB API_SOURCES CONFIGURE_DEPENDS
${BN_API_SOURCE_DIR}/binaryninjacore.h
${BN_API_SOURCE_DIR}/rust/src/*.rs
${BN_API_SOURCE_DIR}/rust/binaryninjacore-sys/src/*.rs)

find_program(RUSTUP_PATH rustup REQUIRED HINTS ~/.cargo/bin)
set(RUSTUP_COMMAND ${RUSTUP_PATH} run ${CARGO_STABLE_VERSION} cargo)

if(APPLE)
if(UNIVERSAL)
if(CMAKE_BUILD_TYPE MATCHES Debug)
if(DEMO)
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/dev-demo/${OUTPUT_FILE_NAME})
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/dev-demo/${OUTPUT_FILE_NAME})
else()
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/debug/${OUTPUT_FILE_NAME})
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/debug/${OUTPUT_FILE_NAME})
endif()
else()
if(DEMO)
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/release-demo/${OUTPUT_FILE_NAME})
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/release-demo/${OUTPUT_FILE_NAME})
else()
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/release/${OUTPUT_FILE_NAME})
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/release/${OUTPUT_FILE_NAME})
endif()
endif()

add_custom_command(
OUTPUT ${OUTPUT_FILE_PATH}
COMMAND ${CMAKE_COMMAND} -E env
MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
${RUSTUP_COMMAND} clean --target=aarch64-apple-darwin ${CARGO_OPTS} --package binaryninjacore-sys
COMMAND ${CMAKE_COMMAND} -E env
MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
${RUSTUP_COMMAND} clean --target=x86_64-apple-darwin ${CARGO_OPTS} --package binaryninjacore-sys
COMMAND ${CMAKE_COMMAND} -E env
MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
${RUSTUP_COMMAND} build --target=aarch64-apple-darwin ${CARGO_OPTS} ${CARGO_FEATURES}
COMMAND ${CMAKE_COMMAND} -E env
MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
${RUSTUP_COMMAND} build --target=x86_64-apple-darwin ${CARGO_OPTS} ${CARGO_FEATURES}
COMMAND lipo -create ${AARCH64_LIB_PATH} ${X86_64_LIB_PATH} -output ${OUTPUT_FILE_PATH}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
)
else()
add_custom_command(
OUTPUT ${OUTPUT_FILE_PATH}
COMMAND ${CMAKE_COMMAND} -E env
MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
${RUSTUP_COMMAND} clean ${CARGO_OPTS} --package binaryninjacore-sys
COMMAND ${CMAKE_COMMAND} -E env
MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
)
endif()
elseif(WIN32)
if(DEMO)
add_custom_command(
OUTPUT ${OUTPUT_FILE_PATH}
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} clean ${CARGO_OPTS} --package binaryninjacore-sys
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
)
else()
add_custom_command(
OUTPUT ${OUTPUT_FILE_PATH}
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} clean ${CARGO_OPTS} --package binaryninjacore-sys
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_PDB_NAME} ${OUTPUT_PDB_PATH}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
)
endif()
else()
add_custom_command(
OUTPUT ${OUTPUT_FILE_PATH}
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} clean ${CARGO_OPTS} --package binaryninjacore-sys
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
)
endif()
42 changes: 42 additions & 0 deletions plugins/bntl_utils/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
[package]
name = "bntl_utils"
version = "0.1.0"
edition = "2021"
license = "Apache-2.0"
publish = false

[lib]
crate-type = ["cdylib", "lib"]

[dependencies]
binaryninja.workspace = true
binaryninjacore-sys.workspace = true
tracing = "0.1"
thiserror = "2.0"
similar = "2.7.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
nt-apiset = "0.1.0"
url = "2.5"
uuid = "1.20"
walkdir = "2.5"
dashmap = "6.1"

# For TBD parsing
serde-saphyr = { version = "0.0.18", default-features = false, features = [] }

# For reports
minijinja = "2.10.2"
minijinja-embed = "2.10.2"

[build-dependencies]
minijinja-embed = "2.10.2"

# TODO: We need to depend on latest because the windows-metadata crate has not yet been bumped, but depending on the crate
# TODO: with git will mean we pull in all of the data of the crate instead of just the necessary bits, we likely need to
# TODO: wait until the windows-metadata crate is bumped before merging this PR.
# TODO: Relevant PR: https://github.com/microsoft/windows-rs/pull/3799
# TODO: Relevant issue: https://github.com/microsoft/windows-rs/issues/3887
[dependencies.windows-metadata]
git = "https://github.com/microsoft/windows-rs"
tag = "72"
5 changes: 5 additions & 0 deletions plugins/bntl_utils/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# BNTL Utilities

A plugin and CLI tool for processing Binary Ninja type libraries (BNTL).

For CLI build instructions and usage see [here](./cli/README.md).
48 changes: 48 additions & 0 deletions plugins/bntl_utils/build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
use std::path::PathBuf;

fn main() {
let link_path = std::env::var_os("DEP_BINARYNINJACORE_PATH")
.expect("DEP_BINARYNINJACORE_PATH not specified");

println!("cargo::rustc-link-lib=dylib=binaryninjacore");
println!("cargo::rustc-link-search={}", link_path.to_str().unwrap());

#[cfg(not(target_os = "windows"))]
{
println!(
"cargo::rustc-link-arg=-Wl,-rpath,{0},-L{0}",
link_path.to_string_lossy()
);
}

// #[cfg(target_os = "macos")]
// {
// let crate_name = std::env::var("CARGO_PKG_NAME").expect("CARGO_PKG_NAME not set");
// let lib_name = crate_name.replace('-', "_");
// println!(
// "cargo::rustc-link-arg=-Wl,-install_name,@rpath/lib{}.dylib",
// lib_name
// );
// }

let out_dir = std::env::var("OUT_DIR").expect("OUT_DIR specified");
let out_dir_path = PathBuf::from(out_dir);

// Copy all binaries to OUT_DIR for unit tests.
let bin_dir: PathBuf = "fixtures/".into();
if let Ok(entries) = std::fs::read_dir(bin_dir) {
for entry in entries {
let entry = entry.unwrap();
let path = entry.path();
if path.is_file() {
let file_name = path.file_name().unwrap();
let dest_path = out_dir_path.join(file_name);
std::fs::copy(&path, &dest_path).expect("failed to copy binary to OUT_DIR");
}
}
}

println!("cargo::rerun-if-changed=src/templates");
// Templates used for rendering reports.
minijinja_embed::embed_templates!("src/templates");
}
15 changes: 15 additions & 0 deletions plugins/bntl_utils/cli/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[package]
name = "bntl_cli"
version = "0.1.0"
edition = "2024"

[dependencies]
binaryninja.workspace = true
binaryninjacore-sys.workspace = true
bntl_utils = { path = "../" }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
clap = { version = "4.5.58", features = ["derive"] }
rayon = "1.11"
serde_json = "1.0"
thiserror = "2.0"
Loading
Loading