对抗前端反调试:编译免疫无限debugger的Chromium浏览器

2025-10-24 19:55:16 7 206

前言

最近在测试某系统的时候,发现瑞数好像最近又升级了,以往绕过无限 debugger 的一些方法都失效了。经大佬指点,发现通过魔改 Chromium 内核,可以从浏览器层面彻底解决 debugger 拦截问题。不过,大佬们放出的魔改版本改动太多了、价格也不便宜。而我的需求很简单,只需解决掉无限弹出的debugger即可。

根据大佬分享的文章,我决定走一遍流程。核心原理并不复杂:通过替换源码中的 debugger 关键字,并调整相关执行逻辑,使浏览器在运行时完全忽略 debugger ,从而实现绕过无限debugger 的目的。

安装depot_tools

depot_tools 是用于处理 Chromium 开发的工具集合。

1、使用git来拉取(科学上网)

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

2、设置环境变量

在系统环境变量PATH中加入depot_tools路径,我这里是如下路径

D:\security\depot_tools\depot_tools

在系统环境变量PATH中加入vs2022_install变量,指向Visual Studio 2022安装地址,如下:

C:\Program Files\Microsoft Visual Studio\2022\Professional

3、首次运行

命令行执行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 true

2、拉取代码

新建一个目录存放chromium代码(路径上不能有空格),我这里为了方便就和depot_tools放一起了

mkdir chromium; cd chromium

使用 depot_toolsfetch工具下载 Chromium 源码,并且跳过Git历史记录(科学上网)

fetch  --no-history chromium

使用 depot_toolsgclient工具同步所有依赖仓库(科学上网)

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 chrome

3、生成安装包

执行下面命令将在out/Default目录下会生成一个安装包mini_installer.exemini_installer.exe采用静默安装,安装路径默认为:C:\Users%USERNAME%\AppData\Local\Chromium

同时,out/Default目录下chrome.package.7z是绿色免安装包,可以解压即用

ninja  -C  out/Default  mini_installer

效果演示

至此,再也没有烦人的无限debugger了

下断点调试也不在话下。

项目和代码放在我的Git上了,好用记得给个Star!

https://github.com/xk4ng/AntiDebugger-Chrome

关于作者

Dghpi97篇文章122篇回复

评论7次

要评论?请先  登录  或  注册