精华内容
下载资源
问答
  • 鬼鬼JS调试工具

    2019-02-08 08:48:03
    鬼鬼JS7.0版本的调试工具
  • 鬼鬼JS调试工具7.5.rar

    2020-12-18 17:09:11
    非常强大的一款js调试工具,用来调试网站中的js代码
  • 鬼鬼JS调试工具7.5.zip

    2021-08-27 11:07:19
    鬼鬼JS调试工具7.5.zip
  • 做爬虫的都知道,因为经常需要逆向,而且比较难找到合适的js调试的工具,但是又需要的一款js调试工具,这款工具降低了我们后端工程师逆向调试js的难度!!!!这里推荐给大家,很好用!!!
  • 鬼鬼JS调试工具.zip

    2021-05-16 21:55:40
    鬼鬼JS调试工具.zip
  • 鬼鬼JS调试工具V5.8

    2018-07-12 14:13:48
    可以在运行时动态改变 JS 代码,并且不需要刷新页面就可以看到效果,一般用这个实时的在代码里插 console.log DOM 事件/XHR 断点 可以针对 DOM 结构改变/属性改变/键盘鼠标事件 等下断点,直接断到事件的第一个 ...
  • js调试工具最新版,修复了以前的一些小bug,使用起来更加流畅。
  • 鬼鬼js调试工具.zip

    2021-11-29 16:05:39
    一些js的功能
  • JS调试工具7.5.rar

    2020-09-11 16:17:06
    js调试工具,可以进行js逆向调试,把js代码截取之后,在此工具中创建一个js函数,通过调用js函数进行js调试,本工具有错误日志,可以帮助你找到js中不足的参数和函数,使你更加简便的进行js调试
  • 常见的JavaScript调试工具

    千次阅读 2018-12-25 17:23:37
    最常用的脚本调试工具,前端工程师必备,被喻为"居家旅行的瑞士军刀" 二、Fiddler 是一个本地代理服务器,需要将浏览器设置为本地代理服务器上网才可以使用,Fiddler会监控所有的浏览器请求,并...

    一、Firebug

    最常用的脚本调试工具,前端工程师必备,被喻为"居家旅行的瑞士军刀"

    二、Fiddler

    是一个本地代理服务器,需要将浏览器设置为本地代理服务器上网才可以使用,Fiddler会监控所有的浏览器请求,并有能力在浏览器请求中插入数据

    三、HttpWatch

    是一款商业软件,并以插件的形式嵌入在浏览器中,仅仅是一个专业的Web Sniffer

    四、Chrome的开发者工具

    一个浏览器调试工具,在经过了几个版本的更新,其调试功能也日渐强大。在打开Chrome后可以通过点击“F12”功能键、“Ctrl Shift I”或者“Ctrl Shift J”打开开发者工具。也可以通过工具 - 开发者工具 打开。

    展开全文
  • JS调试工具,可以直接运行和调试js代码
  • 鬼鬼调试7.5
  • 经过上一题的练习JS混淆—源码乱码,我们已经对JS混淆有了大致的了解,这次我们再来练习一道同类型的题目,只不过这次是动态Cookie 首先,让我们了解一下什么是Cookie Cookie 并不是它的原意“甜饼”的意思, 而是一个...

    写在前面

    第一题JS混淆—源码乱码

    经过上一题的练习JS混淆—源码乱码,我们已经对JS混淆有了大致的了解,这次我们再来练习一道同类型的题目,只不过这次是动态Cookie

    首先,让我们了解一下什么是Cookie
    Cookie 并不是它的原意“甜饼”的意思, 而是一个保存在客户机中的简单的文本文件, 这个文件与特定的 Web 文档关联在一起, 保存了该客户机访问这个Web 文档时的信息, 当客户机再次访问这个 Web 文档时这些信息可供该文档使用。由于“Cookie”具有可以保存在客户机上的神奇特性, 因此它可以帮助我们实现记录用户个人信息的功能, 而这一切都不必使用复杂的CGI等程序

    举例来说, 一个 Web 站点可能会为每一个访问者产生一个唯一的ID, 然后以 Cookie 文件的形式保存在每个用户的机器上。如果使用浏览器访问 Web, 会看到所有保存在硬盘上的 Cookie。在这个文件夹里每一个文件都是一个由“名/值”对组成的文本文件,另外还有一个文件保存有所有对应的 Web 站点的信息。在这里的每个 Cookie 文件都是一个简单而又普通的文本文件。透过文件名, 就可以看到是哪个 Web 站点在机器上放置了Cookie(当然站点信息在文件里也有保存)

    简单理解就是,Cookie相当于你浏览Web站点时,相对于这个站点的身份证号,如果说身份证号错误,肯定是不能正常访问这个站点的;这也是这次题目的考察内容

    文章原链接https://syjun.vip/archives/279.html

    题目

    题目部分截图
    题目网址点我去刷题
    提取全部5页发布日热度的值,计算所有值的加和,并提交答案

    分析网页

    由于是动态Cookie,为了避免其他Cookie的影响,所以使用浏览器的无痕模式进行调试,按f12并选中【Preserve log】

    【Preserve log】:保留请求日志,跳转页面的时候勾选上,可以看到跳转前的请求(可以让我看到更详细的请求)

    我们还是首先查看一下【XHR】里面的内容


    可以很清楚的看到,页面当中的发布日热度值,就来源于这条链接 【http://match.yuanrenxue.com/api/match/2】

    我们尝试着在浏览器中打开这条链接,会得到这么一条信息

    通过Unicode编码转换工具,翻译过来是:{“error”: “出错啦~嘤嘤嘤”}
    可以看得出,开发者还是挺会玩的,嘿嘿

    出现这样的错误,也在意料之中,因为这道题目考的是动态Cookie,你去请求包含信息的链接时,Cookie不对,肯定是会报错的

    我们继续查看XHR里面的内容,可以发现确实存在Cookie这么一个值的,而且这个加密的值跟上次的题目很像

    那么这个Cookie是怎么生成的呢?

    Cookie从何而来

    我们回到调试工具,这次我们查看所有的请求信息,看看有没有其他的花样

    可以发现,有两个名为【2】的请求
    我们分别查看这两个请求,可以发现,第一个请求是不带Cookie的,第二个请求是带Cookie
    不带Cookie
    带Cookie

    那么,我们就可以大胆的猜测,是不是第一个名为2的请求,执行了什么操作,让第二个名为2的请求带了Cookie

    使用Fiddler.exe抓包

    要想知道,第一个名为2的请求,到底发生了什么,我们可以使用Fiddler抓包软件,进行抓包查看
    首先,我们打开这个软件(网上搜索就可以直接下载使用)
    接着,打开无痕浏览器,进入到刷题网站,也就是这个链接【http://match.yuanrenxue.com/match/2】
    最后,我们回到Fiddler软件,会得到如下的信息

    可以看到,熟悉的名为【2】的请求,也在当中

    经过上面的猜测,我们知道,很有可能是第一个请求在暗地里做了些不为人知的操作
    我们点击第一个【2】请求,点击response里面的Textview按钮,可以看到一段被混淆过的JS代码

    看到这里的小伙伴可能就大概明白了,当发起第一个名为2的请求时,服务器端返回了一段JS代码,然后在浏览器里面执行了
    现在我们只需要将这段混淆过的JS代码翻译一下,就能知道第一个请求到底做了些什么了

    翻译混淆代码

    我们将返回的JS代码复制下来,记得不要复制开头的script和结尾的/script
    然后,我们来到猿人学提供的翻译混淆代码的工具点我进入工具
    我们将复制下来的代码,粘贴到第一个文本框,点击【一键解混淆】就行啦

    接着,我们将翻译好的代码,复制到Notepad++里面,使用JS插件格式化一下

    整段代码差不多200多行代码,而且这些函数名和变量名都非常奇怪,不过这些都不影响我们静下心来分析整段代码

    分析JS代码

    我们大致的浏览一下,全部代码,可以发现,大多数都是定义的函数,但是真正执行的只有最后的【 W(X());】

    我们分析W()函数可以发现

    function W(Y, Z) {
            document["cookie"] = "m" + M() + "=" + V(Y) + "|" + Y + "; path=/";
            location["reload"]();
        }
    

    w()函数定义了两个形参,而执行的函数【 W(X());】,是传入一个参数的,而这个参数就是上面的X()函数

    function X(Y, Z) {
            return Date["parse"](new Date());
        }
    

    我们在谷歌调试工具里面执行X()函数就可以看到,返回的是一个时间戳,那么这个函数也会返回一个时间戳


    X()函数我们弄清楚后,我们再来研究一下W()函数

    分析W()函数

    function W(Y, Z) {
            document["cookie"] = "m" + M() + "=" + V(Y) + "|" + Y + "; path=/";
            location["reload"]();
        }
    

    看到【 document[“cookie”] 】,我想大家已经明白了,Cookie是如何被设置的了
    而后面的【 location"reload"; 】,非常关键
    这行代码的意思就是:刷新当前文档,也就是按了一下浏览器上的刷新页面按钮

    现在我们重新理一下思路

    1. 网页向服务器发送请求,返回了两个名为【2】的结果
    2. 第一个没有Cookie,而第二个有Cookie
    3. 第一个虽然没有Cookie,但是却执行了一段JS代码
    4. 而这段JS代码给网页中的Cookie赋了值,接着刷新了整个页面
    5. 最后,呈现在我们眼前的网页,也就是第二个名为【2】的结果,有了Cookie

    所以说,Cookie是怎么来的,我就不再赘述了,我们接着分析W()函数里面的代码
    在分析代码之前,我们先对比一下,Cookie和这段代码

    m=36674c3718305e203ee914bf011045c5|1609132022000
    document["cookie"] = "m" + M() + "=" + V(Y) + "|" + Y + "; path=/";
    

    最后面的【"; path=/"】字符串,是页面信息(第几页),在其他地方肯定是会处理的,这里我们可以省略
    通过对比,赋值过程和赋值结果,我们可以发现赋值过程中的【 M() 】函数返回的一个应该是个空值
    我们可以去分析一下M()函数

    分析M()函数

    话不多说,直接上代码

    function M(Y, Z) {
            var a4 = B(this, function () {
                var a5 = function () {
                    var a6 = a5["constructor"]("return /\" + this + \"/")()["compile"]("^([^ ]+( +[^ ]+)+)+[^ ]}");
                    return !a6["test"](a4);
                };
    
                return a5();
            });
            a4();
            K();
            qz = [10, 99, 111, 110, 115, 111, 108, 101, 32, 61, 32, 110, 101, 119, 32, 79, 98, 106, 101, 99, 116, 40, 41, 10, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 40, 115, 41, 32, 123, 10, 32, 32, 32, 32, 119, 104, 105, 108, 101, 32, 40, 49, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 102, 111, 114, 40, 105, 61, 48, 59, 105, 60, 49, 49, 48, 48, 48, 48, 48, 59, 105, 43, 43, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 104, 105, 115, 116, 111, 114, 121, 46, 112, 117, 115, 104, 83, 116, 97, 116, 101, 40, 48, 44, 48, 44, 105, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 125, 10, 10, 125, 10, 99, 111, 110, 115, 111, 108, 101, 46, 116, 111, 83, 116, 114, 105, 110, 103, 32, 61, 32, 39, 91, 111, 98, 106, 101, 99, 116, 32, 79, 98, 106, 101, 99, 116, 93, 39, 10, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 46, 116, 111, 83, 116, 114, 105, 110, 103, 32, 61, 32, 39, 402, 32, 116, 111, 83, 116, 114, 105, 110, 103, 40, 41, 32, 123, 32, 91, 110, 97, 116, 105, 118, 101, 32, 99, 111, 100, 101, 93, 32, 125, 39, 10];
            eval(L(qz));
    
            try {
                if (global) {
                    console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
                } else {
                    while (1) {
                        console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
                        debugger;
                    }
                }
            } catch (a5) {
                return navigator["vendorSub"];
            }
        }
    

    首先,我们可以看到函数里面还包含着两个函数分别是【 a4() 】和【 K() 】
    而这个【 a4() 】函数,也定义在M()内,但是执行【 a4() 】函数的时候,并没有传入参数,所以说,这段代码是没用的

    接着,我们看一下K()函数

    function K(Y, Z) {
            if (Z) {
                return J(Y);
            }
    
            return H(Y);
        }
    

    需要传入参数,而执行的时候,又没有传入,所有这段代码也是是没用的
    我们简化一下M()函数

    function M(Y, Z) {
            qz = [10, 99, 111, 110, 115, 111, 108, 101, 32, 61, 32, 110, 101, 119, 32, 79, 98, 106, 101, 99, 116, 40, 41, 10, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 40, 115, 41, 32, 123, 10, 32, 32, 32, 32, 119, 104, 105, 108, 101, 32, 40, 49, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 102, 111, 114, 40, 105, 61, 48, 59, 105, 60, 49, 49, 48, 48, 48, 48, 48, 59, 105, 43, 43, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 104, 105, 115, 116, 111, 114, 121, 46, 112, 117, 115, 104, 83, 116, 97, 116, 101, 40, 48, 44, 48, 44, 105, 41, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 125, 10, 10, 125, 10, 99, 111, 110, 115, 111, 108, 101, 46, 116, 111, 83, 116, 114, 105, 110, 103, 32, 61, 32, 39, 91, 111, 98, 106, 101, 99, 116, 32, 79, 98, 106, 101, 99, 116, 93, 39, 10, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 46, 116, 111, 83, 116, 114, 105, 110, 103, 32, 61, 32, 39, 402, 32, 116, 111, 83, 116, 114, 105, 110, 103, 40, 41, 32, 123, 32, 91, 110, 97, 116, 105, 118, 101, 32, 99, 111, 100, 101, 93, 32, 125, 39, 10];
            eval(L(qz));
    
            try {
                if (global) {
                    console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
                } else {
                    while (1) {
                        console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
                        debugger;
                    }
                }
            } catch (a5) {
                return navigator["vendorSub"];
            }
        }
    

    eval()函数又出现了,做过第一道题的时候,我们知道eval()可以间接的改变一些变量的值,那么这里的eval()是否对cookie有所改变呢?
    我们来看看eval()中的L()函数

    function L(Y, Z) {
            let a0 = "";
    
            for (let a1 = 0; a1 < Y["length"]; a1++) {
                a0 += String["fromCharCode"](Y[a1]);
            }
    
            return a0;
        }
    

    L()函数可以传入两个参数,eval()执行的时候确实是传入一个参数的,这个参数是一个数组,正好用于L()函数中的for循环
    for循环里面的内容就是将,传入的数组中的每一个值,通过【 String[“fromCharCode”] 】这个方法翻译拼接着成一个字符串并返回
    我也尝试着运行了这个函数,结果并没有什么卵用,就是一串字符串而已,感兴趣的同学可以去试试
    这种就是典型的开发者挖坑,我们去踩

    我们继续读下面的代码

            try {
                if (global) {
                    console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
                } else {
                    while (1) {
                        console["log"]("\u4EBA\u751F\u82E6\u77ED\uFF0C\u4F55\u5FC5python\uFF1F");
                        debugger;
                    }
                }
            } catch (a5) {
                return navigator["vendorSub"];
            }
    

    try…catch 这个语法,我相信稍微学了点编程的同学,都知道是什么意思,我这里也不再阐述,不懂的同学可以问问百度
    try里面的内容还是有点意思,直接进来就报错
    我为什么这么说呢,是因为,global这个变量根本就没有定义,所有会直接报错,进入catch里面,虽然说传入了【a5】变量,但是在下面的代码并没有引用,可以不管
    最后,直接return navigator[“vendorSub”]

    而这个navigator主要是包含有关浏览器的信息,它通过数组取值的方式取值,大概率返回的任然是空值.如果不是我们可以回来继续分析


    那么,简化后的赋值代码可以这么写

    cookie = "m" + "=" + V(Y) + "|" + Y;
              m=36674c3718305e203ee914bf011045c5|1609132022000
    V(Y) = 36674c3718305e203ee914bf011045c5
    

    所以说,我们现在就知道了,加密的值来源于【 V(Y) 】

    在代码中分析【 V(Y) 】其实没必要,加密的过程过于复杂,我们直接使用鬼鬼JS调试工具,先验证一下我们猜想到达正不正确

    验证猜想

    我们将Notepad++里面的代码复杂粘贴到鬼鬼调试工具,记得删除第一行代码和最后一行代码
    这是因为第一行是一个大函数,包含了很多小函数和变量,删除后,方面我们在工具中调试

    在运行之前,我们先对代码进行如下的修改

    • 删除第一行代码和最后一行代码
    • 将代码中的let改为var,可以通过搜索let,进行修改
    • 删除104行左右的【 setInterval(M(), 500); 】这行代码,而这行代码的主要作用就是:每500毫秒,执行M(),而这个函数,我们在上面的推断是返回空所有没什么用,可以直接删掉
    • 在代码的开头定义 【 var navigator = {}; 】(这个navigator包含有关浏览器的信息,在运行代码的时候,由于执行了M()这个函数,而navigator没有定义(因为是在鬼鬼调试器中运行),会报错)
    • M()函数中,qz上面的多余代码直接删除,并没有什么卵用
    • W()函数中的内容,需要改写成下图的内容

    接着,我们写一个get_cipher()函数用来返回【 W(X()) 】的值

    可以看到,下面给出的执行结果是有值的,但是这还不严谨
    我们还需要通过最后一个步骤进行验证
    将Fiddler抓包工具,得到的m值后面的时间戳,复杂下来在调试工具中运行一下

    m=36674c3718305e203ee914bf011045c5|1609132022000 (Fiddler抓包工具得到的值)

    芜湖起飞,结果一模一样,我们可以愉快地写Python代码进行爬取数据啦!

    最后的爬虫和解出答案

    通过上面的一顿操作,我们可以编写一个JS文件,用于生成链接后面的密文
    在Python代码中可以通过第三方库execjs,执行这个JS文件,得到密文
    由于代码太多,我直接上链接
    https://wwx.lanzoux.com/iV6n7jsvotg

    话不到多,直接上爬虫代码,很简单,写了一些注释,我就不详细赘述了

    # @BY     :Java_S
    # @Time   :2020/12/26 12:14
    # @Slogan :够坚定够努力大门自然会有人敲,别怕没人赏识就像三十岁的梵高
    
    import requests
    import execjs
    import time
    
    def get_cipher_value():
        # 导入JS,读取需要的js文件
        with open(r'JS/jsCookie.js',encoding='utf-8',mode='r') as f:
            JsData = f.read()
        # 加载js文件,使用call()函数执行,传入需要执行函数即可获取返回值
        psd = execjs.compile(JsData).call('get_cipher')
        return psd
    
    def get_data(page_num,cipher):
        url = f'http://match.yuanrenxue.com/api/match/2?page={page_num}'
        headers = {
            'Host': 'match.yuanrenxue.com',
            'User-Agent':'yuanrenxue.project',
            'Cookie':cipher
        }
        print(f'加密密文--->{cipher}')
        response = requests.get(url,headers = headers)
        return response.json()
    
    
    if __name__ == '__main__':
    
        sum_num = 0
    
        for page_num in range(1, 6):
            info = get_data(page_num, get_cipher_value())
            price_list = [i['value'] for i in info['data']]
            print(f'第{page_num}页发布日热度的值:{price_list}')
            sum_num += sum(price_list)
            time.sleep(1)
    
        print(f'发布日热度值总和:{sum_num}')
    
    

    展开全文
  • 一款不错的JS调试工具
  • 在利用JS调试工具调试 这个某博得这个 ssologin.js 时,加载代码 就会提示 Microsoft JScript 运行时错误 【'location' 未定义】, 困扰好久。 具体的 请看下图。
  • 2、鬼鬼Js调试工具V7.5 3、开始分析 测试使用的手机号码为:13188888888 测试使用的验证码为:123456 打开Chrome浏览器的开发者工具,输入以上的测试手机号码和验证码,在开发者工具上可以...

    今天分析的是中国移动的139的邮箱,使用的是手机验证码登陆分析

    主要瞅一眼,登陆请求时,是由哪些参数加密请求的。

    笔记只是作为Js逆向学习而已


    1、分析登陆请求的网站

    https://mail.10086.cn/

     

    2、使用到的工具

    1、Chrome浏览器
    
    2、鬼鬼Js调试工具V7.5

     

    3、开始分析

    测试使用的手机号码为:13188888888
    
    测试使用的验证码为:123456

     打开Chrome浏览器的开发者工具,输入以上的测试手机号码和验证码,在开发者工具上可以获取到数据,注意,需要勾选 log日志留存。因为这个登陆是302跳转的。

     

     

    在headers中我们就可以得到Post请求提交的数据。其中在URL提交的参数中也有一些动态的参数数据。通过多次抓包就可以发现。


     通过多次抓包后,不难发现,其中有部分参数是固定值,不会更改

    post提交URL中的参数
    
    _fv: 4
    
    cguid: 1505342361157
    
    _: 90414702c39283a6a96cbe4f3ab3e3d1764f8e84
    
    resource: indexLogin
    
    
    formdata
    
    UserName: 13188888888
    
    passOld: 
    
    webVersion: 25
    
    loginFailureUrl: https://mail.10086.cn/default.html?smsLogin=1
    
    Password: 871d0a9e95aba22b4604224cfba24e605fabbc34
    
    authType: 2

     

    会更改的参数为以下几个

    post提交URL中的参数
    
    cguid: 1505342361157
    
    _: 90414702c39283a6a96cbe4f3ab3e3d1764f8e84
    
    
    
    formdata 表单数据
    
    UserName: 13188888888
    
    Password: 871d0a9e95aba22b4604224cfba24e605fabbc34
    

     

    那么我们首先可以从Password密码算法加密开始进行解密


    4、Password解密

    在开发者工具中,Ctrl+Shift+F  打开全局搜索。输入 关键词 : Password 

    发现了一下搜索到的数据

    排除 一些 源码中存在的关键词,css中存在的关键词,我们直接查看由js编写存在的关键词。

    在逐个排查后,在570中找到一个可疑的数据点,

     

    在这里可以看到,在网页表单中的ID,txtpass  和  txtsms  ,那么大差不差的就应该是在这里进行加密的。

    所以在这里进行下断点进行调试查看。

     

    开始重新点击登陆调试

     

    这个和我们的表单数据一模一样了Password: 871d0a9e95aba22b4604224cfba24e605fabbc34

    那么说明,这个就是验证码加密的方法 ,我们就可以移动到这个clacDigest函数上,点击进入

    然后把这个函数给“扣”下来,放入鬼鬼调试工具中测试

            (function() {
                function a(a, c) {
                    var d = (a & 65535) + (c & 65535);
                    return (a >> 16) + (c >> 16) + (d >> 16) << 16 | d & 65535
                }
                window.calcDigest = function(b) {
                    for (var c = (b.length + 8 >> 6) + 1, d = Array(16 * c), e = 0; e < 16 * c; e++)
                        d[e] = 0;
                    for (e = 0; e < b.length; e++)
                        d[e >> 2] |= b.charCodeAt(e) << 24 - 8 * (e & 3);
                    d[e >> 2] |= 128 << 24 - 8 * (e & 3);
                    d[16 * c - 1] = 8 * b.length;
                    b = Array(80);
                    for (var c = 1732584193, e = -271733879, f = -1732584194, g = 271733878, k = -1009589776, h = 0; h < d.length; h += 16) {
                        for (var l = c, m = e, n = f, p = g, q = k, j = 0; 80 > j; j++) {
                            b[j] = 16 > j ? d[h + j] : (b[j - 3] ^ b[j - 8] ^ b[j - 14] ^ b[j - 16]) << 1 | (b[j - 3] ^ b[j - 8] ^ b[j - 14] ^ b[j - 16]) >>> 31;
                            var r = a(a(c << 5 | c >>> 27, 20 > j ? e & f | ~e & g : 40 > j ? e ^ f ^ g : 60 > j ? e & f | e & g | f & g : e ^ f ^ g), a(a(k, b[j]), 20 > j ? 1518500249 : 40 > j ? 1859775393 : 60 > j ? -1894007588 : -899497514))
                              , k = g
                              , g = f
                              , f = e << 30 | e >>> 2
                              , e = c
                              , c = r
                        }
                        c = a(c, l);
                        e = a(e, m);
                        f = a(f, n);
                        g = a(g, p);
                        k = a(k, q)
                    }
                    d = [c, e, f, g, k];
                    b = "";
                    for (c = 0; c < 4 * d.length; c++)
                        b += "0123456789abcdef".charAt(d[c >> 2] >> 8 * (3 - c % 4) + 4 & 15) + "0123456789abcdef".charAt(d[c >> 2] >> 8 * (3 - c % 4) & 15);
                    return b
                }
            }
            )();

    这个应该是一个匿名函数,删除不需要的东西

    
                function a(a, c) {
                    var d = (a & 65535) + (c & 65535);
                    return (a >> 16) + (c >> 16) + (d >> 16) << 16 | d & 65535
                }
                calcDigest = function(b) {
                    for (var c = (b.length + 8 >> 6) + 1, d = Array(16 * c), e = 0; e < 16 * c; e++)
                        d[e] = 0;
                    for (e = 0; e < b.length; e++)
                        d[e >> 2] |= b.charCodeAt(e) << 24 - 8 * (e & 3);
                    d[e >> 2] |= 128 << 24 - 8 * (e & 3);
                    d[16 * c - 1] = 8 * b.length;
                    b = Array(80);
                    for (var c = 1732584193, e = -271733879, f = -1732584194, g = 271733878, k = -1009589776, h = 0; h < d.length; h += 16) {
                        for (var l = c, m = e, n = f, p = g, q = k, j = 0; 80 > j; j++) {
                            b[j] = 16 > j ? d[h + j] : (b[j - 3] ^ b[j - 8] ^ b[j - 14] ^ b[j - 16]) << 1 | (b[j - 3] ^ b[j - 8] ^ b[j - 14] ^ b[j - 16]) >>> 31;
                            var r = a(a(c << 5 | c >>> 27, 20 > j ? e & f | ~e & g : 40 > j ? e ^ f ^ g : 60 > j ? e & f | e & g | f & g : e ^ f ^ g), a(a(k, b[j]), 20 > j ? 1518500249 : 40 > j ? 1859775393 : 60 > j ? -1894007588 : -899497514))
                              , k = g
                              , g = f
                              , f = e << 30 | e >>> 2
                              , e = c
                              , c = r
                        }
                        c = a(c, l);
                        e = a(e, m);
                        f = a(f, n);
                        g = a(g, p);
                        k = a(k, q)
                    }
                    d = [c, e, f, g, k];
                    b = "";
                    for (c = 0; c < 4 * d.length; c++)
                        b += "0123456789abcdef".charAt(d[c >> 2] >> 8 * (3 - c % 4) + 4 & 15) + "0123456789abcdef".charAt(d[c >> 2] >> 8 * (3 - c % 4) & 15);
                    return b
                }
    
    

    在鬼鬼调试工具中测试一下,测试成功

     

    然后我们看一下,验证码的的整体的算法加密的是怎么样的

    a.value = c.calcDigest("fetion.com.cn:" + $E("txtSms").value),

    也就是说  验证码最终的算法是     字符串 "fetion.com.cn:" + 验证码 “123456” 的拼接,然后去通过 函数 clacDigest 计算得到的

    我们在鬼鬼调试工具中 加上  字符串 "fetion.com.cn:" 

    这个时候 就和我们的 Password 一样了。那么至此,Password 的解密就完成了


    5、cguid的解密

    一样的道理,在全局搜索中 关键词搜索 cguid    得到一堆的 搜索数据

     其中 这个红框圈中的 尤为显眼,点击进入查看一下 

    https://mail.10086.cn/Login/Login.ashx?smsLogin=1&s=0&v=0&u=MTMxODg4ODg4ODg=&m=35&ec=S035&resource=indexLogin&cguid=1533448729729&mtime=19&_fv=4&_=90414702c39283a6a96cbe4f3ab3e3d1764f8e84&resource=indexLogin

    其实看一下,其中的 红框这一段,就很像 post请求 构造的 请求 URL ,但是我们是验证码登陆的,这个明显不是,继续找全局搜索的 发现了一个

     

    这里有一个 sms 的验证码的关键词,那么可以点击进入看一下  ,还是这个 getCGUID 函数在做事情,那么我们就可以尝试的试一下。

    进入函数中查看,貌似就是一个时间戳生成加上4位的随机数生成。

    在console面板中测试一下啊,果然就是,那么可以在python中,直接取时间戳就行,麻烦一点就是扣一下代码放入鬼鬼调试工具里面测试

    效果也是一样的。那么至此,cguid 的参数问题 也解决了


    6、_:参数的解密

     

    其实在一般情况下,加密的一些参数,写的代码往往都是非常的相近的。这个是刚才找password加密的地方,上面这个 FormAction就是 提交的URL参数

    其中里面有一个非常显眼的关键词  Sha1  算法。

    那么还是一样,猜测一下,_:可能就是 通过sha1 算法进行加密的。

    那么我们就首先需要知道  sha1里面 这个 a.value是什么值

    重新断点调试后,定位到 sha1 里面的值

    就是我们的手机号码,那么就简单了。sha1 目前直接有现成的算法库的,直接可以调用。当然也是跟上面一样扣代码

                sha1: function(a) {
                    function b(a, b) {
                        var c = (a & 65535) + (b & 65535);
                        return (a >> 16) + (b >> 16) + (c >> 16) << 16 | c & 65535
                    }
                    for (var c = [], d = 0; d < 8 * a.length; d += 8)
                        c[d >> 5] |= (a.charCodeAt(d / 8) & 255) << 24 - d % 32;
                    a = 8 * a.length;
                    c[a >> 5] |= 128 << 24 - a % 32;
                    c[(a + 64 >> 9 << 4) + 15] = a;
                    a = Array(80);
                    for (var d = 1732584193, e = -271733879, f = -1732584194, g = 271733878, k = -1009589776, h = 0; h < c.length; h += 16) {
                        for (var l = d, m = e, n = f, p = g, q = k, j = 0; 80 > j; j++) {
                            a[j] = 16 > j ? c[h + j] : (a[j - 3] ^ a[j - 8] ^ a[j - 14] ^ a[j - 16]) << 1 | (a[j - 3] ^ a[j - 8] ^ a[j - 14] ^ a[j - 16]) >>> 31;
                            var r = b(b(d << 5 | d >>> 27, 20 > j ? e & f | ~e & g : 40 > j ? e ^ f ^ g : 60 > j ? e & f | e & g | f & g : e ^ f ^ g), b(b(k, a[j]), 20 > j ? 1518500249 : 40 > j ? 1859775393 : 60 > j ? -1894007588 : -899497514))
                              , k = g
                              , g = f
                              , f = e << 30 | e >>> 2
                              , e = d
                              , d = r
                        }
                        d = b(d, l);
                        e = b(e, m);
                        f = b(f, n);
                        g = b(g, p);
                        k = b(k, q)
                    }
                    c = [d, e, f, g, k];
                    a = "";
                    for (d = 0; d < 4 * c.length; d++)
                        a += "0123456789abcdef".charAt(c[d >> 2] >> 8 * (3 - d % 4) + 4 & 15) + "0123456789abcdef".charAt(c[d >> 2] >> 8 * (3 - d % 4) & 15);
                    return a
                }

    扣完代码,放入鬼鬼调试工具里面测试,和headers 请求的数据一模一样


    当然你可以用一些工具提供的sha1 现成函数就行。

    得到的加密数据也是一样的。

     


    至此 139邮箱的所有的登陆提交的加密数据都已经被解密了

     

    展开全文
  • APP逆向工具-js调试

    2021-04-09 16:17:20
    某赢时空APP 加密解密工具 WT-JS_DEBUDGE APP加密方法HOOK Xposed + inspeckage

    某赢时空APP


    • 加密解密工具
    • WT-JS_DEBUDGE
    • 鬼鬼js加密
    • 浏览器F12–source–snippets
      在这里插入图片描述

    • APP加密方法HOOK
    • Xposed + inspeckage
    • 安装xposed框架 和 inspeckage 模块后 都需要重启

    网页js加密处理

    • 根据抓包中的initiator找到js脚本
    • 关键字 找到加密位置
    • 下断点调试
    • 找到需要的js部分代码
    • js代码环境变量配置
    • Python调用代码
    import execjs
    # ... 是js代码省略
    a = '''
    ...
    function aa{
    	return 'hello'
    };
    '''
    def func(pwd):
    	# 加载js代码a
        js = execjs.compile(a)
        # 执行js函数aa,传入参数pwd
        b = js.call('aa', pwd)
        return b
    

    js页面遇到无限debugger

    参考链接

    • 在debugger代码部分,下断点处,选择add conditional breakpoint添加false

    frida+HTTPDecrypt

    WX XCX

    wxapp工具

    瑞数js文章

    文章1
    文章2

    展开全文
  • 今天下载了一款软件,软件名称是:鬼鬼JS调试工具7.5,运行的时候报以下错误信息。 很明显,这个报错信息是说软件需要一个dll库支持才能够正常运行。但是我下载的软件安装包里面就只有一个exe文件,最后在网上...
  • 萌新python爬虫初学

    2021-05-28 17:46:02
    2.Fiddler(抓包工具,初学不太会用到) 推荐下载地址:https://www.zdfans.com/search.asp?keyword=Fiddler 3.鬼鬼js调试工具(用于js逆向调试) 推荐下载地址:http://cr1a.197946.com/guiguijstiaoshi.zip 三:...
  • js调试工具

    2011-08-24 15:34:50
    可以在IE下调试js
  • python爬虫初步学习

    2021-11-07 13:35:54
    js代码3.访问链接,提取数据,下载文件总结 一、爬虫是什么? 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。...
  • http://www.cnblogs.com/sshoub/archive/2013/01/18/2866560.html
  • JS逆向 js 混淆 - 源码乱码

    千次阅读 2021-03-19 15:36:02
    练习 题目 图一 分析 右键检查,会debugger ... ...查看参数 ...m: 1692f18c681cbae905aec5e3c7d47c05丨1616239690经常爬虫的人会比较熟悉1616239690是一个时间戳 ...会不会是时间戳md5加密呢,打开鬼鬼JS调试工具
  • guiguijstiaoshi.zip

    2020-04-11 12:14:06
    鬼鬼JS调试工具是一款非常实用的JS调试软件,这里带给大家最新版本,新增了一些解密等功能,对于JS调试工作者或者感兴趣的朋友提供稳定和强大的调试支持
  • 最近比较闲,就去把猿人学官网打开看了一下,尝试着完成了第一道题目—JS混淆[源码乱码],当然我也去看了两位大佬的讲解,一位是吾爱论坛的漁滒,另一位是B站的暗螟蛉 由于这是一篇迟到的教程,所有我写比较详细,希望对...
  • JS逆向steam登录

    2021-04-22 10:43:40
    JS逆向steam登录 前言: 我们爬虫有时候,会遇到登录才能获取到数据的情况,最开始的时候我们只需要加入请求的data参数就可以,可是现在网站为了反爬,对登录的密码或者账号都做了加密处理,如果我们不破解出这些...
  • web开发常用工具

    2020-03-09 13:07:06
    (自己开发的针对phpstudy配置编辑的方便自己的工具,配合hosts修改,拥有本地个性域名) 宝塔 IDE及编辑器: Phpstorm Adobe Dreamweaver CC、ZendStudio、Microsoft VS Code(现在已经不用了) Notepad...

空空如也

空空如也

1 2 3
收藏数 57
精华内容 22
关键字:

鬼鬼js调试工具