#dhl #hijacking #test #source #script #build-script #dummy

构建 dhltest_underscore

依赖项劫持库测试库

1 个稳定版本

使用旧的 Rust 2015

1.0.0 2017年10月1日

#6#dhl

33 每月下载量
dhl 中使用

MIT/Apache

1KB

依赖项劫持库

目前,Cargo 只提供对具有源代码的依赖项的支持。DHL 利用构建脚本允许链接到任何依赖项,即使是封闭源代码的依赖项!

DHL 通过使用本地虚拟 crate 并用任意二进制文件劫持它来工作。

示例

让我们使用 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 添加到 dependenciesbuild-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 的混淆器,但如果有,我会很高兴在这里链接它。

没有运行时依赖