3 个版本
使用旧的 Rust 2015
0.1.2 | 2017 年 10 月 22 日 |
---|---|
0.1.1 | 2017 年 10 月 1 日 |
0.1.0 | 2017 年 10 月 1 日 |
#39 in #injection
49KB
1K SLoC
依赖项劫持库
目前,Cargo 只支持带有源代码的依赖项。DHL 通过使用构建脚本来允许链接任何依赖项,即使是闭源依赖项!
DHL 通过使用本地虚拟包,然后用任意二进制文件劫持它来工作。
示例
让我们使用 DHL 链接到私有库 priv:1.0.0
。
导出
要从项目创建导出,首先运行 cargo clean
。然后运行 cargo build
,并使用您想要的任何配置和配置文件设置。将 target\<profile>\lib<file>.rlib
重命名为 export.rlib
,并将其添加到 exported.tar.gz
,以及来自 deps
文件夹的所有 .rlib
文件。它可能看起来像这样
exported.tar.gz
└── exported.tar
├── export.rlib
├── libdhltest_dash-cd91f6fd9f58022a.rlib
├── libdhltest_underscore-b5b654186491c38a.rlib
└── libdhltest-6d5270055f165b9c.rlib
导入
二进制设置
我们首先获取之前编译的私有库。在我们的项目根目录下,我们将创建一个名为 libs
的目录。在该目录中,我们将为关心的目标的三元组创建目录(例如,x86_64-pc-windows-msvc
)。在那些目录中的每一个,我们将为我们的 rustc 编译器版本创建一个目录(例如,rustc-1.21.0-13d94d5fa
)。在这个目录中,我们将放置我们的 exported.tar.gz
。
虚拟设置
现在让我们创建虚拟包。我们创建一个名为 priv
的文件夹,其中包含一个如下的 Cargo.toml
文件
[package]
name = "priv"
version = "1.0.0"
authors = [""]
在 priv
中,我们创建一个 src
文件夹,其中包含一个空的 lib.rs
文件。
注入
为了设置我们的项目 Cargo.toml
,我们需要做一些事情
- 将
priv
添加到dependencies
和build-dependencies
- 添加来自
priv
的任何dependencies
- 将
dhl
添加为build-dependencies
- 配置 dhl 元数据以找到先前编译的
- 添加一个运行 dhl 的构建脚本。
[package]
...
build = "build.rs"
[dependencies]
priv = { path = "priv" }
...
[build-dependencies]
priv = { path = "priv" }
dhl = "^0.1"
[package.metadata.dhl.packages]
priv = "./libs/{{target}}/{{rustc_short_version}}/exported.tar.gz"
{{target}}
和 {{rustc_short_version}}
在构建过程中通过 Handlebars 模板引擎进行替换。
至于我们的构建脚本,相当简短
extern crate dhl;
fn main() {
dhl::simply_deliver().unwrap();
}
就这样。 cargo build
我们应该就绪了。
选项
可以通过 [package.metadata.dhl.packages]
配置软件包选项。每个软件包可以直接分配一个源
priv = "./libs/{{target}}/{{rustc_short_version}}/exported.tar.gz"
源可以是文件的路径(相对路径基于 CARGO_MANIFEST_DIR
),或一个 URL。目前唯一支持的方案是
文件
http
https
至于替换,可用的内置变量有
{{rustc_short_version}}
{{target}}
{{profile}}
后两个变量取自环境变量。这些可以通过提供 [package.metadata.dhl.substitutions]
部分(直接字符串分配)来删除或更改
foo = "bar"
或使用环境变量的值
foo = { value = "BAR", env = true }
常见问题解答
我的代码能否从 .rlib 文件中逆向工程
是的。据我所知,尚未对 .rlib 文件进行混淆。理论上,您可以将源代码通过混淆器运行并分发。我不了解 Rust 的任何混淆器,但如果有人知道,我很乐意在这里链接。
依赖项
~18–29MB
~479K SLoC