Skip to content

Commit 2c37c04

Browse files
committed
Add WARP to free
1 parent 9b37e3a commit 2c37c04

File tree

9 files changed

+207
-55
lines changed

9 files changed

+207
-55
lines changed

Cargo.lock

Lines changed: 25 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ members = [
1818
"plugins/idb_import",
1919
"plugins/pdb-ng",
2020
"plugins/pdb-ng/demo",
21-
"plugins/warp",
21+
"plugins/warp",
22+
"plugins/warp/demo",
2223
"plugins/svd",
2324
"plugins/svd/demo"
2425
]

plugins/warp/CMakeLists.txt

Lines changed: 77 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -29,57 +29,91 @@ if(NOT HEADLESS)
2929
endif()
3030

3131
if(CMAKE_BUILD_TYPE MATCHES Debug)
32-
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/debug)
33-
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target)
32+
if(DEMO)
33+
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/dev-demo)
34+
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --profile=dev-demo)
35+
else()
36+
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/debug)
37+
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target)
38+
endif()
3439
else()
35-
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/release)
36-
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --release)
40+
if(DEMO)
41+
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/release-demo)
42+
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --profile=release-demo)
43+
else()
44+
set(TARGET_DIR ${PROJECT_BINARY_DIR}/target/release)
45+
set(CARGO_OPTS --target-dir=${PROJECT_BINARY_DIR}/target --release)
46+
endif()
3747
endif()
3848

3949
if(FORCE_COLORED_OUTPUT)
4050
set(CARGO_OPTS ${CARGO_OPTS} --color always)
4151
endif()
4252

43-
# NOTE: --no-default-features is set to disable building artifacts used for testing
44-
# NOTE: the linker is looking in the target dir and linking on it apparently.
45-
set(CARGO_FEATURES "--no-default-features")
46-
set(OUTPUT_FILE_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX})
47-
set(OUTPUT_PDB_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}.pdb)
48-
set(OUTPUT_LIB_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}.dll.lib)
49-
set(OUTPUT_FILE_PATH ${BN_CORE_PLUGIN_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX})
50-
set(OUTPUT_PDB_PATH ${BN_CORE_PLUGIN_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}.pdb)
51-
set(OUTPUT_LIB_PATH ${BN_CORE_PLUGIN_DIR}/${PROJECT_NAME}.lib)
52-
5353
# warp_ninja_interface is the target hack im going with for now to get warp_api to build on windows
5454
add_library(${PROJECT_NAME}_interface INTERFACE)
5555
add_dependencies(${PROJECT_NAME}_interface ${PROJECT_NAME})
5656

57+
if(DEMO)
58+
set(CARGO_FEATURES --features demo --manifest-path ${PROJECT_SOURCE_DIR}/demo/Cargo.toml)
59+
60+
set(OUTPUT_FILE_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}${PROJECT_NAME}_static${CMAKE_STATIC_LIBRARY_SUFFIX})
61+
set(OUTPUT_PDB_NAME ${CMAKE_STATIC_LIBRARY_PREFIX}${PROJECT_NAME}.pdb)
62+
set(OUTPUT_FILE_PATH ${CMAKE_BINARY_DIR}/${OUTPUT_FILE_NAME})
63+
set(OUTPUT_PDB_PATH ${CMAKE_BINARY_DIR}/${OUTPUT_PDB_NAME})
64+
65+
set(BINJA_LIB_DIR $<TARGET_FILE_DIR:binaryninjacore>)
66+
else()
67+
# NOTE: --no-default-features is set to disable building artifacts used for testing
68+
# NOTE: the linker is looking in the target dir and linking on it apparently.
69+
set(CARGO_FEATURES "--no-default-features")
70+
71+
set(OUTPUT_FILE_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX})
72+
set(OUTPUT_PDB_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}.pdb)
73+
set(OUTPUT_LIB_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PROJECT_NAME}.dll.lib)
74+
set(OUTPUT_FILE_PATH ${BN_CORE_PLUGIN_DIR}/${OUTPUT_FILE_NAME})
75+
set(OUTPUT_PDB_PATH ${BN_CORE_PLUGIN_DIR}/${OUTPUT_PDB_NAME})
76+
set(OUTPUT_LIB_PATH ${BN_CORE_PLUGIN_DIR}/${PROJECT_NAME}.lib)
77+
78+
set(BINJA_LIB_DIR ${BN_INSTALL_BIN_DIR})
79+
endif()
80+
81+
5782
add_custom_target(${PROJECT_NAME} ALL DEPENDS ${OUTPUT_FILE_PATH})
5883
add_dependencies(${PROJECT_NAME} binaryninjaapi)
5984
get_target_property(BN_API_SOURCE_DIR binaryninjaapi SOURCE_DIR)
6085
list(APPEND CMAKE_MODULE_PATH "${BN_API_SOURCE_DIR}/cmake")
6186
find_package(BinaryNinjaCore REQUIRED)
6287

