Skip to content

Build

目前支持的架构

malefic 理论上支持 rust 能编译的几乎所有平台, 包括各种冷门架构的 IoT 设备, Android 系统, iOS 系统等等 (有相关需求可以联系我们定制化适配), 当前支持的架构可参考cross-rust

经过测试的 target

  • x86_64-apple-darwin
  • aarch64-apple-darwin
  • x86_64-unknown-linux-musl
  • i686-unknown-linux-musl
  • x86_64-pc-windows-msvc
  • i686-pc-windows-msvc
  • x86_64-pc-windows-gnu
  • i686-pc-windows-gnu
  • armv7-unknown-linux-musleabihf
  • armv7-unknown-linux-musleabi

基础环境配置

git clone

因为 malefic 需要用到代码生成, 并鼓励用户修改代码, 因此我们没有将代码打包到 docker 中.

git clone --recurse-submodules https://github.com/chainreactors/malefic

注意 clone 子项目

需要添加--recurse-submodules递归克隆子项目. 如果已经 clone 也不必担心,git submodule update --init 即可

下载 resources

使用install.sh会自动下载resources

下载对应的版本 resources.zip, 包含了编译需要用到的预编译的 malefic-win-kit lib/a 库文件.

community 的 resources 随着版本发布时的 release 发布: https://github.com/chainreactors/malefic/releases/latest

解压到源码目录下的 resrouces 文件夹下: 最终结果应该类似这样:

Docker 编译(推荐)

docker 自动化编译

rust 很复杂,不通过交叉编译的方式几乎无法实现所有架构的适配,所以我们参考了cross-rs/cross的方案,但是cross需要主机存在一个rust开发环境,并且导入了用户名等信息,编译环境不够干净,这并不完美的符合我们的需求:

1. cross需要宿主机存在一个rust开发环境,并会导入主机的一些信息(用户名等),编译环境不够干净,当然这可以通过虚拟机、github action等方式解决
2. cross对很多操作进行了封装,不够灵活,比如一些动态的变量引入、一些复杂的操作无法方便的实现

