当前位置: 首页 > news >正文

V8引擎源码编译踩坑实录

背景

为了解决 view8 代码没有指定版本的 v8 引擎问题GitHub - suleram/View8: View8 - Decompiles serialized V8 objects back into high-level readable code.

但是打出来了exe文件也没啥用,不清楚这个view8是解决啥逆向用的,如果想逆向electron的jsc,这个玩不了,趁早放弃,原因是 electron 打包出来的jsc二进制里面不但有v8的内容,还有node.js的内置函数,例如require,fs,electron本身,所以electron的 jsc 二进制只有electron能处理,但是将electron.exe 扔进去,没有反应,所以这个代码基本没用,有可能也是为了coco creator反编译准备的吧,这里不再深究。

V8 定义

d8.exe 是 V8 引擎编译生成的一个可执行文件,作为调试壳(debug shell)存在,其作用总结如下:

  • 运行 JavaScript:提供一个独立的 JavaScript 执行环境,可直接运行代码或脚本文件。

  • 调试工具:用于分析 V8 的字节码、优化过程、内存布局等,帮助开发者调试和研究。

  • 研究 V8:适合探索 V8 的编译、执行和垃圾回收机制。

  • 轻量实验:无标准库和 DOM,专注于 V8 核心功能,适合教育和底层实验。

注意

用 cygwin64 是不行的,B 站有个 2020 年教程是用 window7+cygwin64 这种方式,但是现在版本不知道,运行 gclient sync 报错

配置depot_tools

  1. 从 git 上获取 depot_tools 谷歌工具包

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
  1. 将工具包路径配置到高级环境配置——系统配置——path 中去

获取 V8 源码

fetch v8

更新 V8 源码

  1. 切换到指定的 tag 版本

# 10.8.168.25 这个版本是 chatknow 的 electron 用到的V8版本,也即浏览器版本108.168这样
git checkout 10.8.168.25# 切换后务必要更新
gclient sync

安装 vs2022 版本

  1. 如果是第一次安装,则全部默认路径安装在 C 盘,会省很大力气

  2. 其中 Windows SDK 这个 VS2022 会在 C 盘不足的情况下,找个其他剩余容量比较大的盘装进去,此时就不好找了,利用 everything 快速搜索 Windows Kits,可通过更改注册表强行将 Windows SDK 给改回到 v8 默认的 C 盘默认的路径下去

    1. 参考 更改Windows Kits的安装目录-CSDN博客

build 脚本

  1. 之前谷歌浏览器编译,是用 gn ,ninja 两个可执行文件,但是 V8 代码你直接执行 gn,ninja 都报一个 py 的问题,B 站作者给了一种方式,是到 v8\tools\dev找到 gm.py 文件,在 main 里加一行运行,这样好像就不会报 gn.exe,ninja.exe 找不到的问题,也不用拷贝过来,拷贝过去

  1. vs2022 路径的问题,可以参考这里的代码 v8/build/vs_toolchain.py其实到这里都还没正式运行 C 编译呢,还都是 python 的范畴

    1. 注意 Python 版本问题,这里使用的是 python10,可以用 conda 来调整 python 版本,在 pycharm 中进行选择性运行

    2. 网上说的那些 WINDOWSDKDIR,以及vs2022_install,DEPOT_TOOLS_WIN_TOOLCHAIN,都可以在 pycharm 执行命令时配置,这样不污染全局

    3. 为什么会有这几个变量??,你看看上面的 vs_toolchain.py 源码就知道了

vs_toolchain.py 源码

WINDOWSSDKDIR 默认会去 C 盘找,如果你不设置的话,配置后就没有问题

VS2022 的库包依赖截图

以上环境搞完后,直接运行 gm.py 脚本,即可生成一个 d8.exe 可执行文件


http://www.mrgr.cn/news/95736.html

相关文章:

  • 测试:测试中的概念
  • 【LeetCode 题解】算法:3. 无重复字符最长子串问题
  • Flink 自定义数据源:从理论到实践的全方位指南
  • Android RemoteViews:跨进程 UI 更新的奥秘与实践
  • 【性能优化点滴】odygrd/quill 中一个简单的标记位作用--降低 IO 次数
  • python打包辅助工具
  • 数据库基础知识点(系列二)
  • Docker-Compose部署 EasySearch 异常问题排查
  • WSL Linux 子系统download
  • 穿越之程序员周树人的狂人日记Part2__重构人间Beta版
  • MySQL里的锁有哪些
  • OpenGL 着色器
  • 数据结构八股
  • 深入解析 Java GC 调优:减少 Minor GC 频率,优化系统吞吐
  • 信号相关的程序
  • 安装docker版jira8.0.2
  • 作业12 (2023-05-15 指针概念)
  • 新手使用qt6 编译mysql驱动的坑
  • 解锁 AWX+Ansible 自动化运维新体验:快速部署实战
  • 内核编程十:进程的虚拟地址空间