如果一个网站存在加密,其大致的运行流程如下:
网站代码运行时间轴
1、加载 html
2、加载 js
3、运行 js 初始化
4、用户触发事件
5、调用 js
6、加密函数
7、给服务器发送信息(创建 XHR-send)
8、接收到服务器返回数据
9、执行 js 解密函数
10、刷新网页
断点类型
在 js 逆向调试中,一般有如下几种断点:
•DOM 断点•DOM 事件断点•XHR 断点•代码行断点(手动下断)•代码的断点 debugger(源码中写好的)•全局事件断点(浏览器事件断点)•异常捕获断点
下面介绍几种常用的断点。
DOM 断点
DOM 断点执行的比较靠前,距离加密函数比较远,无法根据栈调用快速定位,并且需要在渲染的时候,属性发生改变,才能断住。例如,下图中的 search 按钮,审查元素后,下一个 DOM 断点,此时点击 search 按钮,是无法断住的,但是在 DOM breakpoint 中是可以看到断点存在,就是因为属性为发生改变,无法断住。
DOM 事件断点
如果 DOM 断点无法下断,可以用 DOM 事件下断,跟 DOM 断点特性一致,距离加密函数比较远,无法根据栈调用快速定位。下断的方法如下:
在审查元素之后,点击对应行,在右侧的 event listeners 窗口,取消勾选 ancestors all,只显示当前的事件监听器,接着点击对应的代码行跳入下断即可:
DOM 断点和 DOM 事件断点,在时间轴的第四步,也就是用户触发事件的阶段。
XHR 断点
XHR 就是 XML HTTP REQUEST,XHR 断点是在 send 的阶段下断,即时间轴中的第七步,执行的比较靠后,距离加密函数比较近,可以根据栈快速定位。 注意:非 XHR 发送的就断不住 以下面的网站为例:
随便输入一个手机号,查看其 http request 的 url 为 authcode/,可以利用该 url 下一个 XHR 断点。
在 source 窗口添加 XHR 断点,输入 url: /autocode/并勾选即可,下面再次发送验证码:
点击发送,在 send 函数处卡住,成功断住。借助这个例子也可以看一下方法栈的情况。
在这里可以清楚看到完整的调用关系。
全局事件断点(浏览器事件断点)
在 source 界面,展开 event listener breakpoints,点击对应的事件下断即可。
异常捕获断点
有时候想要更清晰地了解 try catch 的异常处理,可以勾选 pause on caught exceptions,此时代码运行遇到异常时,不会进行 catch 块,而是会报错并且断住,方便分析,一般在跟环境时使用。
原文始发于微信公众号(Crush Sec):js 逆向系列01-断点&方法栈
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论