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