很久之前发在知乎的文章,博客好久没更新,转过来水个文


某宝登录:

先追栈:

e经过addNCParamToRequest函数后,params就多了个bx-ua,进入addNCParamToRequest后继续追找到关键函数getFYToken

追到了关键文件fireyejs.js,把它拿到本地分析下代码结构

关键函数为t,再看看t内部

通过for语句和两层switch控制代码流程,控制流参数为Ct和bt,bt仅有图中一处赋值点,由Ct运算得来,Ct在代码各位置均有赋值。再看代码内部

通过St为判断条件的三目表达式混淆及执行流程,St与上面的bt一样仅在每次循环后赋值且根据Ct获得,而Ct也是在St分支修改自身值。大概执行流程是这样的:

Ct = 452, bt = 31&(Ct>>5), St = 31&(Ct>>5)>>5
进入第一层值为31&Ct的分支
进入第二层值为bt的分支
进入第三层值为St的分支
执行相应分支代码,并修改Ct值
重新计算bt和St,进入对应分支
执行相应分支代码,并修改Ct值
重新计算bt和St,进入对应分支
执行相应分支代码,并修改Ct值
...

也就是说,每个Ct值对应一个分支,根据这点使用ast进行还原

插入标记函数

三目转if语句将标记函数替代原流程

修改执行流程为循环

得到对应映射

根据sign和Ct映射、sign和代码段映射、Ct取值数组重新生成case语句

到这儿已经得到了Ct的值与相应代码分支的映射,也就是三层转一层。