总的来说,JavaScript 逆向可以分为三大部分:寻找入口、调试分析和模拟执行。下面分别进行介绍。
一,寻找入口
一个网站加载了很多 JavaScript 文件,那么怎么从这么多 JavaScript 里面找到关键的位置,那就是一个关键问题。这就是寻找入口。
但开始寻找前,建议先做以下工作:
-
判断参数是否需要逆向,可不可以直接复制参数
-
加密参数是否由之前的请求返回
-
按加密字符串的特征进行尝试,也许会有意外收获
下面介绍寻找入口时常用的手段。
1.1 巧用搜索
搜索是有一定技巧的,比如加密关键词是 signature,可以搜索 signature、“signature”、signature=、signature: 、sign
还可以搜索URL中的某些关键字、headers[ 等。
若遇到请求参数或者响应加密的情况,但通过跟栈找不到明文,有可能加密是在拦截器中处理的(请求拦截器Vt.interceptors.request、响应拦截器Vt.interceptors.response),因此可以搜索interceptors关键字。
PS:
在已有的页面链接中寻找其他页面的连接(从银行的详情页中搜索列表页链接):
- 搜索关键字寻找
- 搜索现有的url的某一部分关键字,有很大可能这些关键字会放在一起
1.2 Ajax断点+调用栈
它可以在发生 Ajax 请求的时候触发断点。要设置断点,就要先观察 Ajax 请求,假设请求的 URL 为:https://spa2.scrape.center/api/movie/?limit=xxx&page=99
可以看到,URL 中包含 /api/movie ,因此可以填写 /api/movie ,当 Ajax 请求的 URL 包含填写的内容时,就会进入断点停止。
1.3 Initiator call stack
Initiator 主要是为了监听请求是怎样发起的,通过它可以快速定位到调用栈中。栈的调用顺序为从下到上。
1.4 事件监听+调用栈
有的时候找不到参数位置,但是知道它的触发条件,此时可以使用事件监听器进行断点。然后结合调用栈进行定位。
1.5 Hook 关键方法
Hook 技术又叫钩子技术,指在程序运行的过程中,对其中的某个方法进行重写,在原先的方法前后加入我们自定义的代码。相当于在系统没有调用该函数之前,钩子程序就先捕获该消息,得到控制权,这时钩子函数既可以加工处理该函数的执行行为,也可以强制结束消息的传递。
要对 JavaScript 代码进行 Hook 操作,就需要额外在页面中执行一些有关 Hook 逻辑的自定义代码,这里推荐一个浏览器插件,叫做 Tampermonkey,中文叫 油猴,利用它,可以在浏览器加载页面时自动执行某些 JavaScript 脚本。由于执行的是 JavaScript ,所以我们几乎可以在网页中完成任何我们想实现的效果,如自动爬虫、自动修改页面、自动响应事件等。
下面以 https://login1.scrape.center/ 网址为例,进行 base64 方法的 hook,以下为油猴中的脚本:
// ==UserScript==
// @name HookBase64
// @namespace https://login1.scrape.center/
// @version 0.1
// @description Hook Base64 encode function
// @author Vahan
// @match https://login1.scrape.center/
// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant none
// ==/UserScript==
(function() {
'use strict';
function hook(object, attr){
var func = object[attr]
object[attr] = function(){
console.log('hooked',object,attr)
var ret = func.apply(object,arguments)
debugger
return ret
}
}
hook(window,'btoa')
})();
如果观察出一些门道,可以多使用这种方法来尝试,如 Hook encode 方法,decode 方法,stringify 方法,log 方法,alert 方法等。
还可以利用浏览器中的snippet来进行hook, 当创建好一个 Snippet 片段后,可以从任何页面访问和运行它们(浏览器会一直保存创建的snippet)。当你运行一个片段,它从当前打开页面的上下文中执行(即使这个页面中的链接变化也依然生效)。
如何创建一个 Snippet 片段?
先打开开发者工具,进入到 Sources (源代码)面板,在导航栏里面选中 Snippets(代码段),点击 “New snippet(新建一个代码块)” ,输入你的代码,按Ctrl+S保存,run运行。
这两种方