ubuntu chromium+v8调试环境搭建
fa1lr4in Lv2

ubuntu chromium+v8调试环境搭建

Ubuntu环境配置

1、允许root登录并进行ubuntu初始修改

1
2
3
4
5
6
7
sudo passwd root
cp /home/ubuntu/.bashrc /root/
apt update && apt install ssh vim python git libproxy-tools re2c g++
vi /etc/ssh/sshd_config # 修改 PermitRootLogin yes
vi /etc/pam.d/gdm-autologin # 注释auth required pam_succeed_if.so user != root quiet_success
vi /etc/pam.d/gdm-password # 注释auth required pam_succeed_if.so user != root quiet_success
vi /root/.profile # 改成 tty -s && mesg n || true

2、配置linux全局代理,使终端可以访问墙外的v8编译相关资源

比如qv2ray,相关链接:https://www.zsxcool.com/7137.html

再比如Trojan-QT5,相关链接:https://github.com/Shadowsocks-Wiki/shadowsocks/blob/master/zh_CN/trojan/ubuntu-trojan-qt5-setup-guide.md

2、一般采用虚拟机搭建v8环境,方便环境的维护,推荐虚拟机采用vmware NAT那块网卡,这时我们在本地做全局代理时(比如Netch),虚拟机内部也可以有比较顺畅的网络环境。

v8环境配置

下载depot_tools,v8并进行编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mkdir /root/tools && cd /root/tools
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git /root/tools/depot_tools
echo 'export PATH=$PATH:"/root/tools/depot_tools"' >> /etc/profile
echo 'export PATH=$PATH:"/root/tools/depot_tools"' >> ~/.bashrc
source /etc/profile
source ~/.bashrc或者source ~/.zshrc
# Todo 忘记是否需要自行安装Ninja了。。。
mkdir /root/v8 && cd /root/v8
fetch v8 # 这个可能会花很长时间,取决于个人的网络环境,如果中断了则 gclient sync同步
cd v8
# git reset --hard [commit hash] # 切换版本,后面跟上commit的hash值,可选
# gclient sync
sudo ./build/install-build-deps.sh --no-chromeos-fonts # 在linux系统中这个命令是需要的
gclient sync # 同步更新
# 编译可执行文件
tools/dev/gm.py x64.debug # 编译 debug 版本 编译的过程可能会花上比较长的时间
tools/dev/gm.py x64.release # 编译 release 版本
# 或通过gn构建,方便我们自定义参数,比如下面加入了asan检测和afl支持,传统的afl fuzz整个程序(d8)很难会有产出,如果非要用afl可以自行编写harness,类似libfuzzer
gn gen out/use_afl --args="is_debug=true is_component_build=true is_asan = true use_afl = true optimize_for_fuzzing = true"
ninja -C out/use_afl d8

过程中遇到的问题

1、running depot tools as root is sad

如果root用户使用该工具会弹出该警告,无视即可

2、遇到 NOTICE: You have PROXY values set in your environment, but gsutilin depot_tools does not (yet) obey them.
Also, –no_auth prevents the normal BOTO_CONFIG environmentvariable from being used.
To use a proxy in this situation, please supply those settingsin a .boto file pointed to by the NO_AUTH_BOTO_CONFIG environmentvariable.

缺少代理的环境变量,基本在你自己在虚拟机内布置代理环境才会出现这个问题,采用NAT网卡一般不会出现这个问题,踩太多坑了。

1
2
3
4
5
6
7
8
9
10
11
12
mkdir /root/tools/.boto
vi .boto
# [Boto]
# debug = 0
# num_retries = 10
#
# proxy = 127.0.0.1
# proxy_port = 58591
echo 'export NO_AUTH_BOTO_CONFIG="/root/tools/.boto"' >> /etc/profile
echo 'export NO_AUTH_BOTO_CONFIG="/root/tools/.boto"' >> ~/.bashrc
source /etc/profile
source ~/.bashrc或者source ~/.zshrc

3、Failed to download https://commondatastorage.googleapis.com/chrome-linux-sysroot/toolchain/43a87bbebccad99325fdcf34166295b121ee15c7/debian_sid_amd64_sysroot.tar.xz
Error: Command ‘vpython build/linux/sysroot_scripts/install-sysroot.py –arch=x64’ returned non-zero exit status 1 in /root/v8/v8

出现这种问题是因为网络原因,可以重新进行gclient sync或更换代理服务器

4、Error: client not configured; see ‘gclient config’

1
2
3
# gclient config https://chromium.googlesource.com/chromium/src.git
gclient config https://chromium.googlesource.com/v8/v8.git
gclient runhooks

参考链接:https://stackoverflow.com/questions/8684282/gclient-runhooks-fails

chromium环境配置

有了上面v8搭建的过程,这里的过程看起来就更容易理解一些,实际上二者的搭建过程没有太大的差距,因为google官方将搭建过程都封装到了depot_tools中了。二者的体量差别还是比较大的,截至2022.1,chromium最新大概5w多个文件,而v8在2k文件左右

1
2
3
4
5
6
7
8
9
10
11
mkdir ~/chromium && cd ~/chromium
fetch --nohooks chromium
cd src
./build/install-build-deps.sh
gclient runhooks
# git reset --hard [commit hash] # 切换版本,后面跟上commit的hash值,可选
# gclient sync
# 配置编译选项,可以使用 use_afl = true 参数开启afl fuzz功能,但目前不知道如何结合afl对chromium进行fuzz,而且在不编写harness的情况下效率还是比较低的。
gn gen out/asan_debug --args="is_debug=true is_component_build=true is_asan = true"
# 开始编译,可能需要数个小时
autoninja -C out/asan_debug chrome

