某视频bdms_1.0.1.19_fix 192位 a_bogus参数分析(一):保姆级教程定位与插桩分析

 近期在分析某视频接口时发现 a_bogus 参数已升级至192位。本文记录了完整的分析过程与实现思路。虽然是基于事后代码复现总结,部分分析步骤可能与实际逆向过程有所出入,但整体思路清晰可行。作为一名逆向学习者,文中难免存在理解不够深入或考虑不够周全的地方,恳请各位大佬指出。本着知识分享的原则,我会尽可能详细地记录每个关键步骤,希望能为同样对此分析感兴趣的朋友提供一些参考。

定位

打开F12,随便打开个网页:https://www.xxxx.com/video/7456134161238199591,等页面加载完成,找到视频请求页面:https://www.xxxx.com/aweme/v1/web/aweme/detail
在F12中找到启动器,看到bdms.js,

image.png

点击第一个,位置虽然对,但调用这里的太多了,同一个请求会调用N多次,不同请求也会调用这里,所以需要缩小下范围。

image.png

我们往往更早的地方看一下,看启动器中n函数位置:
image.png
试了下这个地方调用也很多,在这下断运行几次,调试时发现这个arguments参数很多是这样子的:
Arguments(3) [‘POST’, ‘https://mcs.zijieapi.com/list?aid=6383&sdk_version=5.1.18_zip&device_platform=web’, true, callee: (…), Symbol(Symbol.iterator): ƒ],

我们目的是首先找到aweme/detail/ 页面的调用,排除其他干扰项,发现这个规律后,我们s可以写一个条件断点,先定位到aweme/detail/调用处:

// js
arguments && arguments[1] != null && arguments[1].toString().includes('aweme/detail')

然后刷新页面,不出意外的话正常断住了,如图:
image.png
从这开始往后应该就存在生成a_bogus的代码了,运行到哪结束呢,我的做法是打开代理,发现代理中有新的/aweme/v1/web/aweme/detail/请求说明a_bogus生成完了。这时就可以把条件断点关掉,导出日志大体看下什么情况了。

先打条件断点初步看一下:

image.png
console.log("函数: ", n, "调用者: ", d, "参数:", JSON.stringify(e) , "结果:", m, "入栈01:", m);

运行后会有很多类似这样的日志:

函数:   调用者:  URLSearchParams {size: 30} 参数: ["a_bogus","D6sjD7WyEx/ccd/SmOb5elClze6MNTWyx1ioS7VPoksAGZlY9uNgxe-booisG2h28BwweVHLj0AYxdcQ4UsZ9HkumkvSqzbD45IIh6L81NXGUsmLr8uCLuzzXBK8csq-/V4EIfIgUeyZjn-hHQY/QQHS/KeQQShQ3xjk/zCP9Gg10yAL3cePdGBOXiqsD=="] 结果: undefined

所以,也可以在这设置条件断点,这样就可以更精准的知道在哪结束生成了:

(d?.constructor?.name === 'URLSearchParams' || (Array.isArray(e) && e[0] === 'a_bogus')) && e[1]?.length > 172  

这样我们分析这中间发生了什么就可以还原算法了。接下来用插桩来打印日志进行分析

日志断点

有一份好的插桩日志基本上就算完成一半了。所以在哪插桩很重要,基本思路是:

主要对哪个栈操作 就打印哪个栈的信息,这里主要是对v操作,所以主要打印也就是它。此外所有的运算步骤也要打印,比如常规的+、-、*、/、%、^、&、等等,这步会有些繁琐,但这步要做好了,剩下的工作基本就是时间的问题了。

接下来贴出我当时的插桩位置及日志点供参考:

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

日志断点打好后先不要开启,只保留第一个条件断点,就是return X(e, this, arguments, r)的位置,刷新后在条件断点处断住,这时说明已经来到/aweme/v1/web/aweme/detail请求处,准备处理此请求的参数了,这时再把其他的日志断点打开,再继续运行,等一会看到代理中有新的/aweme/v1/web/aweme/detail请求,就把所有断点关掉,再把日志保存,这样能拿到一份相对误差较小又比较完整的日志文件了。

原文链接:http://www.itawp.com/597.html,转载请注明出处。
0

评论0

没有账号?注册  忘记密码?