对抗前端反调试:编译免疫无限debugger的Chromium浏览器
前言
最近在测试某系统的时候,发现瑞数好像最近又升级了,以往绕过无限 debugger 的一些方法都失效了。经大佬指点,发现通过魔改 Chromium 内核,可以从浏览器层面彻底解决 debugger 拦截问题。不过,大佬们放出的魔改版本改动太多了、价格也不便宜。而我的需求很简单,只需解决掉无限弹出的debugger即可。
根据大佬分享的文章,我决定走一遍流程。核心原理并不复杂:通过替换源码中的 debugger 关键字,并调整相关执行逻辑,使浏览器在运行时完全忽略 debugger ,从而实现绕过无限debugger 的目的。
安装depot_tools
depot_tools 是用于处理 Chromium 开发的工具集合。
1、使用git来拉取(科学上网)
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git2、设置环境变量
在系统环境变量PATH中加入depot_tools路径,我这里是如下路径
D:\security\depot_tools\depot_tools在系统环境变量PATH中加入vs2022_install变量,指向Visual Studio 2022安装地址,如下:
C:\Program Files\Microsoft Visual Studio\2022\Professional3、首次运行
命令行执行gclient,如下所示为安装成功(首次执行会更新)
gclient安装Windows SDK
从下面地址下载安装即可
https://download.microsoft.com/download/3a857edb-459d-4fbb-88dc-5153f6183142/KIT_BUNDLE_WINDOWSSDK_MEDIACREATION/winsdksetup.exe设置系统环境变量
WINDOWSSDKDIR=D:\Windows Kits\10拉取chromium代码
1、配置Git
git config --global user.name "xk4ng"
git config --global user.email "[email protected]"
git config --global core.autocrlf false
git config --global core.filemode false
git config --global core.preloadindex true
git config --global core.fscache true
git config --global branch.autosetuprebase always
git config --global core.longpaths true2、拉取代码
新建一个目录存放chromium代码(路径上不能有空格),我这里为了方便就和depot_tools放一起了
mkdir chromium; cd chromium使用 depot_tools的 fetch工具下载 Chromium 源码,并且跳过Git历史记录(科学上网)
fetch  --no-history chromium使用 depot_tools的 gclient工具同步所有依赖仓库(科学上网)
gclient sync修改chromium代码
打开chromium源码文件:\v8\src\parsing\keywords-gen.h找到{"debugger", Token::kDebugger}并替换
//{"debugger", Token::kDebugger},
{"debugger1", Token::kDebugger},找到{"", Token::kIdentifier}};并替换
//{"", Token::kIdentifier}};
{"debugger", Token::kFalseLiteral}};找到
static const unsigned char kPerfectKeywordLengthTable[128] = {
    0,  0, 0, 3, 3, 5, 6, 3, 7, 4, 6, 6, 8, 3, 0, 5, 3, 4, 7, 5, 9, 4,
    5,  3, 4, 6, 2, 7, 4, 6, 7, 8, 4, 5, 5, 2, 3, 8, 6, 7, 6, 5, 9, 10,
    10, 5, 4, 4, 0, 2, 0, 5, 0, 6, 2, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0,
    0,  0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};替换为
static const unsigned char kPerfectKeywordLengthTable[128] = {
    0,  0, 0, 3, 3, 5, 6, 3, 7, 4, 6, 6, 8, 3, 0, 5, 3, 4, 7, 5, 9, 4,
    5,  3, 4, 6, 2, 7, 4, 6, 7, 8, 4, 5, 5, 2, 3, 8, 6, 7, 6, 5, 9, 10,
    10, 5, 4, 4, 0, 2, 0, 5, 0, 6, 2, 0, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0,
    0,  0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8};找到如下:
inline Token::Value PerfectKeywordHash::GetToken(const char* str, int len) {
  if (base::IsInRange(len, MIN_WORD_LENGTH, MAX_WORD_LENGTH)) {
    unsigned int key = Hash(str, len) & 0x7f修改为:
inline Token::Value PerfectKeywordHash::GetToken(const char* str, int len) {
  if (base::IsInRange(len, MIN_WORD_LENGTH, MAX_WORD_LENGTH)) {
    unsigned int key = Hash(str, len) & 0x7f;
    //追加
    if (len >= 8 && strncmp(str, "debuggel", 8) == 0) {
      key = 127; // 127代指刚刚改掉的最后一行
    }编译成功后,就可以使用debuggel代替原有的debugger功能了。
构建和编译
1、执行如下命令为 chromium项目生成一个构建配置
gn gen out\Default --args="is_component_build = false is_debug = false enable_nacl = false  blink_symbol_level = 0 v8_symbol_level = 0 symbol_level = 0"由于参数中包含了 enable_nacl = false,当前 Chromium 版本已经移除了Native Client支持,所以这个参数不再被任何 .gn 文件识别 ,该告警提示可以直接忽略。
2、编译
执行下面命令将在out/Default目录下生成chrome.exe,依赖的所有模块都会打包进这个exe
ninja  -C  out/Default chrome3、生成安装包
执行下面命令将在out/Default目录下会生成一个安装包mini_installer.exe,mini_installer.exe采用静默安装,安装路径默认为:C:\Users%USERNAME%\AppData\Local\Chromium
同时,out/Default目录下chrome.package.7z是绿色免安装包,可以解压即用
ninja  -C  out/Default  mini_installer效果演示
至此,再也没有烦人的无限debugger了
下断点调试也不在话下。
项目和代码放在我的Git上了,好用记得给个Star!













评论19次
最新版本火狐F12,取消勾选在调试语句上暂停
啥意思?老哥
你这绕过独一档啊
不错, 这个改浏览器内核的还是要有一点技术含量, 这个环境的搭建也比较麻烦, 能否提供类似的docker的编译环境就更好了。 不用在环境上花费时间。
代码在我的git上,另外编译好的也在git上提供下载
看到了, 不错, 不过要是能编译好一个macos下的现成的包就更好了。
不错, 这个改浏览器内核的还是要有一点技术含量, 这个环境的搭建也比较麻烦, 能否提供类似的docker的编译环境就更好了。 不用在环境上花费时间。
代码在我的git上,另外编译好的也在git上提供下载
太强了,一直想手动编译一个,参考下,少踩点坑
很多时候都静不下心来研究,原因就是因为构建的环境太过复杂而且研究耗时,还是得有颗破冰的心
不错, 这个改浏览器内核的还是要有一点技术含量, 这个环境的搭建也比较麻烦, 能否提供类似的docker的编译环境就更好了。 不用在环境上花费时间。
原来debugger还能这样绕过
最新版本火狐F12,取消勾选在调试语句上暂停
大佬说的对,这样也可以
老哥一看就是天天盯着gw的首发把
这个kPerfectKeywordLengthTable替换是干啥的
感谢分享,学xi和复现一波,之前也遇到这个问题了。
学xi了,感谢大佬分享
最新版本火狐F12,取消勾选在调试语句上暂停
牛皮 ,这不省钱了,是怎么定位到这些代码位置的?
大佬,有定制浏览器开发的教程嘛
学xi了,感谢分享
学xi、收藏了,感谢分享!
有技术的