今日份的网站
aHR0cDovL3d3dy5kZGt5LmNvbS9jb21tb2RpdHkuaHRtbD9kZGt5Y2FjaGU9YTdiMTllODc5ZDJmMmYyNzlkMzU2ZjVhZmE2ZDVjZmY=
这个网站的加密比较简单,是那种新手做过一遍就对 JS 逆向充满信心的小练手。
分析请求
先分析请求,看看需要的参数有没什么搞头【图1-1】
图1-1
比较明显的是 sign 其他的参数好像没有什么特别的地方。
先定位 sign 的位置【图1-2】
图1-2
直接搜索参数就看到结果了,点击搜索的结果文件在文件内再搜索一次,可以看到有 3 个结果。【图1-3】
图1-3
到这里就看到 sign 的加密了。
接下来继续分析逻辑,这里的 sign 值是 y,y的值是通过MD5(f)获取的,而f又是t.get("method") + p + r的结果,经过一通分析,可以的得到下面的逻辑:
var l = t.keys().sort(), p = \"\";l.length;for (var g in l) {var m = l[g];p += m + t.get(m)}sign = md5(t.get(\"method\") + p + r)
接下来只需要把我们不知道的值通过断点的方式调试出来,这个加密我们就完成解密了。
所以先给不知道的值打上断点,不清楚就打上断点不要怕麻烦,像【图1-4】这样。
图1-4
重新请求一下,就进入到我们打的断点里了,我们可以通过在 console 中打印变量的值来理解逻辑。【图1-5】
图1-5
明白需要的变量的值之后,我们就可以开始扣取 JS 或者用 Python 复写加密的逻辑了。
因为这次的加密比较简单,我们试试用 Python 复写一遍加密。(主要是 Python 的 md5 用起来蛮舒服的)
这里的逻辑比较简单没啥好分析的,我就直接上代码了。
import timefrom hashlib import md5def get_sign():timeStamp = time.time()localTime = time.localtime(timeStamp)strTime = time.strftime(\"%Y-%m-%d %H:%M:%S\", localTime)l = [\"method\", \"orderTypeId\", \"orgcode\", \"pageNo\", \"pageSize\", \"plat\", \"platform\", \"shopId\", \"t\", \"v\",\"versionName\"]t = {\'method\': \'ddsy.product.query.orgcode.product.list.b2c\',\'orderTypeId\': \'0\',\'orgcode\': \'010502,010503,010504,010505,010506,010507\',\'pageNo\': \'1\',\'pageSize\': \'100\',\'plat\': \'H5\',\'platform\': \'H5\',\'shopId\': \'-1\',# \'t\': \'2019-9-23 22:4:16\',\'t\': \'{}\'.format(strTime),\'v\': \'1.0\',\'versionName\': \'3.2.0\'}p = \'\'for i in range(0, 11):m = l[i]p += m + t.get(m)f = t[\'method\'] + p + \'6C57AB91A1308E26B797F4CD382AC79D\'print(f)sign = md5value(f).upper()print(sign)return signdef md5value(s):a = md5(s.encode()).hexdigest()return a
到这里其实就没有什么难度了,直接带入 sign 请求就完事了。
[图1-6]
图1-6
EOF