前端安全:反调试机制/防逆向/代码混淆

前端小王hs:
清华大学出版社《后台管理实践——Vue.js+Express.js》作者 
网络工程师 前端工程师 项目经理 阿里云社区博客专家 

email: 337674757@qq.com
vx: 文章最下方有vx链接
资料/交流群: vx备注前端安全


研究这个主要是某次在某AI工具中打开 开发者工具的时候,页面进入了 无限调试暂停模式,就觉得也挺好玩的

前端反调试机制/防逆向/代码混淆主要用于防止用户查看源码/网络请求,在一定程度上能够提高代码的安全性

反调试机制(无限调试暂停)

当页面进入无限调试暂停时,会在页面顶部出现“已在调试程序中暂停”的效果,如下图所示:
无限调试
本质上是在代码中调用了debugger,当代码执行到debugger时会触发调试器暂停执行程序,通常用于打断点检查程序问题时使用

如果是正常的情况下,点击蓝色的继续执行(Resume Script Execution),那么会跳出调试,直到遇到下一个断点debugger语句继续暂停
在这里插入图片描述
而无限调试,就是点击继续执行,还是会处在暂停的状态,其实原理非常简单,就是使用了setInterval,以及判断用户是否打开了开发者工具

示例代码如下:

    setInterval(function() {
        if (window.console && console.table) {
			console.log(111)
            debugger;
        }
    }, 1000);
  1. window.console判断用户是否打开了控制台
  2. console.table说明控制台已经被初始化了

当这两个情况同时出现时,说明用户打开了开发者工具,那么触发debugger
调试暂停

直接禁止F12默认行为

在打开控制台之前,可以直接将用户按F12即打开控制台的行为阻止,换句话说,就是按F12,不弹出开发者工具,代码如下:

<div class="original-content">
    <h1>欢迎访问我的网页</h1>
    <p>这是一个普通的网页内容。</p>
    <p>按 F12 查看效果。</p>
</div>

<!-- 屏蔽提示框 -->
<div id="blockOverlay" class="blocked-message" style="display:none;">
    禁止查看源码!
</div>
    // 监听按键事件
    document.addEventListener('keydown', function(event) {
        // 判断是否按下了 F12 键
        if (event.key === 'F12' || event.keyCode === 123) {
            // 阻止默认行为(如打开开发者工具)
            event.preventDefault();
            event.stopPropagation();

            // 显示屏蔽层
            document.getElementById('blockOverlay').style.display = 'flex';

            // 清空原有内容
            document.querySelector('.original-content').style.display = 'none';

            // 强制调试器中断
            debugger;

            // 禁用右键菜单
            window.oncontextmenu = function() {
                return false;
            };
        }
    });

在上面的代码中,默认情况下页面如下图所示:
默认

当用户按F12时会将页面原本的内容置为none,切换为**禁止查看源码!**的内容,实现效果如下图所示:

禁止查看源码
当然,用户还可以点击浏览器右上角的设置,找到“开发者工具”,那么此时同样会进入无限调试,如下图所示:
打开开发者工具
而源码也是清晰可见的,并没有能够阻止用户查看源码,如下图所示:
源码
但此时即无限调试下,网络请求是暂停的,这里就不做演示了!

如何取消无限调试?

那么如何取消无限调试呢?有两种方法,一种是停用JavaScript,一种是停用断点(欢迎在评论区指出其他好办法)

停用断点

当点击停用断点刷新页面,页面即变为正常状态
停用断点
注意:在这种情况下,网络请求也会正常进行请求

停用JavaScript

点击开发者工具右上角的设置按钮,如下图所示:
设置
在设置页面的最下方找到停用JavaScript,进行勾选,如下图所示:
停用JavaScript
接着刷新,页面就会显示正常,并且不会进入无限调试暂停的状态

防逆向/代码混淆

如果不想源码被逆向工程轻易分析,那么可以对代码进行混淆,以在线的代码混淆工具JavaScript Obfuscator为例,JavaScript Obfuscator能够对代码
的变量进行重命名、字符串加密等操作,在其官网有一段简单的代码例子:

function hi() {
  console.log("Hello World!");
}
hi();

当进行混淆后,变为了一大串看似随机的代码,如下图所示:
混淆结果
此外,还有UglifyJS、谷歌提供的Closure Compiler等代码压缩和混淆工具

webpack TerserPlugin

webpack中,可以使用TerserPlugin对代码进行压缩和混淆, erserPlugin能够去除代码中的注释、空格,并对变量名、函数名进行混淆以减小文件大小并增加逆向工程的难度

安装代码:

npm install terser-webpack-plugin --save-dev

// webpack中配置
const TerserPlugin = require('terser-webpack-plugin');

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [new TerserPlugin()],
  },
};

墨菲定律

这里引用墨菲定律的一句话:任何可能出错的事情最终都会出错

而在代码中,则体现出作者越想隐藏代码,别人就越感兴趣,所以前端安全如果仅仅在前端做手段,那是远远不够的,还需在后端、数据库等方面共同努力

欢迎关注csdn前端领域博主: 前端小王hs,喜欢可以点个赞!您的支持是我不断更新的动力!

前端小王hs:
清华大学出版社《后台管理实践——Vue.js+Express.js》作者
网络工程师 前端工程师 项目经理 阿里云社区博客专家 

email: 337674757@qq.com
wx:最下方有联系方式
资料/交流群: vx备注前端安全

03-26
### 逆向工程与反编译概述 逆向工程是一种通过对软件的目标代码进行分析,将其转化为更高级别的表示形式的过程。这一过程通常用于研究现有系统的内部结构、功能以及实现细节。在Java和Android领域,反编译工具被广泛应用于逆向工程中。 #### Java逆向工程中的Jad反编译工具 Jad是一款经典的Java反编译工具,能够将`.class`字节码文件转换为可读的`.java`源代码[^1]。虽然它可能无法完全恢复原始源代码,但它提供了足够的信息来帮助开发者理解已编译的Java程序逻辑。Jad支持多种反编译模式,并允许用户自定义规则以适应不同的需求。此外,其命令行接口和图形界面使得复杂代码的分析变得更加便捷。 #### Android逆向工程中的JEB反编译工具 针对Android应用的逆向工程,JEB是由PNF Software开发的一款专业级工具[^2]。相较于其他同类产品,JEB不仅具备强大的APK文件反编译能力,还能对Dalvik字节码执行高效而精准的操作。它的核心优势在于以下几个方面: - **广泛的平台兼容性**:除Android外,还支持ARM、MIPS等多种架构的二进制文件反汇编。 - **混淆代码解析**:内置模块能有效应对高度混淆代码,提供分层重构机制以便于深入分析。 - **API集成支持**:允许通过编写Python或Java脚本来扩展功能并完成特定任务。 #### APK反编译流程及其意义 当涉及到具体的APK包时,可以通过一系列步骤提取其中的信息来进行全面的安全评估或者学习目的的研究工作[^3]。这些步骤一般包括但不限于获取资产目录(`assets`)内的资源数据;解密XML配置文档如`AndroidManifest.xml`定位应用程序启动点;最后利用上述提到的各种专用软件重现整个项目框架供进一步探讨。 ```bash # 使用apktool反编译APK示例 apktool d your_app.apk -o output_directory/ ``` 以上命令展示了如何借助开源工具ApkTool轻松拆卸目标安卓档案至易于探索的状态下。 ### 结论 无论是传统的桌面端还是现代移动端环境里头,恰当运用合适的反编译解决方案都是达成逆向工程项目成功不可或缺的一环。每种工具有各自专精之处,在实际应用场景当中应当依据具体需求做出明智的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端小王hs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值