• 周六. 4月 20th, 2024

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

js逆向6-jshook,js扣代码

admin

11月 28, 2021

###

我发现一个事情,不管什么语言,代码的调用链,还有代码的作用域都是非常重要的内容,都需要好好的理解才行,包括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,先搞清楚原理,

####

####

####

  

####

《js逆向6-jshook,js扣代码》有2个想法
  1. Comment récupérer les SMS supprimés sur mobile? Il n’y a pas de corbeille pour les messages texte, alors comment restaurer les messages texte après les avoir supprimés?

  2. Le logiciel de surveillance de téléphone portable CellSpy est un outil très sûr et complet, c’est le meilleur choix pour une surveillance efficace des téléphones mobiles. L’application peut surveiller divers types de messages, tels que les SMS, les e-mails et les applications de chat de messagerie instantanée telles que Snapchat, Facebook, Viber et Skype. Vous pouvez afficher tout le contenu de l’appareil cible: localisation GPS, photos, vidéos et historique de navigation, saisie au clavier, etc.

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注