V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
anai1943

js 反调试 怎么实现?

  •  2
     
  •   anai1943 · Mar 18, 2017 · 9151 views
    This topic created in 3326 days ago, the information mentioned may be changed or developed.

    项目中用到了一些 xml 文件, xml 文件都是通过工具加密的,再用前端 js 解密回来使用, xml 里面都是一些样式代码,如果被解密,辛苦写的样式就被人盗用了。

    此加密方法有个缺陷,通过 F12 调试前端 js 的解密函数,可以打印出来解密后的 xml 。

    我用过类似 npm code-protect 这种工具来加密 js 文件,发现只是混淆了一些变量名而已,网上有实现 js 反调试的,具体效果见下图,通过什么方法可以实现这种效果呢?

    111222.png
    Supplement 1  ·  Mar 18, 2017
    看到很多朋友留言了,多谢。

    可能前面需求没说清楚,不是实现 js 代码加密,是要阻止用浏览器调试工具调试,例如:使用 chrome 或者别的浏览器,格式化 js 文件后,设置一个断点,正常情况下,代码会执行到这个断点,你可以查看变量的值什么的,如果实现反调试,能否实现像截图中那样,破坏调试流程。

    @ftpgxm 你提供的方法应该就是正解了,我测试下。谢谢!
    用这种手段也属于无奈,辛苦写的皮肤经常被盗用。如果能实现反调试,可以阻止大部分的菜鸟级别的盗用者了。
    30 replies    2017-03-20 18:27:45 +08:00
    O3YwA1ENkb7i35XJ
        1
    O3YwA1ENkb7i35XJ  
       Mar 18, 2017
    看图猜代码?
    hcwhan
        2
    hcwhan  
       Mar 18, 2017
    样式这种不是需要被人看到 怎么加密
    hcwhan
        3
    hcwhan  
       Mar 18, 2017
    直接查看最后的样式属性 不就行了
    zzNucker
        4
    zzNucker  
       Mar 18, 2017
    你发图没用,
    地址呢?
    ChefIsAwesome
        5
    ChefIsAwesome  
       Mar 18, 2017   ❤️ 2
    右上角最后一个按钮是停用所有 breakpoints ,直接就破了这东西了。
    anai1943
        6
    anai1943  
    OP
       Mar 18, 2017
    @hcwhan 样式不是 css 写的,是用 action script 写的。如果加密得当,客户端是看不到 xml 里面的样式源码的。
    anai1943
        7
    anai1943  
    OP
       Mar 18, 2017
    @zzNucker 这个。。没地址啊,写出来这个功能的哥们,做成收费的了,只能买他的软件,才能加密 js ,没有提供加密后的 js 预览地址。
    qqpkat2
        8
    qqpkat2  
       Mar 18, 2017
    js 加密就是延长解密时间而已
    百度和 QQ 的密码加密都能研究出来,你就别想了
    anai1943
        9
    anai1943  
    OP
       Mar 18, 2017
    @qqpkat2 js 代码被解密没关系的,只想达到这样的效果就可以了,用户在浏览器里面用调试工具设置断点的时候,实现截图里面的效果。
    des
        10
    des  
       Mar 18, 2017
    找到了这个,估计说的也是这个。
    各位可以试一试,不过由于那个图片加载不出来,所以一堆 error ,不用管
    未加密版的: http://jsfiddle.net/JScrambler/GaeLD/
    加密版的: http://jsfiddle.net/JScrambler/5ujp3/
    Kilerd
        11
    Kilerd  
       Mar 18, 2017
    前端的东西还想加密???
    anai1943
        12
    anai1943  
    OP
       Mar 18, 2017
    @des 这个很早之前注册过, JScrambler : https://jscrambler.com/,是商业版的,收费的。你发的 demo 翻墙可以看到图片的。我去试试,以前注册过没怎么研究。
    anai1943
        13
    anai1943  
    OP
       Mar 18, 2017
    @Kilerd 不是加密,是反调试。。在浏览器里面用调试工具设置断点的时候,实现截图里面的效果。
    ftpgxm
        14
    ftpgxm  
       Mar 18, 2017   ❤️ 3
    反调试一个方法就是利用递归次数过多调试工具会抛出异常,旁门左道,前端再怎么设防依旧是运行在客户端的~

    Demo: https://jsfiddle.net/ftpgxm/t4ux8xp4/
    ftpgxm
        15
    ftpgxm  
       Mar 18, 2017
    anai1943
        16
    anai1943  
    OP
       Mar 18, 2017
    @ftpgxm 恩 测试可用。。感谢!
    hanguofu
        17
    hanguofu  
       Mar 18, 2017
    学习了, V2EX 高手就是多:)
    imswing
        18
    imswing  
       Mar 19, 2017 via Android
    Mark 一下
    moyang
        19
    moyang  
       Mar 19, 2017
    @ftpgxm 看了 jsfiddle ,不明白。 chrome 没办法可靠感知 console 是不是打开,怎么能做到“一旦打开调试工具就抛异常”?
    beginor
        20
    beginor  
       Mar 19, 2017 via Android
    编译成 Web Assembly 吧
    usedname
        21
    usedname  
       Mar 19, 2017 via iPad
    你把代码写的足够烂人家就不会调试你了
    des
        22
    des  
       Mar 19, 2017
    @ftpgxm chrome 打不打开调试工具一样会抛异常, edge 倒是可以,没装 firefox 不知道
    ftpgxm
        23
    ftpgxm  
       Mar 19, 2017
    @des
    @moyang
    异常应该说是 JS 抛出的,调试工具只是能直观看到,上面表述有误,抱歉。
    try cache 为了保证了后续代码能正常执行,同时打开调试工具能进入断点。
    macleek
        24
    macleek  
       Mar 19, 2017
    以前在一个不能点投诉的微信页面见到过这种用法。。。
    sagaxu
        25
    sagaxu  
       Mar 19, 2017
    firefox 里深层次递归没用,还是可以调试
    bombless
        26
    bombless  
       Mar 19, 2017 via Android
    微信网页版的那个加密好像不错,那些 json 中的字符串都被转换过,都不知道怎么转换回来好, 233
    momocraft
        27
    momocraft  
       Mar 19, 2017
    @ftpgxm 如果把瀏覽器 "拋出異常時自動斷點" 的功能關掉, 這個方法還好用嗎?
    rannnn
        28
    rannnn  
       Mar 20, 2017
    @moyang debugger statement 只有在 console 打开的情况下才有用。写那么复杂其实就是循环 500 次
    moyang
        29
    moyang  
       Mar 20, 2017 via Android
    @rannnn debugger 语句只有开 console 才有用,这是对的。但是递归循环这一块就是不开 console 也会有。所以重点就是不开 console 会递归但没有异常,开了 console 就会有异常?没发现这样的现象啊

    还不如在所有语句中间插入数百 debugger 语句,也能干扰调试
    rannnn
        30
    rannnn  
       Mar 20, 2017
    @moyang 我觉得那个递归没啥意义,直接循环就完了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   6057 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 83ms · UTC 02:12 · PVG 10:12 · LAX 19:12 · JFK 22:12
    ♥ Do have faith in what you're doing.