好友
阅读权限25
听众
最后登录1970-1-1
|
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关.本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责。  
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
目标网址: aHR0cHM6Ly93d3cubXl0b2tlbmNhcC5jb20vbmV3LXRva2VuLWxpc3RpbmdzLzEv
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
文章思路:
1. 找出目标数据包
2. 分析参数跟栈
3. 找到加密位置
4. 扣取代码与修改代码
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
文章哪里讲的不对或不清楚 还请各位大佬给出宝贵意见  
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第一步:
1.1 打开开发者工具找出目标数据包
1.2 对载荷进行分析 确定要逆向的参数
1.1 分析完之后就开始点击启动器,进入源文件对参数进行跟踪
1.2 然后下断点,追目标参数
第二步
2.1 接着依次向后跟栈 到指定位置
2.2 让断点断在加载器处,我们进行分析
2.3 我们看这段代码,每次执行,它里面的函数,结束后,就会将执行过的函数删除掉,也就是L变量,我们看到里面有很多函数
2.4 在这里进行分析 首先各位可以在堆栈往后上追,参数就丢了,那么参数在这之前是有的,
在之后就没了,所以推断出,参数的生成,是在这个拦截器里面生成的,也就是L里面某个函数返回的,
所以我们依次进入,来寻找
第三步:
根据上述我们开始进入拦截器在每一个函数的return处下断,然后再分页发包看最后会断在那个地方,
如果没有断住说明数据包没有经过这里,随后我们另外分析
3.1 因为L里面的下标3没有,所以不展示,只进入有的
3.2 按下图,去掉其余断点和拦截器断点,然后分页发包看断点最后断在哪里
3.3 可以看到断点断下来了,并且证实了,我们的目标数据包,
经过这里,还有最后返回的n.data里面就存放了我们想要的参数,
这样看还不清晰,我们将全部断点去掉,只保留这一个 ,并且在他的头部也下一个
3.4 操作完之后 我们先看一看 这个函数内有没有,线索,或者参数就是在这里面生成的
3.5 不过为了准确,我们分页发包让断点,到头部,看看有没有新情况
3.6 断点到头部之后我们看到形参n里面的data我们要的参数没了,那我们就又可以猜测上面没有参数的生成,
那么就有可能是在往下时进行的参数生成与赋值,因为我们需要参数在最后return n 里面,可以在
3.3 清楚看到,那我们就单步调试一步一步走,看看在哪一行出现的
第四步:
1.1 节省时间我就直接往下走到指定位置了
1.2 可以看到他是在一个if判断条件里生成的,也就是 n.data.code 还有时间戳 n.data.timestamp
1.3 那么我们就找 Code参数的e 和时间戳 r 向上 因为是先定义后使用
第五步:
5.1 我们找到了参数的定义处,那么代码分析就快了:
e = o()(r + "9527" + r.substr(0, 6))
这段代码我们就只需要看o()( ‘ 参数 ’ ) 因为这种方式就相当于 o( ‘ 参数 ’ ) 可以自己在控制套打印试试 一样的效果 ,
参数的分析就是 时间戳 + 字符串 + 取出时间戳0-6位 所以 我们现在只需要找出 o 就可以
5.2 对于o,我们肯定也是找到他的定义处,所以我们就向上接着找
5.3 找到定义处之后扣取代码就简洁明了
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
代码扣取与调用
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第六步:
6.1 我们清楚的看到了o的定义所以进行分析
var e = r(2568), o = r.n(e)为什么会有e,因为o加载了e 所以看e,它加载了一个模块,
现在将断点放在 var e = r(2568) 将网页刷新断住,因为需要先加载模块,才有后来的功能代码
6.2 我们选中 r(2568) 进入里面查看是不是有其他模块,可以看到进入之后它还加载了其他模块
这里就长话短说,可以自己一个一个进去看,也就 2568 模块加载的这几个,它们各自内部并没有在加载,
所以可以很轻松的去扣取代码,
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
加载器与最终代码
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第七步:
7.1 加载器就不在讲解,在这里只说加载器里存在的问题
7.2 我们打开Code 将代码扣取出来放入
7.3 加载器和模块都已准备完毕,按照浏览器调用 ,从第五步我们知道,我们需要的是
e = o()(r + "9527" + r.substr(0, 6)),
还有 第六步 var e = r(2568), o = r.n(e) 这是加密函数o
7.4 组装我们代码 加密的参数 我们在第五步也分析完毕 所以将r 也扣取下来 ,或自己创建
7.5 代码组装
第八步
8.1 我们来依次修改代码,经过第七步代码组装,我们运行
会出现报错 self 未定义,因为我们没有所以我们跳到代码报错位置,
直接置空,因为没有,我们是单个模块扣取,不是多文件直接扣取
8.3 再次运行 又报错 根据步骤1、2、3,发现是加载模块出错,原因就是r未定义,
那是因为浏览器的加载器是叫r(可以返回6.1查看),而我们本地用不了,
所以要导出加载器进行替换
8.4 再次运行,我们发现又报错,这次是模块的问题,为什么会出现这样的错误明明有模块,
却说模块错误,这是怎么回事,但经过多次调试,我们发现是在加载器头部的出现的报错,
我们转移到头部来看
8.5 我们分析加载器头部代码整个加载器是个自执行 所以 参数传递 从尾部 直达步骤1
步骤1: 参数会首先经过这里,但是可以看到步骤1没有形参也就意味着 参数传不进来 所以就会导致报错
步骤2:这里是e = {} 如果我们将形参定义为 变量e 那么即使参数 进来了,那么也会被设置为空,从而导致报错
步骤3: 此处的e 里面是存储模块的,可以自己去看浏览器,和本地对比,那么问题就来了既然是存储模块的,
如果步骤1不设置 为变量e而设置为其他变量,使这里的e接受不到外部模块,就会发生一系列报错
所以:
在这给出解决办法我们可以将步骤1 添加一个形参e,而将步骤2,注释掉让他不起作用,那么自然而然,代码的执行就与浏览器对应了
8.6 最后我们再次运行,可以看到完美出值
总结
总体来说是简单的,但8.5过于隐蔽,不仔细看,很容易忽略
最后
感谢大家的收看,希望各位大佬可以给我的文章提出宝贵的意见,感谢你们的喜欢  
|
免费评分
-
查看全部评分
|