当前位置: 首页 > 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 可执行文件

相关文章:

  • 如何在 Vue 项目中使用v - show和v - if指令,它们的原理、区别和适用场景是什么
  • jangow-01-1.0.1靶机攻略
  • QuecPython 外设接口之GPIO应用指南
  • java中的常量可以不用在声明的时候初始化,c中的必须在声明的时候初始化,可不可以这么理解?
  • HDMI(High-Definition Multimedia Interface)详解
  • 三分钟读懂微服务
  • UE4学习笔记 FPS游戏制作16 重构FppShooter和RoboteShooter 提出父类Shooter
  • HTML应用指南:利用POST请求获取城市肯德基门店位置信息
  • 【八股文】http怎么建立连接的
  • 破解云端依赖!如何通过Flowise搭建私有化的端到端AI开发环境
  • [250324] Kafka 4.0.0 版本发布:告别 ZooKeeper,拥抱 KRaft!| Wine 10.4 发布!
  • 上海瀛旻信息科技有限公司
  • 总结 Spring 中存储 Bean 的相关注解以及这些注解的用法.
  • python+requests接口自动化测试
  • git使用钩子文件出现错误
  • 《深入剖析 SmartInt 包装类:实现智能整数操作》
  • Netty源码—5.Pipeline和Handler二
  • 31天Python入门——第9天:再学函数
  • 推荐1款简洁、小巧的实用收音机软件,支持手机和电脑
  • 量子计算与人工智能的融合:下一代算力革命
  • 事关广大农民利益,农村集体经济组织法5月1日起施行
  • 何立峰出席驻沪中央金融机构支持上海建设国际金融中心座谈会并讲话
  • 王沪宁主持召开全国政协主席会议
  • 李在明涉嫌违反《公职选举法》案将于5月1日宣判
  • 比熬夜更伤肝的事,你可能每天都在做
  • 企业取消“大小周”引热议,半月谈:不能将显性加班变为隐性加班