zoukankan      html  css  js  c++  java
  • js逆向6-jshook,js扣代码

    ###

    我发现一个事情,不管什么语言,代码的调用链,还有代码的作用域都是非常重要的内容,都需要好好的理解才行,包括js,还是python,

    ###

     hook就是重写的一个概念,

     ###

    ###

    可以使用func_bak  = func

    先把老的函数接收一下,然后再添加我们的逻辑,把原来的老的逻辑还是放进去,这样不影响老的逻辑

    有些时候,通过打印一个函数的toString,可能判断出来和原来的不一致,我们hook了之后会被识别出来,那么就修改他的原型链,然后伪装一下,让他识别不出来是被hook了,

    ####

    步骤

    1,赋值,

    2,重写

    3,修改原型链,伪装一下,否则可能会被检测到被hook了,

    ###

    举例:

    我们hook这个document.cookie,

    先赋值,

    再重写属性,

    然后加入我们的代码,然后回车,看到返回document的时候就证明,我们hook成功了,

    然后我们再去执行document.cookie就可以进入debug,我们就可以看到他是在哪里打印cookie的, 

    然后我们可以找堆栈,看哪里调用的这个函数,就找到了函数入口,

     这是一个最简单的hook,document.cookie 

    然后debug进来了之后,

    可以往上找堆栈,就可以看到哪里调用的这个document.cookie

    优化一下

     这样可以看到传进来的val,

     ####

    hook本身是一个非常高深的技术,

    案例;

    python-,第二题,第九题,

    ###

    ###

    ###

     对局部变量进行hook,

    hook的代码是很灵活的,

    但是要依赖对js代码的理解,对调用链的理解,你理解了,才可以写出hook,

    而且要对hook的原理也要非常知道才行,

    ####

    验证码的原理

    比如,返回一个图片,让你点击图片的字体的验证码

    原理

    1,首先服务器返回一个图片

    2,服务器怎么知道是返回给我们的是哪一个图片呢,需要在浏览器记录一个cookie,刷新验证码图片的时候,会把原来的cookie删除,新增一个,

    3,然后用户点击了图片中的字体,会发给服务器两个东西,一个是cookie,一个是字体在图片的坐标,然后服务器就会判断这个图片的坐标是否正确,然后返回结果,会把之前的cookie删除

    ####

    上面只是最简单的例子

    还有可能是什么,不是使用cookie,是使用的js,

    而且还可能对传值进行了加密传输,

    但是万变不离其宗,本质就是先下发验证码,和客户端建立联系,然后上传验证码的结果校验,然后返回结果,

    ####

    但是知道了验证码的逻辑之后,怎么破解呢?

    还是需要使用机器学习的方式建立模型,来破解这个验证码的问题,

    ####

     

    案例,python第二题,match第二题,

    python第二题

    扣代码

    第一步是需要找到函数入口,通过hook的方式,

     找堆栈,找到函数入口,

    第二步就是缺什么补什么,要深度优先,把入口的需要的变量函数都找到,补齐,要找到每一个代码的起始,

    把执行这一句的所有的变量函数都找到,

    比如你找到了变量,里面可能还有使用了其他的变量,函数,也都要抠出来,

    比如你找到了函数,你还要往函数里面去补环境,因为函数里面可能还有变量,函数都要抠出来,

    技巧1:可以pycharm里面通过运行的方式,看看是缺少什么,然后这样好补,因为缺少的话会报错的,比如变量 undefined,

    技巧2,如果碰到了btoa加密,可以使用nodejs的btoa,也就是window.btoa  = nodejs的btoa,

    技巧3,如果碰到md5加密,之类的,可以把整个的文件拿过来,放到我们的代码上面作为一个包使用,

    技巧4,你只要运行不报错了,说明你扣代码已经结束了,这个时候你打印你想要的内容,比如cookie,应该能得到结果了

    js补环境代码:

    function SDK_1() {
        window = this
    
        function md5_ii(a, b, c, d, x, s, t) {
            return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
        }
    
        function md5_hh(a, b, c, d, x, s, t) {
            return md5_cmn(b ^ c ^ d, a, b, x, s, t);
        }
    
        function md5_gg(a, b, c, d, x, s, t) {
            return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
        }
    
        function bit_rol(num, cnt) {
            return (num << cnt) | (num >>> (32 - cnt));
        }
    
        function safe_add(x, y) {
            var lsw = (x & 0xFFFF) + (y & 0xFFFF);
            var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
            return (msw << 16) | (lsw & 0xFFFF);
        }
    
        function md5_ff(a, b, c, d, x, s, t) {
            return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
        }
    
        function md5_cmn(q, a, b, x, s, t) {
            return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
        }
    
        function hex_md5(s) {
            return binl2hex(core_md5(str2binl(s), s.length * chrsz));
        }
    
        var chrsz = 8
        var b64pad = ""
    
        function str2binl(str) {
            var bin = Array();
            var mask = (1 << chrsz) - 1;
            for (var i = 0; i < str.length * chrsz; i += chrsz)
                bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (i % 32);
            return bin;
        }
    
        function core_md5(x, len) {
            /* append padding */
            x[len >> 5] |= 0x80 << ((len) % 32);
            x[(((len + 64) >>> 9) << 4) + 14] = len;
    
            var a = 1732584193;
            var b = -271733879;
            var c = -1732584194;
            var d = 271733878;
    
            for (var i = 0; i < x.length; i += 16) {
                var olda = a;
                var oldb = b;
                var oldc = c;
                var oldd = d;
    
                a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
                d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
                c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
                b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
                a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
                d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
                c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
                b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
                a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
                d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
                c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
                b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
                a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
                d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
                c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
                b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
    
                a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
                d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
                c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
                b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
                a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
                d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
                c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
                b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
                a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
                d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
                c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
                b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
                a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
                d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
                c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
                b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
    
                a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
                d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
                c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
                b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
                a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
                d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
                c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
                b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
                a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
                d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
                c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
                b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
                a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
                d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
                c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
                b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
    
                a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
                d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
                c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
                b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
                a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
                d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
                c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
                b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
                a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
                d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
                c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
                b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
                a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
                d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
                c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
                b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
    
                a = safe_add(a, olda);
                b = safe_add(b, oldb);
                c = safe_add(c, oldc);
                d = safe_add(d, oldd);
            }
            return Array(a, b, c, d);
    
        }
    
        var hexcase = 0
    
        function binl2hex(binarray) {
            var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
            var str = "";
            for (var i = 0; i < binarray.length * 4; i++) {
                str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF) +
                    hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8)) & 0xF);
            }
            return str;
        }
    
        var _$oa = [
            "WFpLV0k=",
            "Y29pRlM=",
            "YXpEbnE=",
            "OyBwYXRoPS8=",
            "RER6V2o=",
            "cGZkekg=",
            "Z2dlcg==",
            "WEpaVEs=",
            "aW5pdA==",
            "VXdNUUw=",
            "bVVvd0U=",
            "amtsS3A=",
            "Y2hhaW4=",
            "TEFDT0Y=",
            "cm91bmQ=",
            "SGRETEU=",
            "VGpsR04=",
            "TUtHaFk=",
            "TlNsalk=",
            "S2h5YUc=",
            "ZGVidQ==",
            "d25MZ3A=",
            "bHFvT0M=",
            "c2lnbj0=",
            "V3pZd3A=",
            "Y1JFV3Q=",
            "dXdQYUs=",
            "T1RFR2M=",
            "T1hMZ04=",
            "TndnQlc=",
            "SHNRVGQ=",
            "dXRmc3o=",
            "Y291bnRlcg==",
            "UHVLTlI=",
            "R29IeVM=",
            "TU9QeWY=",
            "bG9n",
            "d01oYVU=",
            "aUh5RWQ=",
            "cmVsb2Fk",
            "a1lucGw=",
            "bG92WVk=",
            "Uk1CdVo=",
            "bmdtb3k=",
            "TWhZd2g=",
            "dGVzdA==",
            "b1pjVXI=",
            "WU54dEQ=",
            "aGxoVEE=",
            "cXNSZnY=",
            "XCtcKyAqKD86W2EtekEtWl8kXVswLTlhLXpBLVpfJF0qKQ==",
            "bVJZSWc=",
            "ZnVuY3Rpb24gKlwoICpcKQ==",
            "dVZ3emc=",
            "T0VIZHo=",
            "c3RhdGVPYmplY3Q=",
            "Y2JyRFU=",
            "bGVuZ3Ro",
            "dGJ1elA=",
            "a1p6dXQ=",
            "YXBwbHk=",
            "aW5wdXQ=",
            "S05zbWI=",
            "TEFkVmE=",
            "ZGhvTUg=",
            "Q21BbUQ=",
            "SmlmQ0o=",
            "c3RyaW5n",
            "YWN0aW9u",
            "U05nV3E=",
            "Y29va2ll",
            "Y29uc3RydWN0b3I=",
            "SXlMaWE=",
            "d2hpbGUgKHRydWUpIHt9",
            "aktGdkU=",
            "dXpiVXg=",
            "YUlLVnk=",
            "5q2k572R6aG15Y+X44CQ54ix6ZSt5LqR55u+IFYxLjAg5Yqo5oCB54mI44CR5L+d5oqk",
            "amxnWlU=",
            "SFF6RmY=",
            "U0FYVGc=",
            "RGR2Wnk=",
            "dmFsdWVPZg==",
            "VmNoR2U=",
            "ckdSaEc="
        ]
    
        var _$ob = function (a, b) {
            a = a - 0x0;
            var c = _$oa[a];
            if (_$ob['fVeoOz'] === undefined) {
                (function () {
                    var f;
                    try {
                        var h = Function('returnx20(function()x20' + '{}.constructor(x22returnx20thisx22)(x20)' + ');');
                        f = h();
                    } catch (i) {
                        f = window;
                    }
                    var g = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
                    f['atob'] || (f['atob'] = function (j) {
                            var k = String(j)['replace'](/=+$/, '');
                            var l = '';
                            for (var m = 0x0, n, o, p = 0x0; o = k['charAt'](p++); ~o && (n = m % 0x4 ? n * 0x40 + o : o,
                            m++ % 0x4) ? l += String['fromCharCode'](0xff & n >> (-0x2 * m & 0x6)) : 0x0) {
                                o = g['indexOf'](o);
                            }
                            return l;
                        }
                    );
                }());
                _$ob['rYGugk'] = function (e) {
                    var f = atob(e);
                    var g = [];
                    for (var h = 0x0, j = f['length']; h < j; h++) {
                        g += '%' + ('00' + f['charCodeAt'](h)['toString'](0x10))['slice'](-0x2);
                    }
                    return decodeURIComponent(g);
                }
                ;
                _$ob['okJzdh'] = {};
                _$ob['fVeoOz'] = !![];
            }
            var d = _$ob['okJzdh'][a];
            if (d === undefined) {
                c = _$ob['rYGugk'](c);
                _$ob['okJzdh'][a] = c;
            } else {
                c = d;
            }
            return c;
        };
        var a = {
            'uzbUx': function (d, e) {
                return d + e;
            },
            'yTrWo': _$ob('0x14'),
            'RZoQG': _$ob('0x6'),
            'HQzFf': _$ob('0x37'),
            'IJeEt': function (d, e) {
                return d !== e;
            },
            'mRYIg': _$ob('0x4e'),
            'dhoMH': _$ob('0x34'),
            'oZcUr': _$ob('0x32'),
            'pfdzH': function (d, e) {
                return d(e);
            },
            'PuKNR': _$ob('0x8'),
            'hfxlo': _$ob('0xc'),
            'DdvZy': function (d, e) {
                return d + e;
            },
            'baKIo': _$ob('0x3d'),
            'mUowE': function (d, e) {
                return d !== e;
            },
            'YNxtD': 'RcOux',
            'FFiEx': function (d) {
                return d();
            },
            'NwgBW': 'whilex20(true)x20{}',
            'kZzut': 'counter',
            'QHHVn': function (d, e, f) {
                return d(e, f);
            },
            'xvdvK': _$ob('0x4d'),
            'jKFvE': 'aiding_win',
            'JifCJ': function (d, e) {
                return d(e);
            },
            'MhYwh': function (d, e) {
                return d(e);
            },
            'aIKVy': function (d, e) {
                return d + e;
            },
            'azDnq': function (d, e) {
                return d(e);
            },
            'WzYwp': function (d, e) {
                return d / e;
            },
            'ngmoy': function (d, e) {
                return d + e;
            },
            'ASPPX': function (d, e) {
                return d + e;
            },
            'DDzWj': _$ob('0x17'),
            'knFPT': function (d, e) {
                return d / e;
            },
            'ZIATq': _$ob('0x3')
        };
    
        var c = new Date()[_$ob('0x52')]();
        // var c = '1587102734000';
        // console.log(c)
    
        window.btoa = require('btoa')
        var token = window['btoa'](a[_$ob('0x51')](a[_$ob('0x4a')], a[_$ob('0x42')](String, c)));
    
    
        var md = a[_$ob('0x2c')](hex_md5, window['btoa'](a['aIKVy'](a[_$ob('0x4a')], a[_$ob('0x2')](String, Math[_$ob('0xe')](a[_$ob('0x18')](c, 0x3e8))))));
    
        var cookie = a[_$ob('0x4c')](a[_$ob('0x4c')](a[_$ob('0x4c')](a[_$ob('0x2b')](a[_$ob('0x2b')](a['ASPPX'](a[_$ob('0x4')], Math[_$ob('0xe')](a['knFPT'](c, 0x3e8))), '~'), token), '|'), md), a['ZIATq']);
        // console.log(cookie)
        return cookie
    }
    
    console.log(SDK_1())

    第三步,补完了之后,封装一下,然后供python调用,使用execjs,这个库,编译执行js脚本,获取到我们想要的内容,就可以进行下一步了,

    首先你可以把扣代码变成一个文件,文件末尾返回return一个你想要的值,

    python代码

    import requests
    import execjs
    
    with open('sdk.js','r',encoding='utf-8') as f:
            js_text=f.read()
            # print(js_text)
            compile= execjs.compile(js_text)
            cookie=compile.call("SDK_1").split(';')[0].replace('sign=','')
            print(cookie)
            cookies = {
                # 'Hm_lvt_337e99a01a907a08d00bed4a1a52e35d': '1615456972',
                # 'no-alert': 'true',
                'sessionid': '47wd3fm32bz79kezyq1t7dqqzdoahq0v',
                # 'Hm_lpvt_337e99a01a907a08d00bed4a1a52e35d': '1615513367',
                'sign': cookie
            }
    
            headers = {
                'Connection': 'keep-alive',
                'Pragma': 'no-cache',
                'Cache-Control': 'no-cache',
                'Upgrade-Insecure-Requests': '1',
                'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36',
                'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
                'Referer': 'http://www.python-spider.com/challenge/2',
                'Accept-Language': 'zh-CN,zh;q=0.9',
            }
    
            response = requests.get('http://www.python-spider.com/challenge/2', headers=headers, cookies=cookies, verify=False)
            print(response.text)

    ###

    match第二题

    这道题是一道假动态的cookie。每次运行时,会加载不同的cookie生成方式,但是最后生成的算法一样的,所以我们只需要扣出一套代码来即可通用

    第一步,通过hook找函数入口,先用hook cookie的代码找到生成cookie的代码,

    第二步,还是扣代码,缺什么补什么,

    这个时候你可能运行的时候,发现运行的时候卡死了,这样你就进行不下去了,怎么办?

    说明你进入了一个死循环了,会导致你的内存飙升,导致内存爆炸,你的浏览器就崩溃了,要找到是哪里导致的,

    一般是两个原因,一个是浏览器指纹,一个是格式化校验,

    怎么判断是否是浏览器指纹?

    现在我们复制这些代码放到浏览器下面的控制台输出。来观察是否是浏览器检测

    如果正常没有卡死,说明是浏览器检测,如果还是卡死了,说明是格式化检测

    我们发现回车之后再次进行回车,已经没有反应,说明肯定是格式化检测了,

    怎么判断是格式化校验呢?

    笨方法就是一步一步的debug,看哪里的问题,

    搞js逆向是一个非常需要耐心的活,很墨迹,

    这个硬扣代码就是比较繁琐,而且还考验你对js的理解,

    这个第二题,有更好的方法,不需要硬扣,硬扣这应该是一个高级别的题目,扣代码很困难,

    ###

    中等难度的js混淆,ob混淆,只要是有耐心,扣代码就能抠出来,

    怎么提升js逆向的技术?听课只能给你提供一个思路,要想提高js逆向的能力,只能是实践,这是一个完全绝对的经验性的东西,

    不要上来就扣,你要知道这个是一个动态js,先搞清楚原理,

    ####

    ####

    ####

      

    ####

  • 相关阅读:
    获取时间对象
    定时器
    undefined与return
    获取设置非行间样式
    NaN
    return,break与continue的区别
    数据类型
    程序的机器级表示
    计算机内数字的表示
    计算机系统漫游
  • 原文地址:https://www.cnblogs.com/andy0816/p/15087187.html
Copyright © 2011-2022 走看看