zoukankan      html  css  js  c++  java
  • js逆向8+9-浏览器指纹和node指纹,webpack,jsdom---基础结束,下面是进阶

    ###

    这种逻辑判断,运算符的基础知识,也会出现在代js混淆里,要看的懂,

    ### 

     扣代码和补环境,有什么区别?

    其实扣代码的时候,也有补环境的操作,为什么能分成两个分支,

    首先就是两者的占比不同,扣代码大部分都是拿别人的代码,实在运行不下去,才会补一点环境,

    而补环境,是大部分都是自己写,

    ####

    怎么找函数入口?

    js的三种,cookie,header,参数,

    怎么找入口,

    cookie还可以hookcookie去找,

    header和参数,就要看到请求的地方,可以断点调试XHR,看看他发起请求的地方在哪一个地方构造的请求头和参数,然后一步一步去找,

    ###

    按照现在的讲的水平,

    把所有的内容掌握了,耐心搞一个二线以下的产品,没有什么问题,

    关于大厂的产品,还是不容易的,

    不要直接问人家大厂的产品怎么搞,拿一个完整的方案,这是违法的,

    ###

     ###

     ###

    ###

    什么是浏览器的指纹?

    就是浏览器的api,这些在浏览器调用才可以,不然会调用失败,这就是浏览器指纹,这是安全厂商造出来的词,之前都没有这个说法,

    补环境的时候,会遇到校验浏览器指纹,就要有这个意识,

    window就是一个浏览器的api,比如获取浏览器的高宽,这些就是天生的可以作为指纹的,

    document,

    ###

    这就是补环境的思路,遇到了就按照这个思路去补环境,

    ###

    当然你牛逼的话,也可以虚拟出来一个dom,就是无论他调什么方法,你都能获取到对应的方法,

    但是这个是一个大项目,不好弄,不是一个人弄的,要好几个人,

    ###

    navigate,也是浏览器指纹,这也是非常常用的浏览器指纹,

    但是补环境也好补,就是用一个简单的对象就可以了,

    navigate = { }

    ###

    和dom相关的内容,和节点相关的操作,都不好补环境,

    就是往上跟,看这个dom操作究竟是做了什么,就是把他实际的结果,直接拿过来用就行了,

    这就是直接把结果拿过来,

    否则就是补环境的成本太高了,

    ##

    补环境,还有有难度的,你要知道js的基础知识,jQuery,还是es6的语法也要知道,就像之前说的,逆向的能力,取决于你正向的能力,

    ###

    ###

    node指纹就是看你是不是node环境,

    1,在浏览器里面,window是全局变量,而node里是global,

    2,导包引擎,这个在浏览器是没有的,但是很危险,原因就是可以直接操作你的电脑,还是在你不知情的情况下,

    这一段代码,就能直接让你的电脑重启,如果混淆过之后,你拿过来,在你电脑执行,就会很危险,你不知道他干了什么

    ######################## 

    第三个,可被重写的全局,什么意思,比如浏览器里面是不能删除window的,但是node里面可以

     

    这个window在浏览器删除不了,但是在node就可以被删除,

    ###

    你在node里面是没有dom这个概念的,你看不到这个dom树,

    ###

    比如你遇到了dom节点操作你怎么补环境?我们不可能把当前网站虚拟化一个dom节点出来,所以你怎么补?

     这个就是补节点操作的思路,

    就是把结果拿出来,让他不报错,使用的对象的思维,

    我看是有整理过几百个实战的网站,这个要拿到

     

     ####

    案例,比赛的第16题,

    通过这个方式,把这个控制台调试过掉,

    开始判断他的加密位置,

    第一步,看cookie,

    注意cookie里面的hm开头的,都不用管,那是百度统计的,也没有其他加密的参数,

    第二步,看header头,也都是熟悉的东西,也不用管,

    第三步,看参数,看到一个m,一个t,这就是加密的东西,

    第四步,重放攻击,发现重放失败了,所以必须要找到这个加密,才可以进行,否则就不用管它了,

    第五步,开始找这个m参数的函数入口,开始破解,

    破解加密参数

    第一步,分析,这个是一个json数据,所以应该是一个XHR过来的, 而且在network,里面找XHR也是可以看到的,

    第二步,打一个全局的XHR断点,然后,翻页,会断点住,就是发送XHR请求的地方,使用的jQuery,

    第三步,然后开始先上一层一层的找堆栈,

     我们发现在上一步,参数就已经生成了,就要再往上找,

    找到lwebpack里面,有一个r.m这个就是加密的地方,

    第四步,放开XHR断点,在加密的地方增加一个断点,刷新页面,

    第五步,这个入口找到了,就完全的可以,100%可以通过扣代码的方式搞定这个了,

    你会发现这个btoa是通过改动了的,不是原生的,

    没关系,就找他改动过的这个btoa,拿过来,

    注意找的时候可以通过sojson网站,可以把这个js去除格式化,https://www.sojson.com/

    第六步,按照这个扣代码的流程,按理说是没有问题的,但是实际运行就是不行,

    这是为什么?

    就是只有一个可能,就是投毒了,

    怎么办?

    1,try catch

    2,if else

    3,|| &&

    这三点就是我们排查的手段,还可以插桩调试,

    至于有一个成熟的方法论去解决这个投毒的事情,没有,这个是一个经验的事情,只有多扣代码,你就会遇到这种情况,

    这个题就是把window对象在一个地方置空了,

    这个是一个很墨迹的事情,可能需要几天的时间,可能会有更好的方法解决,但是我不行,我不知道,

    ###

    webpack就是前端的一个打包 工具,

     ###

     案例,比赛第10题,

    我实际上这个插桩没理解,

    ###

    https://segmentfault.com/a/1190000014844043中文文档,

     ####

    这个jsdom怎么用?

    ###

    上面我们说node里面没有dom,

    而这个jsdom就可以虚拟出来dom,这样我们扣代码和补环境就容易多了

    案例,比赛第2题,

    我们直接可以把js文件拿过来,把url拿过来,就可以渲染出来dom树,就可以解析js文件,直接能解密,

    // 导入jsdom
    jsdom = require('jsdom')
    // 生成jsdom对象
    const {JSDOM} = jsdom;
    // 倒入读写js的包
    const fs = require('fs')
    // 对1.html进行对去操作
    fs.readFile('./1.html', 'utf8', function (err, data) {
        //定制jsdom,data一般是js代码,由于安全策略的原因导致无法自动加载script标签
        //需要开启安全策略的开关,runScripts: "dangerously"
        //js代码直接写入会报错。所以一般在本地新建个html文件,像刚刚的1。html,然后用fs.readFile进行读取操作
        const dom = new JSDOM(data
            ,
            {
                url: "http://match.yuanrenxue.com/match/2",
                referrer: "http://match.yuanrenxue.com/match/2",
                contentType: "text/html",
                userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36",
                includeNodeLocations: true,
                runScripts: "dangerously",
            }
            )
        console.log(dom.window.document.cookie);
    
        dom.window.close()
    })

    ####

    高级用法:

    // 导入jsdom
    const  jsdom = require('jsdom')
    // 生成jsdom对象
    const { JSDOM } = jsdom;
    // 倒入读写js的包
    const fs = require('fs')
    
    options={
                url: "http://match.yuanrenxue.com/match/2",
                referrer: "http://match.yuanrenxue.com/match/2",
                contentType: "text/html",
                userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36",
                includeNodeLocations: true,
                runScripts: 'dangerously',
    
                cookieJar:new jsdom.CookieJar(),
                beforeParse(window) {
                    window.alert();
                    window.setInterval = function (s, b) {
                        eval(s)
                    }
                    //重写之后进行伪装
                    window.setInterval.toString = function () {
                        "function setInterval() { [native code] }"
                    }
                    window.setTimeout = function (s, b) {
                        eval(s)
                    }
                    window.setTimeout.toString = function () {
                        "function setTimeout() { [native code] }"
                    }
                },
    
            }
    // 提前植入setcookie的操作
    options.cookieJar.setCookie(cookie,url,function(val){})
    // 对1.html进行对去操作
    fs.readFile('./1.html', 'utf8', function (err, data) {
        //定制jsdom,data一般是js代码,由于安全策略的原因导致无法自动加载script标签
        //需要开启安全策略的开关,runScripts: "dangerously"
        //js代码直接写入会报错。所以一般在本地新建个html文件,像刚刚的1。html,然后用fs.readFile进行读取操作
        const dom = new JSDOM(data
            ,
            options
        )
        console.log(dom.window.document.cookie);
        //将dom窗口关闭
        dom.window.close()
    })

    ###

    更高级的用法去看文档,

    ###

    jsdom的缺点:

    最明显的就是暂用性能过高, 有时候并发上不去,到了选无可选的时候才会使用这个,

    ####

    到现在,基础课程都结束了,下面就是进阶

    ####

    #####

  • 相关阅读:
    react hooks子给父传值
    npm安装依赖 and 删除依赖
    react 阻止事件冒泡
    http 500状态码
    vue中插槽slot的使用
    怎样在vue项目中使用axios处理接口请求
    GET 与 POST 其实没有什么区别
    LazyMan
    什么是微服务,什么是分布式
    思索 p5.js 的最佳实践
  • 原文地址:https://www.cnblogs.com/andy0816/p/15088479.html
Copyright © 2011-2022 走看看