对抗前端反调试:编译免疫无限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.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_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 chrome
3、生成安装包
执行下面命令将在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!









评论7次
学xi了,感谢大佬分享
最新版本火狐F12,取消勾选在调试语句上暂停
牛皮 ,这不省钱了,是怎么定位到这些代码位置的?
大佬,有定制浏览器开发的教程嘛
学xi了,感谢分享
学xi、收藏了,感谢分享!
有技术的