Ghidra 是一个软件逆向工程(SRE)框架
在 Ghidra 版本目录的根目录下运行以下命令。
./docker/build-docker-image.sh
这将构建一个 Ghidra Docker 镜像,其标签与 Ghidra 的发布版本相对应。
Ghidra Docker 容器支持以下执行 MODE:
MODE 环境变量指定执行 Ghidra 的哪个入口点。
entrypoint.sh 脚本在容器启动时执行。
容器的配置方法与任何其他 Docker 容器相同。 可以挂载卷、设置环境变量、将端口从容器映射到主机等。 配置步骤根据容器启动时的 MODE 有很大差异。
Ghidra 在容器中的基础目录位于 /ghidra。
Ghidra 的所有文件、配置等的默认位置都在该目录内。
Ghidra 以用户 ghidra 的身份在容器中运行,uid 为 1001,guid 为 1001。
ghidra 用户仅拥有以下容器内目录的权限:
/ghidra/home/ghidra当容器没有通过 docker run 命令传入任何参数时,
所执行 MODE 对应的命令行界面(CLI)将显示其使用说明。
如果卷不能被组 id 1001 中的用户访问,容器中的卷可能会遇到权限问题。
容器的默认 uid 和 guid 是 1001:1001。映射到容器的卷应可由该 uid/guid 访问。
将主机上的用户添加到主机上的组 1001 有助于管理将在容器中使用的卷。
在 Linux 上可以通过执行 sudo usermod -aG 1001 <user> 轻松完成。
docker run \
--env MODE=headless \
--rm \
--volume /path/to/myproject:/home/ghidra/myproject \
--volume /path/to/mybinary:/home/ghidra/mybinary \
ghidra/ghidra:<version> \
/home/ghidra/myproject programFolder -import /home/ghidra/mybinary
逐行分解:
docker run 将启动一个使用镜像 ghidra/ghidra<:<version> 的 Docker 容器--env MODE=headless 将容器内的环境变量 MODE 配置为值 headless--rm 在命令完成后删除容器--volume /path/to/myproject:/home/ghidra/myproject 将主机上的本地卷 /path/to/myproject 挂载到容器内的 /home/ghidra/myproject--volume /path/to/mybinary:/home/ghidra/mybinary 将主机上的本地卷 /path/to/mybinary 挂载到容器内的 /home/ghidra/mybinaryghidra/ghidra:<version> 是 Docker 镜像的完整引用,其中 是镜像的组和名称, 是标签。不传递任何参数将显示无头分析器的使用说明。
主机上的 /path/to/myproject 必须可由 guid 1001 以 rwx 权限访问。
不建议在 Docker 容器中运行 Ghidra 的图形用户界面(GUI)。 GUI 不是 Docker 化应用程序的典型使用场景。
docker run \
--env MODE=gui \
-it \
--rm \
--net host \
--env DISPLAY \
--volume "$HOME/.Xauthority:/home/ghidra/.Xauthority" \
ghidra/ghidra:<version>
在此模式下,容器依赖 X11 转发来显示 GUI。X11 的配置可能有所不同,但在此示例中, 主机的 Xauthority 文件被挂载到容器中,容器被配置为使用主机的网络,并且 DISPLAY 环境变量被传递到容器中。这使得 GUI 能够转发回主机显示。包含二进制文件的卷以及 Ghidra 项目的卷仍然需要挂载到容器中。
主机的 .Xauthority 文件必须具有合适的权限——分配给组 :1001,并具有 rw 组权限。
docker run \
--env MODE=ghidra-server \
--rm \
-it \
--volume /path/to/my/repositories:/ghidra/repositories \
--volume /path/to/my/configs/server.conf:/ghidra/server/server.conf \
-p 13100:13100 \
-p 13101:13101 \
-p 13102:13102 \
ghidra/ghidra:<version>
需要将卷挂载到服务器容器中以保存存储库、用户以及配置服务器。
要使用 svrAdmin,请 exec 进入正在运行的 Ghidra 服务器容器(docker exec -it <container-id> bash)以获得容器内的 bash shell。
在 exec 进入容器后,Ghidra 服务器的管理和操作与容器化环境之外相同。
要停止容器,执行命令 docker stop <container-id>。
注意:从主机映射到 Docker 容器的端口必须匹配。你可以在 server.conf 文件中使用 -p<port> 选项更改默认的基础服务器端口(例如 13100)。
docker run \
--env MODE=bsim-server \
--rm \
-it \
--volume /path/to/my/datadir:/ghidra/bsim_datadir \
-p 5432:5432 \
ghidra/ghidra:<version> \
/ghidra/bsim_datadir
/ghidra/bsim_datadir 是容器中用于存储 bsim 数据的目录。也可以使用容器中的其他目录,
但请确保主机上的文件夹具有合适的权限,并分配给组 :1001。
此示例仅启动了一个 bsim 服务器。配置 bsim 服务器并向其中填充数据
可以在启动后通过容器内执行(与 Ghidra 服务器管理类似)来完成。
管理员必须 exec 进入正在运行的 bsim 服务器容器(docker exec -it <container-id> bash),
在 exec 进入容器后,Bsim 服务器的管理和操作与容器化环境之外相同。
要停止容器,执行命令 docker stop <container-id>。
docker run \
--env MODE=bsim \
--rm \
-it \
ghidra/ghidra:<version> \
generatesigs ghidra://ghidrasvr/demo /home/ghidra \
--bsim postgresql://bsimsvr/demo \
--commit --overwrite \
--user ghidra
在此示例中,bsim CLI 用于连接托管在 ghidrasvr 上的 Ghidra 服务器,
为那个 Ghidra 服务器中的 demo 存储库生成签名并将其保存到 /home/ghidra,
然后将签名提交到托管在 bsimsvr 上的 BSIM 服务器中的 demo 数据库。
不建议在 Docker 容器中运行 Ghidra 的图形用户界面(GUI)。 GUI 不是 Docker 化应用程序的典型使用场景。
docker run \
--env MODE=pyghidra \
-it \
--rm \
--net host \
--env DISPLAY \
--volume="$HOME/.Xauthority:/home/ghidra/.Xauthority:rw" \
ghidra/ghidra:<version> -c
在此模式下,容器依赖 X11 转发来显示 GUI。X11 的配置可能有所不同,但在此示例中, 主机的 Xauthority 文件被挂载到容器中,容器被配置为使用主机的网络,并且 DISPLAY 环境变量被传递到容器中。这使得 GUI 能够转发回主机显示。包含二进制文件的卷以及 Ghidra 项目的卷仍然需要挂载到容器中。
主机的 .Xauthority 文件必须具有合适的权限——由 :1001 拥有,并具有 rw 组权限。
docker run \
--env MODE=pyghidra \
--rm \
--volume /path/to/myproject:/myproject \
--volume /path/to/mybinary:/mybinary \
ghidra/ghidra:<version> -H \
/myproject programFolder -import /mybinary
不向 pyghidra 无头分析器传递任何参数将显示帮助菜单,就像无头分析器一样。
这个用例与无头模式的示例非常相似,但额外的好处是能够使用 Python3 编写 Ghidra 脚本。
同样,在此示例中,/path/to/myproject 和 /path/to/mybinary 需要具有合适的权限和组分配,以避免出现权限问题。
ghidra/ghidra<version>/home/ghidra/myproject programFolder -import /home/ghidra/mybinary 是传递给 Ghidra 无头分析器命令行的参数