因此,我们参考了cross创建了用于维护malefic(即implant)编译的镜像仓库[chainreactors/cross-rust](https://github.com/chainreactors/cross-rust).
这个项目暂时提供了一些主流架构的编译环境。

使用前需要先安装 docker

在 docker 中编译通过 volume 映射源码,编译完成会在./target/<target_triple>/目录下生成对应的二进制文件。

docker install

可参考官网介绍

curl -fsSL https://get.docker.com | sudo bash -s docker
国内安装 docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

目前已经支持的镜像:

  • ghcr.io/chainreactors/x86_64-pc-windows-msvc:nightly-2023-09-18-latest
  • ghcr.io/chainreactors/i686-pc-windows-msvc:nightly-2023-09-18-latest
  • ghcr.io/chainreactors/i686-pc-windows-gnu:nightly-2023-09-18-latest
  • ghcr.io/chainreactors/x86_64-pc-windows-gnu:nightly-2023-09-18-latest
  • ghcr.io/chainreactors/x86_64-unknown-linux-musl:nightly-2023-09-18-latest
  • ghcr.io/chainreactors/i686-unknown-linux-musl:nightly-2023-09-18-latest
  • ghcr.io/chainreactors/x86_64-unknown-linux-gnu:nightly-2023-09-18-latest
  • ghcr.io/chainreactors/i686-unknown-linux-gnu:nightly-2023-09-18-latest
  • ghcr.io/chainreactors/x86_64-apple-darwin:nightly-2023-09-18-latest
  • ghcr.io/chainreactors/aarch64-apple-darwin:nightly-2023-09-18-latest

如果不了解原理, 请选择对应target的镜像

ghcr.io/chainreactors/malefic-builder:v0.0.4 (包含x86_64/i686的windows-gnu、linux-musl以及x86_64/aarch64的darwin的target). 如果了解rust的编译操作, 可以使用这个镜像实现大多数编译场景

编译

请注意已完成了基础环境配置

使用install.sh 安装的会自动配置对应的基础环境. 如果是手动配置请检查基础环境配置

x86_64-unknown-linux-musl举例, 在 malefic 的代码根目录下执行

你可以通过一行命令执行 build

# cd /user/path/malefic/
docker run -v "$(pwd):/root/src" --rm -it ghcr.io/chainreactors/malefic-builder:v0.0.4 make beacon target_triple="x86_64-unknown-linux-musl"

# 如果不想每次都下载依赖, 可以使用
docker run -v "$(pwd):/root/src" -v "$(pwd)/cache/registry:/root/cargo/registry" -v "$(pwd)/cache/git:/root/cargo/git" --rm -it ghcr.io/chainreactors/malefic-builder:v0.0.4 make beacon target_triple="x86_64-unknown-linux-musl"

Github Action编译 (推荐)

目前client+server已经内置了github action编译的命令,可以通过client直接编译,你可通过action build --help查看详细用法。 接下来叙述如何手动通过gh编译。

首先, 你需要git clone一份malefic源码,并push到一份到你的仓库(建议设置私人仓库),并开启github action功能,参考下图:

然后, 在本地安装gh cli工具,通过设置GH_TOKEN环境变量或gh auth login登录你的github账号,然后执行如下命令即可编译.

注意: windows用户如果没有base64等函数,建议通过git-bash.exe执行.

  1. 编译beacon

    gh workflow run generate.yaml -f package="beacon" -f malefic_config_yaml=$(base64 -w 0 </path/to/malefic_src/config.yaml>) -f remark="write somthing.." -f targets="x86_64-pc-windows-gnu" -R <username/malefic>
    

  2. 编译bind

    gh workflow run generate.yaml -f package="beacon" -f malefic_config_yaml=$(base64 -w 0 </path/to/malefic_src/config.yaml>) -f remark="write somthing.." -f targets="x86_64-pc-windows-gnu" -R <username/malefic>
    

  3. 编译 pulse

    gh workflow run generate.yaml -f package="pulse" -f malefic_config_yaml=$(base64 -w 0 </path/to/malefic_src/config.yaml>) -f remark="write somthing.." -f targets="x86_64-pc-windows-gnu" -R <username/malefic>
    

  4. 编译prelude

    gh workflow run generate.yaml -f package="prelude" -f autorun_yaml=$(base64 -w 0 </path/to/malefic_src/autorun.yaml>) -f malefic_config_yaml=$(base64 -w 0 </path/to/malefic_src/config.yaml>) -f remark="write somthing.." -f targets="x86_64-pc-windows-gnu" -R <username/malefic>
    

  5. 编译modules

    gh workflow run generate.yaml -f package="modules" -f malefic_modules_features="execute_powershell execute_assembl..." -f remark="write somthing.." -f targets="x86_64-pc-windows-gnu" -R <username/malefic>
    
    编译完成后你可以通过gh run list --workflow=generate.yaml -R <username/malefic>查看编译结果, 通过gh run download <run_id> -R <username/malefic>下载对应的二进制文件.

本机编译

由于本地环境的编译更为复杂, 只建议有rust使用经验的用户采用

本机编译时交叉编译配置或者不同的target都可能有不同的环境依赖. 例如编译gnu相关需要依赖特定版本的gcc, 编译musl或者darwin也需要安装对应的环境。这些基础环境配置我们在docker里解决了一遍, 对于没有相关经验的使用者会非常劝退

如果没有丰富的rust使用经验, 建议使用我们提前准备的docker/github aciton进行编译

安装rust

linux安装 rust

curl https://sh.rustup.rs -sSf | sh

windows安装rust 三种方式选择一种即可:

  1. 直接下载安装程序: https://www.rust-lang.org/tools/install 或使用包管理工具下载
  2. scoop install
    scoop install rustup
    
  3. winget install
    winget install rustup
    

安装 toolchain

rustup default nightly-2023-09-18

环境配置

交叉编译小技巧

使用手动交叉编译也可以使用zigbuild可以免去坑非常多的环境配置问题

pip install cargo-zigbuild

编译命令如下,以malefic beacon为例:

cargo zigbuild --release -p malefic --target x86_64-pc-windows-gnu
cargo zigbuild --release -p malefic --target x86_64-unknown-linux-musl

linux

sudo apt install -y openssl libssl-dev libudev-dev cmake llvm clang musl-tools build-essential

windows

windows 配置msvc环境(使用x86_64-pc-windows-msvc必须)

请参考: https://rust-lang.github.io/rustup/installation/windows-msvc.html

windows 配置 gnu 环境(如果使用x86_64-pc-windows-gnu必须)

本地手动编译时,我们推荐 windows 用户使用msys2管理 GNU 工具链环境, 可通过官网二进制文件直接安装。

在 msys2 的 terminal 执行如下安装可以保证 64、32 位 GNU 工具链的正常编译

pacman -Syy # 更新包列表
pacman -S --needed mingw-w64-x86_64-gcc
pacman -S --needed mingw-w64-i686-gcc

你可以把 msys64 添加到环境变量中, 或通过notepad $PROFILE将如下内容添加到 powershell 配置中,实现在 powershell 中快速切换mingw64/32.

function mg {
    param (
        [ValidateSet("32", "64")]
        [string]$arch = "64"
    )

    $basePath = "D:\msys64\mingw" # 此处是你的msys2安装路径
    $env:PATH = "${basePath}${arch}\bin;" + $env:PATH
    Write-Host "Switched to mingw${arch} (bit) toolchain"
}
mg 64

用法参考下图:

switch mingw

编译

本机安装请注意下载resources并解压到指定目录

此部分也可以使用make命令进行编译, 与前文Makefile一致

编译 malefic

项目的配置(.cargo/config.toml、cargo.toml、Makefile)中提供了一些预设和编译优化选项. 熟悉 rust 的使用者也可以手动编译,malefic 目前使用的 rust 版本是nightly-2023-09-18.

在进行手动编译前, 请更改 beacon/bind 对应的配置项, 关于配置项, 请参考 beacon 配置说明

添加对应的目标编译架构,以x86_64-pc-windows-gnu为例

rustup target add x86_64-pc-windows-gnu

生成配置与代码

编译mutant, 或从malefic release中下载编译好的mutant,mutant 完整文档

cargo build --release -p malefic-mutant

通过 mutant 生成对应的配置

# 生成 beacon 编译所需的配置和代码
./target/release/malefic-mutant generate beacon
# 生成 bind 编译所需的配置和代码
./target/release/malefic-mutant generate bind

指定 target 编译

# mg 64
cargo build --release -p malefic --target x86_64-pc-windows-gnu
# mg 32
cargo build --release -p malefic --target i686-pc-windows-gnu

# 如果你需要编译win7的target,请使用如下命令
cargo +nightly build --release -p malefic --target x86_64-win7-windows-msvc -Z build-std=std,panic_abort

编译 malefic-prelude

生成配置

malefic-mutant generate prelude autorun.yaml
cargo build --release -p malefic-prelude --target x86_64-pc-windows-gnu

编译 malefic-pulse

在进行手动编译前, 请更改 pulse 对应的配置项, 关于配置项, 请参考 pulse 配置说明

malefic-mutant generate pulse

指定 target 编译

# mg 64
cargo build -p malefic-pulse --target x86_64-pc-windows-gnu
# mg 32
cargo build -p malefic-pulse --target i686-pc-windows-gnu

生成对应的 malefic-pulse.exe 文件后,您可以使用 objcopy 来进行 shellcode 的转化

objcopy -O binary malefic-pulse.exe malefic-pulse.bin

编译独立 modules

malefic 的 windows 平台目前支持动态加载 module, 因此可以编译单个或者一组 module, 然后通过load_module给已上线的 implant 添加新的功能.

load_module 使用文档

相关命令如下:

生成对应配置

malefic_mutant generate modules "execute_powershell execute_assembly"

编译 modules

cargo build --release --features "execute_powershell execute_assembly" -p malefic-modules --target x86_64-pc-windows-gnu

编译结果为target\[arch]\release\modules.dll

可以使用load_module热加载这个 dll

module 动态加载目前只支持 windows

linux 与 mac 在理论上也可以实现, 将会随着对应的kit发布

常见的使用场景:

  1. 编译一个不带任何 modules 的 malefic, 保持静态文件最小特征与最小体积. 通过load_module modules.dll 动态加载模块
  2. 根据场景快速开发 module, 然后动态加载到 malefic 中.
  3. 长时间保持静默的场景可以卸载所有的 modules, 并进入到 sleepmask 的堆加密状态. 等需要操作时重新加载 modules