douyin web a_bogus

  • 声明:文章内容仅供学习参考,严禁用于商业用途,否则由此产生一切后果与作者无关,如有侵权请联系作者进行删除。

  • 本文只是我简要的分析过程,以及一些重要点的记录,不涉及核心算法

该水一下自己的第二篇文章了。该网站的日志打印的挺让人头疼的,log日志断点加载也挺慢的,有时候还会导致浏览器崩溃啥的,我这边使用了override做了一个本地替换js,具体咋操作的可以自行百度操作。话不多说直接上日志分析。

这边只是简要记录一下我的分析流程,以防万一下次自己在分析的时候又要从头开始,具体实现相信对各位大佬来说不难吧。

逆推的时候发现ab是由这两个乱码相加,然后通过s4的码表得来的

第一个乱码蛮好弄的,它是由 三个 0-1之间的随机数,经过一系列位运算后得到的数组然后进行String.fromCharCode,最后相加得来的,根据上面打印的日志挨个分析就出来咯。

我们的重点是第二个乱码,第二个数组向上逆推一步发现是由 y 和 一串乱码两个参数得到的,我们可以根据断点的时机断进去查看是如何生成的。

它是由y的ascii码数121 和一个0-255的一个256位的数组进行一系列位运算操作后得到的一个全新的数组(留意一下 >256 后的处理),然后又是一顿稀奇古怪的操作。

稀奇古怪在对数组的取值和修改,然后将得到的数 和第二个参数的charCodeAt 做^运算,最后取它的 fromCharCode。

在逆推往上面看就是一个长数组得到的这个第二个参数了,至于是怎么得到的,依然是 fromCharCode。

我个人觉得重点就是这个大数组的生成了,我个人感觉还是蛮复杂的。

这里我有点脑袋缺根筋了,分析日志的时候没有接触过sm3算法,我跟进去分析了好久,后面百度了一下 [1937774191,1226093241,388252375,3666478592,2842636476,372324522,3817729613,2969243214]这个数组才发现原来是sm3。

大数组的推理我就直接正向来推了。

大数组 = 44位数组 + 长数组 + 一个值

先看看44位数组是怎么得来的?

url:url + 盐"cus" 通过sm3得到这个数组

data:这边请求传的data为空,也加盐"cus",通过sm3得到[136, 101,...]这个数组

主要是生成的这两个数组都只用到了两位数呀,

肯定是在戏弄我,等下分析错了还得推倒重新分析呢。

ua:

ua的第一步是得到一个乱码,然后通过这个乱码得到一个字符串,最后这个字符串又是通过一个sm3的算法又得到了一个数组,无独有偶,继续两个值。

具体的实现过程各位大佬可以通过断点或者日志去分析一下流程就出来啦。

关于这个44位数组的雏形还会用到  pageId,aid,两个不同的时间戳,还有一个环境字符串("...|Win32") 这样子的,还有一个前面传进来的 0,1,14(这里我其实一知半解的,关于这几个数咋来的有牛的大佬可以分享给小弟一下嘛),这些我就不去记录了,跟着日志走,啥都打印在里面了。

还要提一点的是 通过环境字符串得到的那个数组后续对拼接大数组的时候也会用到(也就是那个长数组拉)。

得到雏形后还有一个排序问题,直接断住这个逻辑点,然后吐出对应的取值下标,发现好几次都一样的,直接copy拿下。这里七里八里一搞得到了一个44位的数组

最后大数组 = 44位数组 + 环境字符串数组 + ?。

最后一位这个问号是由 44位数组 依次 ^ 过来得到的。

测试了一下,测试通过,嘻嘻嘻嘻。

至此我的分析也到此结束了,中间有分析错误的地方欢迎大佬们进行指正。

关于`a_bogus`参数本身并不是标准的XML解析过程中的一部分,该术语更多地关联到特定平台或应用内的加密、签名或是验证机制中,在常规的XML文档结构里并不存在这样的节点或者属性定义。然而,如果要在处理包含此类自定义标记(如假设存在名为`<a_bogus>`的标签)的XML数据时执行解析操作,则可以采用通用的方法来读取和提取所需的信息。 对于Android环境中利用SAX解析器处理含有特殊字段(比如这里提到的`a_bogus`)的XML文件,可以通过重写默认事件处理器中的方法实现: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; // 创建一个新的类继承DefaultHandler用于处理XML流 class MyXmlHandler extends DefaultHandler { @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); // 当遇到<a_bogus>标签时触发此逻辑 if ("a_bogus".equals(qName)) { System.out.println("Start Element :" + qName); // 可选:遍历当前元素的所有属性 for (int i = 0; i < attributes.getLength(); i++) { System.out.println("Attribute Name : " + attributes.getQName(i)); System.out.println("Attribute Value : " + attributes.getValue(i)); } } } @Override public void characters(char ch[], int start, int length) throws SAXException { super.characters(ch, start, length); // 获取<a_bogus>标签之间的文本内容 String content = new String(ch, start, length).trim(); if (!content.isEmpty()) { System.out.println("Characters: " + content); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); // 结束<a_bogus>标签时的操作 if ("a_bogus".equals(qName)) { System.out.println("End Element :" + qName); } } } ``` 上述代码展示了如何通过Java编程语言下的SAX API监听指定名称为`a_bogus`的开始与结束标签,并打印其内部字符以及任何可能存在的属性列表[^2]。 需要注意的是,实际开发场景下应当依据具体的业务需求调整这些回调函数的行为;此外,由于`a_bogus`并非官方认可的标准命名空间成员之一,因此在不同上下文中可能会有不同的含义或用途。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值