a_bogus算法分析过程记录

最近下载某浪的视频不方便了,抓包看了下是强制校验a_bogus参数了,就研究了下这个a_bogus,此参数主要应用在某音的m端,有的强制校验有的没有,算法使用了jsvmp,还原过程比较费时,记录下分析过程,以免过几天自已都看不懂了。

一、插桩

搜索:for (var g = []; ; ) 有十几个,这里着重关注下带着 m<26 和m<28的这两个,差不多在倒数第一、第二个,分别在这两个上下条件断点:

"位置 1", "索引m", m, "索引r", r, "值p: ", JSON.stringify(p, function(key, value) {if (value == window) {return undefined} return value})

"位置 2", "索引m", m, "索引r", r, "值p: ", JSON.stringify(p, function(key, value) {if (value == window) {return undefined} return value})

JSON.stringify() 方法的作用是将 JavaScript 值转换为 JSON 字符串,基础语法是 JSON.stringify(value[, replacer [, space]]),如果不将其转换成 JSON,那么 S 的值,输出可能是这样的:[empty, Array(26), 1, Array(0)],而看不到 Array 数组里面具体的值,该方法有个可选参数 replacer,如果 replacer 为函数,则 JSON.stringify 将调用该函数,并传入每个成员的键和值,在函数中可以对成员进行处理,最后返回处理后的值,如果此函数返回 undefined,则排除该成员。当 value 为 window 的时候,会因为循环引用异常报错,而导致不能正常输出日志,所以加个判断让函数返回 undefined,排除该成员,保证其他成员正常输出。

位置1、2用来区别是m<26处还是m<28处的日志, 在vmp的JS中,对哪个变量操作的最多,哪个变量就是栈,这里p表示栈。通过打印m、r、p值的变化,来进行还原分析。 在m<28中的function中往下找到 (b = s.apply(l, u) 语句,在此下断,因为到此处就已经生成a_bogus的值,不下断会继续打印很多没用的信息。差不多有5000多行左右。

直接在打印的日志页面右键 save as..,将日志导出保存到本地log文件进行分析。

二、分析

1.将参数传入生成2次32位的数组A1,A2

2.如果是post就用data生成32位数组,是get就将”bds”传入生成2次32位数组 B1,B2

3.UA生成一个32位数组。 这个步骤要分三步走,首先用固定列表[0, 1, 14]和ua生成一个 字符串C1

再用上面生成的字符串C1做参数 再生成一个 字符串C2

再用生成的字符串C2 做参数 生成一个32位数组 C3

4.生成一个列表D1。这个步骤分三部走, 在此步骤要中用到三个时间戳,需要tempStep3>timeStep1>tempStep2。

首先生成一个29位的列表做为P值,这里要用到timeStep1、tempStep2和上面的数组C3

接下来生成列表D_A,这里用到第三个时间戳tempStep3.

用[131]和上面那个29位列表做参数,生成一个新的列表D_B,将D_A和D_B合并就是列表D1。

5. 用D1做参数 代入 生成 字符串C2的函数,便得到最终的字符串了

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

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