启动chromium时,asan提示odr-violation报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Kiprey @ Kipwn in /usr/class/chromium [14:19:24] C:1
$ ./src/out/asan_debug/chrome
=================================================================
==189815==ERROR: AddressSanitizer: odr-violation (0x7f44b9504700):
[1] size=40 'vtable for media::VaapiDmaBufVideoFrameMapper' ../../media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.cc
[2] size=40 'vtable for media::VaapiDmaBufVideoFrameMapper' ../../media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.cc
These globals were registered at these points:
[1]:
#0 0x55f8a95f810d in __asan_register_globals /b/s/w/ir/cache/builder/src/third_party/llvm/compiler-rt/lib/asan/asan_globals.cpp:360:3
#1 0x7f4471d6895b in asan.module_ctor (/usr/class/chromium/src/out/asan_debug/libservice.so+0x2b5595b)

[2]:
#0 0x55f8a95f810d in __asan_register_globals /b/s/w/ir/cache/builder/src/third_party/llvm/compiler-rt/lib/asan/asan_globals.cpp:360:3
#1 0x7f44b87abe7b in asan.module_ctor (/usr/class/chromium/src/out/asan_debug/libmedia_gpu.so+0x335e7b)

==189815==HINT: if you don't care about these errors you may set ASAN_OPTIONS=detect_odr_violation=0
SUMMARY: AddressSanitizer: odr-violation: global 'vtable for media::VaapiDmaBufVideoFrameMapper' at ../../media/gpu/vaapi/vaapi_dmabuf_video_frame_mapper.cc
==189815==ABORTING

odr-violation这类错误我们忽略即可,因此我们需要设置一下环境变量ASAN_OPTIONS,最好编辑配置文件将其永久配置

1
export ASAN_OPTIONS=detect_odr_violation=0

之后即可正常执行chrome。

参考链接

  1. https://kiprey.github.io/2020/11/fetch-chromium/
  2. https://bbs.pediy.com/thread-252812-1.htm
  3. browser-pwn-基础知识.pdf

其他

1、vscode关闭代码错误提示

vscode内Ctrl + Shift + P搜索:errorSquiggles,禁用错误波形曲线

2、配置gdb插件

下面可以挑选一个gdb调试工具,统一将gdb脚本的路径放入/root/.gdbinit中。

gef

1
2
3
git clone https://github.com/hugsy/gef
# 将gef目录下的gef.py添加进/root/.gdbinit中,内容如下
# source /root/tools/gef/gef.py

pwndbg

1
2
3
4
5
git clone https://github.com/pwndbg/pwndbg
cd pwndbg
sudo #./setup.sh
# 如果显示异常,检查.gdbinit文件
# source /root/tools/pwndbg/gdbinit.py

peda

1
2
git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit

还需要将v8的gdb插件放入gdbinit中,路径如下(路径取决于自己本机环境)

1
/root/v8/v8/tools/gdbinit

Windows chromium+v8调试环境搭建

有了上面ubuntu安装的经验,再windows上搭建调试环境会轻松不少。

windows里面需要额外安装SDK以及vs,毕竟需要vs进行调试。

v8环境配置

1、下载安装vs2019或者vs2022,并配置python环境

2、下载SDK并安装

3、下载安装depot_tools,并配置depot_tools安装目录的环境变量并确保其在python的环境变量前

1
git clone https://chromium.googlesource.com/chromium/tools/depot_tools

4、配置环境变量

三个环境变量,编译chromium也需要他们,depot_tools的环境变量要在python的上面(vs的路径按照自己电脑的路径)

DEPOT_TOOLS_WIN_TOOLCHAIN vs2022_install PATH
0 C:\Program Files\Microsoft Visual Studio\2022\Community C:\software\depot_tools

5、运行gclient,初始化工具

1
gclient

6、fetch源码并更新,其他的步骤就和ubuntu的一样了

1
2
3
4
5
mkdir v8 && cd v8
fetch v8
gclient sync
cd v8
python tools\dev\gm.py x64.debug

如果不使用gm.py脚本,也可以使用gn工具进行构建

1
2
cd E:\v8\v8
gn gen --ide=vs out\default --args="is_component_build = true is_debug = true v8_optimized_debug = false"

上面的命令会生成工作目录,路径为E:\v8\v8\out\Default,里面有一个all.sln的文件,使用vs打开

之后在160个项目中找到gn_all,编译之,最后即可调试E:\v8\v8\out\Default\d8.exe。

chromium环境配置

配置vs和SDK还有环境变量等过程和上面配置v8时一致,只是在最后fetch和编译时有些许差别

1
2
3
4
5
mkdir chromium && cd chromium
fetch chromium
cd src
gn gen out/debug_comp --args="is_debug=true is_component_build=true"
autoninja -C out/debug_comp chrome

或者使用vs进行编译调试

1
gn gen --ide=vs out\debug_by_vs --args="is_component_build = true is_debug = true v8_optimized_debug = false"

最后找到gn_all,编译之,最终得到可执行文件。

参考文章:

https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/windows_build_instructions.md#Setting-up-Windows

https://blog.csdn.net/HermitSun/article/details/106091018

https://www.anquanke.com/post/id/253048

 Comments