0x01. Why
道路千万条,编译第一条!
在 Windows 上编译开源软件,总是有各种各样的坑等着去填。
0x02. Steps
2.1 工具
- Git
- Mozilla-Build
- CMake
- Visual Studio 2017
2.2 步骤
使用 Git 拉取最新的源代码,如果对历史 commit 不感兴趣,可以选择 --depth 1
来加快拉取速度:
git clone --depth 1 https://github.com/mozilla/gecko-dev.git |
安装 Mozilla-Build ,这会配置一个基本的 MinGW32 环境;安装完毕之后,打开 Mozilla-Build :
C:\mozilla-build\start-shell.bat |
切换到 SpiderMonkey 所在的路径,并执行如下命令(参考 Introduction to SpiderMonkey Exploitation ):
autoconf-2.13 |
提示找不到 C 编译器:
checking for the target C compiler... not found |
此时,不要急着去下载安装 LLVM ,因为官方预编译版本都是没有 llvm-config
组件的,照样无法编译:
checking for llvm-config... c:/Users/User\.mozbuild\clang\bin\llvm-config |
没办法,只能自己编译一个 LLVM (参考 Building and Running Clang ,记得先安装 CMake ):
git clone --depth 1 https://github.com/llvm/llvm-project.git |
然后用 Visual Studio 2017 打开 LLVM.sln
编译 Release 版本。
Build the “clang” project for just the compiler driver and front end, or the “ALL_BUILD” project to build everything, including tools.
现在,可以回到编译 SpiderMonkey 的步骤了,开始下一步之前,先把 LLVM 的路径添加到 PATH
环境变量:
export LLVMDIR=/D/llvm-project/build/Release |
继续配置编译 SpiderMonkey 相关的参数:
../configure --host=x86_64-pc-mingw32 --target=x86_64-pc-mingw32 --enable-debug |
提示找不到链接器:
checking for mt... C:/PROGRA~2/WI3CF2~1/10/bin/100177~1.0/x64/mt.exe |
通过设置 LINKER
环境变量解决:
export LINKER="/C/Program Files (x86)/Microsoft Visual Studio/2017/Professional/VC/Tools/MSVC/14.15.26726/bin/Hostx64/x64/link.exe" |
继续运行 configure
,会提示找不到 host_linker
:
checking for linker... c:/PROGRA~2/MICROS~3/2017/PROFES~1/VC/Tools/MSVC/1415~1.267/bin/Hostx64/x64/link.exe |
通过设置 HOST_LINKER
环境变量解决:
export HOST_LINKER=$LINKER |
一切正常,终于可以开始编译了(为了加快编译速度,可以指定 -j
参数):
mozmake -j4 |
0x03. JavaScript Shell
等 SpiderMonkey 编译完之后,在路径 build.asserts\dist\bin
下可以找到相关的二进制文件,其中 JavaScript Shell 为 js.exe
。
如果不想折腾编译,也可以直接从 Firefox Nightly Builds 直接下载已经编译好的 JavaScript Shell (这是 Release 版本,功能比 Debug 版本少一些)。
3.1 SpiderMonkey
js.exe
支持参数启动,具体可以参考 js.exe --help
。
JavaScript Shell 提供了许多的内置函数可供调用,具体可以参考 help()
的执行结果( Debug 版本比 Release 提供了更多的内置函数);几个比较常用的函数:
- objectAddress ,打印 JavaScript 对象的内存地址
- dumpObject ,打印 JavaScript 对象的结构
- dis ,打印函数的字节码
- quit ,退出 JavaScript Shell
3.2 IonMonkey
SpiderMonkey 的 JavaScript Shell 同时支持设置其 JIT 编译引擎 IonMonkey 的相关参数,可以将环境变量 IONFLAGS
设置为 help
来查看详细的帮助信息:
set IONFLAGS=help |