爬虫逆向之X音a_bogus参数分析
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
此文章重在学习调试技巧。模拟参数生成。
目录
网站难点
加密位置
第一次插桩
三个执行顺序
第二次插桩
第三次插桩
附Node环境
目标网址:aHR0cHM6Ly93d3cuZG91eWluLmNvbS91c2VyL01TNHdMakFCQUFBQW9tcFhrUG9ZT0dzQTE1MmRxWW95dEt5Y2pJWl9hQ0N4SHdHbUxYNUlzRE0/ZnJvbV90YWJfbmFtZT1tYWluZA==
接口:aHR0cHM6Ly93d3cuZG91eWluLmNvbS9hd2VtZS92MS93ZWIvYXdlbWUvcG9zdA==
网站难点
网页生成a_bogus执行方法有三种个三个执行入口,每一次刷新进入随机一个执行入口,你断点可能断不了一点,所以最好是三个执行入口一起断住。
这个网页除了补环境外,最大的挑战就是插桩。a_bogus值会生成多次,一个接口生成一次,不同接口生成a_bogus值不一样,所以就是找特征下断点。关键词:'post'
加密位置
XHR断住后,往每个JS文件入扣处打上断点,经分析,加密位置在bdms.JS文件里,并且每次加载进入bdms.JS文件不一样,有三处地方(天哪,第一次做调试到奔溃)

更加正确位置是X函数里的s值

其实有个技巧,跟栈不一定是一个栈一个栈找,也可以一个文件一个文件找。最好的是往每个文件入口处打上断点,就可以分析在那个文件进行加密。
其实上可以在这个文件打上日志断点,不要往初始化的地方打上日志断点。

第一次插桩
很显然就是s坐标9的位置就是参数生成位置,这个参数会生成很多次不一样的值。关键词post

找执行bdms.JS的最开始地方,这里设置条件断点

先对比接口和a_bogus,发现有这个规律。s[9]和s[6]两两对应,这是生成位置。

断住后跟栈找,S生成的6坐标对应相应的接口,生成的9坐标则是对应相应接口加密的a_babogus,每个接口的a_bogus值不一样,入口传入参数不一样。所以我们设置添加断点,让它能对应相应接口生成的a_babogus值。
三个执行顺序
跟栈发现在index.js

但是有时调试时会加载别的JS文件,不一定是index.js,,还有可能是client-entry~.js

还有是browser.cn.js接口
心好累,有时调试时候,打上断点,风控就是是执行顺序老变,妨碍调试,搞得很崩塌,但事实上逻辑都是一样的。而且是我电脑原因吗,调试越久越卡。(写个博客心态都崩了!!!)
第二次插桩
接下来就是看看入口的传参了,经调试,在入口处设置这个条件断点即可,这是生成a_b值入口。

重新进入,发现跟栈变了。
往这里继续打断点,

又戳戳变了,这个有点难分析,不过没关系,重新刷新,刷到我们断住的断点为止

分析得出入口在这里

就算断住后也要注意函数名,可能先执行,但下一步不是生成的JS函数,也可能后执行。

不断刷新,直到断指(断住)

this要分析(不一定是this,也可能是e,看你断住得地方),t写死,n如何导出?
首先全扣代码 bdms.JS文件,补完环境后,导出n函数,因为n函数会有很多个接口经过然后对a_b值加密,所以要设置一个特有的条件断点。
第三次插桩
但post接口经过时,e参数是这样的。这是导出a_b值条件。

所以在自己node环境也设置这个条件断点

函数执行处有XML对象,u写死
定义一个对象

传入

然后吐出环境


copy一下,整理得出

uifd是请求体得uifd要一一对应,args是请求接口处a_b值外的url。其中的uifid也要对应。
包括请求头要一一对应

最后在X函数,s[9]就是a_b值,

顺利得出

模拟参数生成。搞定!!
附Node环境
EventTarget = function EventTarget() {
}
EventTarget.prototype.toString = function toString() {return 'function EventTarget() { [native code] }'
}
Window = function Window() {
}
Window.prototype.toString = function toString() {return 'function Window() { [native code] }'
}
Window.prototype.requestAnimationFrame = function requestAnimationFrame(res) {
}
Object.setPrototypeOf(Window.prototype, EventTarget.prototype)
window = new Window()
window.toString = function () {return '[object Window]'
}XMLHttpRequest = {}
window.XMLHttpRequest = {}
XMLHttpRequest.prototype = {}class Location{constructor() {this.Symbol = "Location"}}location = new Location()
location.href = "xxxxx"
location.ancestorOrigins = {}
location.origin = "xxx"
location.protocol = "https:"
location.host = "xxxxx"
location.hostname = "xxxxx"window.location = location// -----------------navigator---------------
Navigator = function Navigator() {}
Navigator.prototype.userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"navigator = new Navigator()
window.navigator = navigatorscreen = {}
window.screen = screen
