JS逆向-抠代码的第三天【手把手学会抠代码】
今天的目标,X狐TV网站登录参数解析:网址:https://tv.sohu.com/
首先是老规矩,先清空浏览器缓存、打开网页,打开开发者工具,准备抓包。输入用户名15100000000,密码a123456789,点击登录。所有数据包情况如下:
老规矩,对产生的数据包进行查看,由于登录,应该是post请求,数据包名没有见名之意的login字样数据包(差评),对此,需要挨个将数据包点击一遍查看提交方式是否为post方式,并查看提交参数是否提交了用户名和密码。经查找,发现107405数据包就是唯一的post请求数据包,也提交了用户名密码等参数,那么这个就是我们要找的目标。接下来,对数据包进行初步解析:观察headers和FormData,我们发现在content提交是表单提交,同时headers中sec-ch-ua、sec-ch-ua-mobile、sec-fetch-dest、sec-fetch-mode、sec-fetch-site、sec-fetch--user、upgrade-insecure-requests这几个参数是不常见的参数,因此需要多次抓包确定该值是否变动,是否有需要解析的数据。同时,FormData里面的password是被加密了,userid是明文,其他三个参数暂且保留,接下来多次抓包,发现所有参数都一样,连password的加密数据都一样!结合其密文格式,有理由怀疑这里是md5数据,胆子大的可以直接去md5试一下密码(你会发现,你完事儿了,当然,我们今天是抠代码。所以假装没看出来 -。-!)由于这个数据包又双叒叕是个文件提交,依然没办法跟小肩膀老师那样直接从数据链跳转过去,那么我们继续全局搜索其数据。
出来不少数据,其中login文件的可疑度比较高,但进去查看后,没有发现处理密码的地方,于是我们重新怀疑其passport这个文件,进去后格式化文件重新查看,发现args.pamars.password = utils.md5(args.pamars.password)这个内容,根据我们有限制的知识分析,这是对args.pamars.password数值进MD5处理,而且出现了好几次,不过每个代码之前都有名称,我们对照百度可以简单解析下这些变量名的意思:
这样一样来,我们把断点搭载login代码块里面,然后点击登录,很顺利得到如下图结果:
这个utils.md5()的结果就是我们需要的加密数据,从md5这个函数处跳进去,会发现,utils是个对象,md5是其中一个方法,OK,取出来!
接下来,打开鬼鬼JS调试工具,新建一个函数,将密码加密这一样放进去,用pwd变量接受,并返回出来,再将md5方法全部复制进去来。根据我们的分析,md5方法是直接作用在密码上,所以utils其他方法并没有动作,所以在密码加密这里,我们将utils去掉,然后将md5复制过来后做如下改写:
原代码:
==============》
加载代码,没问题,运行后报错!提示 args is not defined,原来我们在网页中直接复制的加密行出了问题,经检查,args.params.password就是我们输入的密码,就是我们自定义函数的参数,直接整体改成参数名就好,在进行运行发现返回结果跟我们数据包内加密一模一样,至此,该数据解析完毕!
然后就是老套路的Python调用出结果了。
注意:
本代码仅针对一个加密参数做出逆向,如果需要调用,请根据情况选用。
具体代码如下PY文件、JS文件未作特别说明(这项目简单)
Python代码部分如下:
1 import execjs 2 3 def read_js(file): 4 with open(file, 'r', encoding='utf8') as f: 5 js_data = f.read() 6 return js_data 7 8 9 if __name__ == '__main__': 10 js_str = read_js('sohu.js') # 读取JS文件 11 js_o = execjs.compile(js_str) # 用execjs方法加载js文件 12 _pwd = js_o.call('test', 'a123456789') 13 print(_pwd) 14 15 16 ######################### 17 # 你如果直接看出来结果,可以如下操作 18 import hashlib # 导入库 19 20 pwd = hashlib.md5('a123456789'.encode('utf8')) # 字符串要变成二进制 21 print(pwd.hexdigest()) # 这是加密显示方法
以下是JS代码(长,已折叠)
1 function md5(args) { 2 function hex_md5(s) { 3 return binl2hex(core_md5(str2binl(s), s.length * chrsz)) 4 } 5 function core_md5(x, len) { 6 x[len >> 5] |= 128 << len % 32, 7 x[14 + (len + 64 >>> 9 << 4)] = len; 8 for (var a = 1732584193, 9 b = -271733879, 10 c = -1732584194, 11 d = 271733878, 12 i = 0; i < x.length; i += 16) { 13 var olda = a, 14 oldb = b, 15 oldc = c, 16 oldd = d; 17 a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936), 18 d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586), 19 c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819), 20 b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330), 21 a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897), 22 d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426), 23 c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341), 24 b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983), 25 a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416), 26 d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417), 27 c = md5_ff(c, d, a, b, x[i + 10], 17, -42063), 28 b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162), 29 a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682), 30 d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101), 31 c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290), 32 b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329), 33 a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510), 34 d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632), 35 c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713), 36 b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302), 37 a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691), 38 d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083), 39 c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335), 40 b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848), 41 a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438), 42 d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690), 43 c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961), 44 b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501), 45 a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467), 46 d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784), 47 c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473), 48 b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734), 49 a = md5_hh(a, b, c, d, x[i + 5], 4, -378558), 50 d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463), 51 c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562), 52 b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556), 53 a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060), 54 d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353), 55 c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632), 56 b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640), 57 a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174), 58 d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222), 59 c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979), 60 b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189), 61 a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487), 62 d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835), 63 c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520), 64 b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651), 65 a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844), 66 d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415), 67 c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905), 68 b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055), 69 a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571), 70 d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606), 71 c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523), 72 b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799), 73 a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359), 74 d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744), 75 c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380), 76 b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649), 77 a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070), 78 d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379), 79 c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259), 80 b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551), 81 a = safe_add(a, olda), 82 b = safe_add(b, oldb), 83 c = safe_add(c, oldc), 84 d = safe_add(d, oldd) 85 } 86 return Array(a, b, c, d) 87 } 88 function md5_cmn(q, a, b, x, s, t) { 89 return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b) 90 } 91 function md5_ff(a, b, c, d, x, s, t) { 92 return md5_cmn(b & c | ~b & d, a, b, x, s, t) 93 } 94 function md5_gg(a, b, c, d, x, s, t) { 95 return md5_cmn(b & d | c & ~d, a, b, x, s, t) 96 } 97 function md5_hh(a, b, c, d, x, s, t) { 98 return md5_cmn(b ^ c ^ d, a, b, x, s, t) 99 } 100 function md5_ii(a, b, c, d, x, s, t) { 101 return md5_cmn(c ^ (b | ~d), a, b, x, s, t) 102 } 103 function safe_add(x, y) { 104 var lsw = (65535 & x) + (65535 & y); 105 return (x >> 16) + (y >> 16) + (lsw >> 16) << 16 | 65535 & lsw 106 } 107 function bit_rol(num, cnt) { 108 return num << cnt | num >>> 32 - cnt 109 } 110 function str2binl(str) { 111 for (var bin = Array(), mask = (1 << chrsz) - 1, i = 0; i < str.length * chrsz; i += chrsz) bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << i % 32; 112 return bin 113 } 114 function binl2hex(binarray) { 115 for (var hex_tab = hexcase ? "0123456789ABCDEF": "0123456789abcdef", str = "", i = 0; i < 4 * binarray.length; i++) str += hex_tab.charAt(binarray[i >> 2] >> i % 4 * 8 + 4 & 15) + hex_tab.charAt(binarray[i >> 2] >> i % 4 * 8 & 15); 116 return str 117 } 118 var hexcase = 0, 119 chrsz = 8; 120 return hex_md5(args) 121 } 122 123 function test(password) { 124 125 var pwd = md5(password); 126 127 return pwd; 128 }