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,先搞清楚原理,

####

####

####

  

####

原文地址:https://www.cnblogs.com/andy0816/p/15087187.html