js 减去字符串_js逆向 | 某麦数据analysis加密逻辑分析(最新)

     遇一人,山水有逢,念一人,风过轻澜;执一人,潋水之滨,终一人,悱恻至生。

12d2df935f5d8ec9031fb608eb4ff14a.png

1、前言

一、目标网站
aHR0cHM6Ly93d3cucWltYWkuY24vcmFuaw==。
定时采集每日榜单信息 二、加密逻辑 简单概括下加密逻辑,结合下面的详细分析,可以很好的读懂文章。

第一,使用拦截器,拦截请求url和请求携带的参数

第二,对参数进行排序并使用base64加密

第三,拼接加密后的参数、url、以及其他字符串,经过js加密后继续base64加密生成analysis。

2、定位拦截器

接口分析直接忽略了,很简单,刷新页面即可以见到。

截个图说明下需要分析的加密参数即为analysis。

a27f7fa49f1f492dc5bd024063345d4c.png

根据以往的经验,直接搜索analysis,进入到js文件内部,找寻可疑位置断点。但是在这里貌似行不通,自己可以私下尝试找一下。 这里直接通过查看调用栈,寻找加密位置。这也是js逆向的一个重要手段,必须要学会的技能之一。 如下图所示,点击左侧的+号,添加截取的部分url路径(红框截图),然后刷新页面。

e94fc35d9d4d5dda13adaf4acf01e0db.png

接着发现代码断在了send处,而左侧箭头所示方向,即为调用关系。 下图中我已经用数字标记,调用关系为2调用1,3调用2,依此类推。所以在逆向查找时,要从上向下依次查找,认真观察参数变化。

6dafab1c0d6b766bad526fb13e0a2130.png

点击2,3位置可以看到加密参数已生成,理论上已经生成的位置js代码也不用继续查看,截图也省略。 继续查看4,5位置,发现无法查看参数变化,果断开始下断点调试,不放过任何一个机会。 先取消之前在xhr部分的断点,然后再刷新页面。断在下图所示位置,逐个查找变量发现没有可疑之处,继续进入return函数内部 。

93ae31589fae957d687a0f0bd2aed8c1.png

一步步向下调试,调试到下图for循环位置,发现了拦截器interceptors.request。观察 参数e的值,可以确定参数消失的位置就在这里,原来是被拦截了 。

0829c00fe011cd6d4299544355e635e0.png

接着进入拦截器代码内部,方法如下。

24e8db8d2ad96a2fba4d5a950b3dd919.png

3、加密逻辑分析

观察加密js代码,分别在下图红点位置设置断点。

由于页面接口参数全部要经过拦截器加密,所以在继续向下调试前,要优先把入参n的url调试到与接口url一致,不然就没办法继续向下分析了。

继续向下进入到return中,单步调试,观察变化,调试到第一次s生成的位置暂停。

a91aee0ad77b6d2ec5ec7b1036ca7e60.png

如下图所示,全选后可以看到s的值,分别查看AF=sort,jl=join,l='',很明显,逻辑就是对传递进来的参数进行sort排序,然后拼接。

f6301fa2a379da06378fa1b40449a21f.png

继续向下调试,整体选中后出现了调用方法S(n),参数n就是s的值。

e64e878538536c2c35424c60e144cf67.png

到这里,就不继续进入到S(n)内部查看了,本身的加密方式是对第一次生成的s进行base64加密。 有兴趣的可以进入到代码内部查看下,这里直接贴上两张js代码的截图。

6b062319ca1394483e513c69cc192455.png

14790add794e4b6fff535a79ee4f72a0.png

既然说是base64加密,那么取s的值测试一下。

21e9fa798d9ee52147d3b1370acacf8f.png

结果如下,完全一致。

a79ee46ca902eeca7286338e11c36416.png

继续向下分析,如下图,s经过多次赋值后,作为参数传递,生成了i,而i就是要找的analysis。

查看s的生成逻辑,鼠标移动到每个变量上查看对应值,n[ka][Ip](n[Grn], l)的结果为url路径,z的值是@#,f值是1,r的值为一串数字,s的值如下图由字符串拼接而成,L经过多次调试,发现也为固定值。

af392cebdaa0cc81e5759e247a3af166.png

向上查看r生成的位置,如下图,计算逻辑很明显,new t[R]的值为当前时间戳,减去555,继续减去一个固定值。

e11f8aacb4f957bb1ca5665487b06ae9.png

参数部分寻找完毕!

接着看一下,生成i时,涉及了哪些方法?

图一,外层调用S(n),上面已经分析过了,使用的是base64加密

图二,内部调用j(t, n),参数t,n的值分别为s, L。

1db260b9db33fb4fa88211d7e5286b0e.png

72cbebb66d54382ed0ff56ec217aee83.png

接着分析j(t, n),代码如下,看起来很绕,果断用执行js来实现。查看参数并在原代码基础上,替换已知参数。

842dd4643524e241721cf10670d62b70.png

修改后的j函数如下

function j(t, n) {        n || (n = d()),        t = t.split("");        for (var a = t.length, e = n.length, r = "charCodeAt", i = 0; i < a; i++)          t[i] = u(t[i][r](0) ^ n[(i + 10) % e][r](0));        return t.join("")      }
而修改后的代码,需要补全d(),u(n)两个函数。 d()原代码如下图

6da3a25f104cce63f70572c4a65ad9d9.png

修改后如下
function d() {        return unescape("861831832863830866861836861862839831831839862863839830865834861863837837830830837839836861835833".replace(/8/g, "%u00"))      }
u(n)原代码如下图

5a8bdf233e842baa7d8773314f172c3e.png

修改后如下
function u(n) {        var t = "fromCharCode"        return String[t](n)      }

代码的修改只是更换了另一种写法,替换了已知的值,修改后的js可以不一样,但必须保证测试通过。

接着开始测试j(t, n)

网页中生成的结果如下图

88605ed392159a3096d3a1e6d2178774.png

本地js代码执行结果如下,完全一致,代码改写正确。

696662008095e96f0f304f0da3896edf.png

ok,到这里分析完毕。

其实base64加密部分js代码也是可以扣出来的,有兴趣的可以试一下,不是很难。

4、代码展示

分析了这么多,其实加密部分实现起来也就那么几行代码,如下图所示。 37af691de828e8df1b30fa4dc9b08bd2.png 代 码只作为参考,这里只随意拿取了一类url和一个固定params,返回的analysis已测试过可以获取到响应信息。 实际运行代码时,要动态修改url和params的值。另外 分析逻辑或者js调试如果有不懂得,可以私信我!

对你有帮助,请扫码关注!感谢!

187daaec089e6ca07bf8ad1c0d164e93.png

公众号:逆向旅行

微信号:fzcoder888888

定期分享Python进阶技术,爬虫

str4表示client_ver

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值