分享一个油猴hook脚本 开源软件 Web逆向 原创

非易 9月前 6938


在看蔡老板的文章时发现油猴hook脚本可以像数组一样遍历函数名,虽然有点碰运气但还是可以尝试。


笔记一: 蔡老板的入口文章系列 其中一个需要自己完成的hook脚本。

// ==UserScript==
// @name         HOOK 遍历
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  day day up!
// @author       FY
// @include      *
// @grant        none
// @run-at       document-end
// ==/UserScript==
(function() {
    'use strict';
    !function () {
        'use strict';
        var source = ['alert','decodeData','String.fromCharCode','fromCharCode','base64decode','md5','decode','btoa','JSON.stringify','MD5','RSA','AES','CryptoJS','encrypt','strdecode',"encode",'decodeURIComponent','_t'];
        console.log("开始测试是否有解密函数");
        let realCtx, realName;
        function getRealCtx(ctx, funcName) {
            let parts = funcName.split(".");
            let realCtx = ctx;
            for(let i = 0; i < parts.length - 1; i++) {
                realCtx = realCtx[parts[i]];
            }
            return realCtx;
        }
        function getRealName(funcName) {
            let parts = funcName.split(".");
            return parts[parts.length - 1];
        }
        function test(ctx) {
            for(let i = 0; i < source.length; i++) {
                let f = source[i];
                let realCtx = getRealCtx(ctx, f);
                let realName = getRealName(f);
                let chars = realCtx[realName];
                if (chars != undefined){
                    console.log("发现可疑函数:", f);
                    console.log(chars);
                    console.log("---------------------");
                }else{
                    console.log("未发现:", f);
                }
            }
        }
        test(window);
    }();
})();

开启脚本后找一个网站测试,打开控制台刷新网页后打印如下内容。

我们可以看到,脚本检测出了许多疑似加密函数的内容,我们可以把之前遇到过的类似的需要解密的函数写进一个数组里,然后依次查询是否有这样的函数



笔记二:上一个脚本只是检测是否有加密函数,接下来完善一下,打印出加密函数的返回值,也就是直接hook到结果。

// ==UserScript==
// @name         HOOK ALL end
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  day day up!
// @author       FY
// @include      *
// @grant        none
// @run-at       document-end
// ==/UserScript==
(function() {
    'use strict';
    var source = ['alert','decodeData','String.fromCharCode','fromCharCode','base64decode','md5','decode','btoa','JSON.stringify','MD5','RSA','AES','CryptoJS','encrypt','strdecode',"encode",'decodeURIComponent','_t'];
    console.log("开始测试是否有解密函数");
    let realCtx, realName;
    function getRealCtx(ctx, funcName) {
        let parts = funcName.split(".");
        let realCtx = ctx;
        for(let i = 0; i < parts.length - 1; i++) {
            realCtx = realCtx[parts[i]];
        }
        return realCtx;
    }
    function getRealName(funcName) {
        let parts = funcName.split(".");
        return parts[parts.length - 1];
    }
    function hook(ctx, funcName, level, originFunc) {
        ctx[funcName] = function(a){
            console.log("level:" + level + " function:" + funcName,a);
            debugger;
            console.log(originFunc.toString());
            console.log(originFunc.toString);
            return originFunc(a);
        };
    }
    function test(ctx, level) {
        for(let i = 0; i < source.length; i++) {
            let f = source[i];
            let realCtx = getRealCtx(ctx, f);
            let realName = getRealName(f);
            let chars = realCtx[realName];
            hook(realCtx, realName, level, chars);
        }
    }
    test(window, 1);
})();

也是循环遍历 然后打印出函数的定义和返回值。



笔记三 : 需要更直观的看出加密函数内部调用的函数名。

// ==UserScript==
// @name         HOOK 二层函数名 end
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  day day up!
// @author       You
// @include      *
// @grant        none
// @run-at       document-end
// ==/UserScript==
(function() {
    'use strict';
    var source = ['alert','decodeData','String.fromCharCode','fromCharCode','base64decode','md5','decode','btoa','JSON.stringify','MD5','RSA','AES','CryptoJS','encrypt','strdecode',"encode",'decodeURIComponent','_t'];
    console.log("开始测试是否有解密函数");
    let realCtx, realName;
    function getRealCtx(ctx, funcName) {
        let parts = funcName.split(".");
        let realCtx = ctx;
        for(let i = 0; i < parts.length - 1; i++) {
            realCtx = realCtx[parts[i]];
        }
        return realCtx;
    }
    function getRealName(funcName) {
        let parts = funcName.split(".");
        return parts[parts.length - 1];
    }
    function hook(ctx, funcName, level, originFunc) {
        ctx[funcName] = function(a){
            console.log("level:" + level + " function:" + funcName,a);
            let regexp = / [\S]*\(.*\)\;/g;
            let match = originFunc.toString().match(regexp)
            console.log(match);
            debugger;
            return originFunc(a);
        };
    }
    function test(ctx, level) {
        for(let i = 0; i < source.length; i++) {
            let f = source[i];
            let realCtx = getRealCtx(ctx, f);
            let realName = getRealName(f);
            let chars = realCtx[realName];
            hook(realCtx, realName, level, chars);
        }
    }
    test(window, 1);
})();

可以看出就是多写了一个正则,匹配出加密函数内部调用的函数名。

好了分享完毕,第一次写,有什么不对的请指正。




最新回复 (30)
  • rezalt 2月前
    0 31
    真的牛皮  爱了爱了
  • buchiyu 2月前
    0 30
    优秀
  • juzhijie 2月前
    0 29
    1
  • nanxun 2月前
    0 28
    jdf000 1.如果要hook消息摘要算法,数组source里应该写成CryptoJS.MD5,CryptoJS.SHA1这样吧,但是这样前提是网站用了CryptoJs,不然会报错;楼主写的应该只能hook到直接 ...
    能否问下如何可以hook到所有函数
  • jdf000 3月前
    1 27
    1.如果要hook消息摘要算法,数组source里应该写成CryptoJS.MD5,CryptoJS.SHA1这样吧,但是这样前提是网站用了CryptoJs,不然会报错;楼主写的应该只能hook到直接绑定到window上的消息算法;
    2.另外数组成员也写了CryptoJS,按楼主写的就是hook window.CryptoJS()这个方法了,而实际加密都是这样的形式:CryptoJS.MD5, CryptoJS.SHA1,所以应该是hook不到这个加密库的,本人也实测了一下,个人愚见,欢迎交流
  • linupy 3月前
    0 26
    牛批
  • 0 25
    叼叼叼
  • Voccoo 4月前
    0 24
    牛批
  • BUGG 5月前
    0 23
    6666666666666
  • 0 22
    niup
  • 七仔 7月前
    0 21
    很优秀
  • 0 20
    牛逼牛逼
  • zjw 7月前
    0 19
    秀的一批
  • 0 18
    u秀
  • wistn 8月前
    0 17
    优秀
  • hankleo 8月前
    0 16
    优秀
  • 0 15
    很优秀,收藏了先~
  • 0 14
    真优秀!!!
  • 0 13
    牛逼
  • 0 12
    这个就秀了..
  • 0 11
    优秀
  • FMSW 9月前
    0 10
    66
  • 幽灵 9月前
    0 9
    这只能是卓越了
  • 0 8
    优秀
  • admin1 9月前
    0 7
    牛皮
  • thunder 9月前
    0 6
    牛皮
  • admin 9月前
    0 5
    牛批
  • YDXX丶 9月前
    0 4
    牛批
  • 1 3
    牛批
  • franky 9月前
    1 2
    优秀
返回