63-
set(BINJA_LIB_DIR ${BN_INSTALL_BIN_DIR})
64-
6588
set_property(TARGET ${PROJECT_NAME} PROPERTY OUTPUT_FILE_PATH ${OUTPUT_FILE_PATH})
6689

6790
# Add the whole api to the depends too
6891
file(GLOB API_SOURCES CONFIGURE_DEPENDS
6992
${BN_API_SOURCE_DIR}/binaryninjacore.h
70-
${BN_API_SOURCE_DIR}/rust/src/*/*.rs)
93+
${BN_API_SOURCE_DIR}/rust/src/*.rs
94+
${BN_API_SOURCE_DIR}/rust/binaryninjacore-sys/src/*.rs)
7195

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

7599
if(APPLE)
76100
if(UNIVERSAL)
77101
if(CMAKE_BUILD_TYPE MATCHES Debug)
78-
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/debug/${OUTPUT_FILE_NAME})
79-
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/debug/${OUTPUT_FILE_NAME})
102+
if(DEMO)
103+
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/dev-demo/${OUTPUT_FILE_NAME})
104+
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/dev-demo/${OUTPUT_FILE_NAME})
105+
else()
106+
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/debug/${OUTPUT_FILE_NAME})
107+
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/debug/${OUTPUT_FILE_NAME})
108+
endif()
80109
else()
81-
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/release/${OUTPUT_FILE_NAME})
82-
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/release/${OUTPUT_FILE_NAME})
110+
if(DEMO)
111+
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/release-demo/${OUTPUT_FILE_NAME})
112+
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/release-demo/${OUTPUT_FILE_NAME})
113+
else()
114+
set(AARCH64_LIB_PATH ${PROJECT_BINARY_DIR}/target/aarch64-apple-darwin/release/${OUTPUT_FILE_NAME})
115+
set(X86_64_LIB_PATH ${PROJECT_BINARY_DIR}/target/x86_64-apple-darwin/release/${OUTPUT_FILE_NAME})
116+
endif()
83117
endif()
84118

85119
add_custom_command(
@@ -101,12 +135,6 @@ if(APPLE)
101135
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
102136
)
103137
else()
104-
if(CMAKE_BUILD_TYPE MATCHES Debug)
105-
set(LIB_PATH ${PROJECT_BINARY_DIR}/target/debug/${OUTPUT_FILE_NAME})
106-
else()
107-
set(LIB_PATH ${PROJECT_BINARY_DIR}/target/release/${OUTPUT_FILE_NAME})
108-
endif()
109-
110138
add_custom_command(
111139
OUTPUT ${OUTPUT_FILE_PATH}
112140
COMMAND ${CMAKE_COMMAND} -E env
@@ -115,22 +143,33 @@ if(APPLE)
115143
COMMAND ${CMAKE_COMMAND} -E env
116144
MACOSX_DEPLOYMENT_TARGET=10.14 BINARYNINJADIR=${BINJA_LIB_DIR}
117145
${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
118-
COMMAND ${CMAKE_COMMAND} -E copy ${LIB_PATH} ${OUTPUT_FILE_PATH}
146+
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
119147
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
120148
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
121149
)
122150
endif()
123151
elseif(WIN32)
124-
add_custom_command(
125-
OUTPUT ${OUTPUT_FILE_PATH} ${OUTPUT_PDB_PATH} ${OUTPUT_LIB_PATH}
126-
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} clean ${CARGO_OPTS} --package binaryninjacore-sys
127-
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
128-
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
129-
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_PDB_NAME} ${OUTPUT_PDB_PATH}
130-
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_LIB_NAME} ${OUTPUT_LIB_PATH}
131-
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
132-
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
133-
)
152+
if(DEMO)
153+
add_custom_command(
154+
OUTPUT ${OUTPUT_FILE_PATH}
155+
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} clean ${CARGO_OPTS}
156+
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
157+
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
158+
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
159+
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
160+
)
161+
else()
162+
add_custom_command(
163+
OUTPUT ${OUTPUT_FILE_PATH} ${OUTPUT_LIB_PATH}
164+
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} clean ${CARGO_OPTS} --package binaryninjacore-sys
165+
COMMAND ${CMAKE_COMMAND} -E env BINARYNINJADIR=${BINJA_LIB_DIR} ${RUSTUP_COMMAND} build ${CARGO_OPTS} ${CARGO_FEATURES}
166+
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_FILE_NAME} ${OUTPUT_FILE_PATH}
167+
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_PDB_NAME} ${OUTPUT_PDB_PATH}
168+
COMMAND ${CMAKE_COMMAND} -E copy ${TARGET_DIR}/${OUTPUT_LIB_NAME} ${OUTPUT_LIB_PATH}
169+
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
170+
DEPENDS ${PLUGIN_SOURCES} ${API_SOURCES}
171+
)
172+
endif()
134173
else()
135174
add_custom_command(
136175
OUTPUT ${OUTPUT_FILE_PATH}

plugins/warp/api/CMakeLists.txt

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,22 @@ endif()
2727

2828
# Link to the warp plugin.
2929
# TODO: Need to make this less scuffed, but this will do for now.
30-
if (WIN32)
31-
# By linking to warp_ninja_interface we insure that we get built _after_ the lib has been generated.
32-
target_link_libraries(${PROJECT_NAME} warp_ninja_interface "${BN_CORE_PLUGIN_DIR}/warp_ninja.lib")
30+
if (DEMO)
31+
target_link_libraries(${PROJECT_NAME} warp_ninja_interface ${CMAKE_BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}warp_ninja_static${CMAKE_STATIC_LIBRARY_SUFFIX})
3332
else ()
34-
target_link_libraries(${PROJECT_NAME} warp_ninja_interface ${BN_CORE_PLUGIN_DIR}/libwarp_ninja${CMAKE_SHARED_LIBRARY_SUFFIX})
35-
# Set RPATH so the library can be found at runtime
36-
if(APPLE)
37-
set_target_properties(${PROJECT_NAME} PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE INSTALL_RPATH "@loader_path")
38-
else()
39-
set_target_properties(${PROJECT_NAME} PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE INSTALL_RPATH "$ORIGIN")
33+
if (WIN32)
34+
# By linking to warp_ninja_interface we insure that we get built _after_ the lib has been generated.
35+
target_link_libraries(${PROJECT_NAME} warp_ninja_interface "${BN_CORE_PLUGIN_DIR}/warp_ninja.lib")
36+
else ()
37+
target_link_libraries(${PROJECT_NAME} warp_ninja_interface ${BN_CORE_PLUGIN_DIR}/libwarp_ninja${CMAKE_SHARED_LIBRARY_SUFFIX})
38+
# Set RPATH so the library can be found at runtime
39+
if(APPLE)
40+
set_target_properties(${PROJECT_NAME} PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE INSTALL_RPATH "@loader_path")
41+
else()
42+
set_target_properties(${PROJECT_NAME} PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE INSTALL_RPATH "$ORIGIN")
43+
endif()
4044
endif()
41-
endif()
45+
endif ()
4246

4347
set_target_properties(warp_api PROPERTIES
4448
CXX_STANDARD 17

plugins/warp/demo/Cargo.toml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
[package]
2+
name = "warp_ninja-static"
3+
version = "0.1.0"
4+
edition = "2021"
5+
license = "Apache-2.0"
6+
7+
[lib]
8+
crate-type = ["lib", "staticlib"]
9+
path = "../src/lib.rs"
10+
11+
[features]
12+
demo = []
13+
14+
[dependencies]
15+
binaryninja = { workspace = true, features = ["rayon", "demo"] }
16+
binaryninjacore-sys.workspace = true
17+
warp = { git = "https://github.com/Vector35/warp/", tag = "1.0.0" }
18+
log = "0.4"
19+
itertools = "0.14.0"
20+
dashmap = { version = "6.1", features = ["rayon"]}
21+
rayon = "1.10"
22+
arboard = "3.4"
23+
walkdir = "2.5"
24+
serde = { version = "1.0", features = ["derive"] }
25+
serde_json = "1.0"
26+
uuid = { version = "1.12.0", features = ["v4"] }
27+
thiserror = "2.0"
28+
ar = { git = "https://github.com/mdsteele/rust-ar" }
29+
tempdir = "0.3.7"
30+
regex = "1.11"
31+
reqwest = { version = "0.12", features = ["blocking", "json", "multipart"] }
32+
33+
# For reports
34+
minijinja = "2.10.2"
35+
minijinja-embed = "2.10.2"
36+
37+
[build-dependencies]
38+
minijinja-embed = "2.10.2"

plugins/warp/demo/build.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
use std::path::PathBuf;
2+
3+
fn main() {
4+
let link_path = std::env::var_os("DEP_BINARYNINJACORE_PATH")
5+
.expect("DEP_BINARYNINJACORE_PATH not specified");
6+
7+
println!("cargo::rustc-link-lib=dylib=binaryninjacore");
8+
println!("cargo::rustc-link-search={}", link_path.to_str().unwrap());
9+
10+
#[cfg(not(target_os = "windows"))]
11+
{
12+
println!(
13+
"cargo::rustc-link-arg=-Wl,-rpath,{0},-L{0}",
14+
link_path.to_string_lossy()
15+
);
16+
}
17+
18+
println!("cargo::rerun-if-changed=../src/templates");
19+
// Templates used for rendering reports.
20+
minijinja_embed::embed_templates!("../src/templates");
21+
}

plugins/warp/src/plugin.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,7 @@ fn load_network_container() {
8686
background_task.finish();
8787
}
8888

89-
#[no_mangle]
90-
#[allow(non_snake_case)]
91-
pub extern "C" fn CorePluginInit() -> bool {
89+
fn plugin_init() {
9290
Logger::new("WARP").with_level(LevelFilter::Debug).init();
9391

9492
// Register our matcher and plugin settings globally.
@@ -194,12 +192,28 @@ pub extern "C" fn CorePluginInit() -> bool {
194192
"Create signature files from select project files",
195193
project::CreateSignatures {},
196194
);
195+
}
196+
197+
#[no_mangle]
198+
#[allow(non_snake_case)]
199+
#[cfg(feature = "demo")]
200+
pub extern "C" fn WarpPluginInit() -> bool {
201+
plugin_init();
202+
true
203+
}
197204

205+
#[no_mangle]
206+
#[allow(non_snake_case)]
207+
#[cfg(not(feature = "demo"))]
208+
pub extern "C" fn CorePluginInit() -> bool {
209+
plugin_init();
198210
true
199211
}
200212

201213
#[unsafe(no_mangle)]
214+
#[allow(non_snake_case)]
215+
#[cfg(not(feature = "demo"))]
202216
pub extern "C" fn CorePluginDependencies() {
203217
// TODO: Remove this once the objectivec workflow is registered on the meta workflow.
204218
add_optional_plugin_dependency("workflow_objc");
205-
}
219+
}

plugins/warp/ui/CMakeLists.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@ set(CMAKE_AUTORCC ON)
1616

1717
find_package(Qt6 COMPONENTS Core Gui Widgets REQUIRED)
1818

19-
add_library(${PROJECT_NAME} SHARED ${SOURCES} ${MOCS})
19+
if (DEMO)
20+
add_library(${PROJECT_NAME} STATIC ${SOURCES} ${MOCS})
21+
else ()
22+
add_library(${PROJECT_NAME} SHARED ${SOURCES} ${MOCS})
23+
endif ()
2024

2125
target_include_directories(${PROJECT_NAME} PRIVATE ../api)
2226

plugins/warp/ui/plugin.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,13 +186,19 @@ WarpSidebarWidgetType::WarpSidebarWidgetType() : SidebarWidgetType(QImage(":/ico
186186
extern "C" {
187187
BN_DECLARE_UI_ABI_VERSION
188188

189+
#ifndef DEMO_EDITION
189190
BINARYNINJAPLUGIN void CorePluginDependencies()
190191
{
191192
// We must have WARP to enable this plugin!
192193
AddRequiredPluginDependency("warp_ninja");
193194
}
195+
#endif
194196

195-
BINARYNINJAPLUGIN bool UIPluginInit()
197+
#ifdef DEMO_EDITION
198+
bool WarpUIPluginInit()
199+
#else
200+
BINARYNINJAPLUGIN bool UIPluginInit()
201+
#endif
196202
{
197203
Sidebar::addSidebarWidgetType(new WarpSidebarWidgetType());
198204
return true;

0 commit comments

Comments
 (0)