【hook】解锁 ABEMA 前端区域限制

温馨提示,ABEMA 在世界杯期间加强了访问限制策略,如果显示错误页面就代表本文无解,换个 IP 继续吧。

ameba tower
访问 ABEMA (物理)

开篇废话

ABEMA 最近更新了 IP 库或者风控加强了,我的 Oracle Tokyo 已经不能直接访问。
不过看上去只是前端加了点规则,应该还是可以解锁的,这里就来研究下。

其实随便搜索下就可以找到现成的解锁脚本 https://gist.github.com/Last-Order/5a1c70686bc0c130fe3fbdcbdb1bf22a

这里分享下我是如何逆向的

正文

找到对应 JS 文件

具体 js 文件会随着前端更新而变化,自己动手实践应以实际为准

我们右键检查,找到 Network 标签,然后根据页面的语言文件来找到对应 .js 文件,如图所示:
find js 1

可以找到 e144c605522fc069f095.9855.js ,我们粘贴到本地,然后随便看一下。

可以点击左下角的 {} 图标来格式化代码。

找到提示函数

我们转到了 VSCode ,然后继续随便搜索一下,这里我用了 maintenance_region_detail_label 也就是语言的变量,看上去定位到了是什么让页面成抱歉,然后继续随便看看有没有什么独特的东西:
find js 2

然后我们就看到了 region 这个词,我们全局搜索ta
看上去找到罪魁祸首了,我们继续查找 Oe 这个函数,看上去就是个加载函数,当变量 t 为否时就报错,调用 xe 函数。
这时候我们第一版补丁就已经有灵感了,如图所示:
find js 3
可以正常进入网页并且也可以观看直播(点播当然还是不行)
然而直接给文件打补丁,以后前端更新的时候又要改了,我们还是要找到为什么。

此处为人眼调查能调查到的极限,接下来我们需要在浏览器下断点才能继续追踪

动态调试

我们切换到 Sources 标签,找到 e144c605522fc069f095.9855.js 并且在之前 Oe 函数里面下个断点:

breakpoint js 1
breakpoint js 2

可以看到在是这个函数调用的,对应的是 HTML 中的 window.__CLIENT_REGION__ = {...,"isAllowed":false}

我们用些奇怪的办法把 isAllowed 改成 true 即可(参考开篇废话的那个现成脚本),然后刷新页面,可以看到页面变成了正常的。

写脚本

这里就直接借开头提到的解锁脚本,没有再想其他方法:
其实没有其它更方便的办法了

// https://gist.github.com/Last-Order/5a1c70686bc0c130fe3fbdcbdb1bf22a
// ==UserScript==
// @name Abema 区域限制
// @version 1.0.0
// @run-at document-end
// @namespace Violentmonkey Scripts
// @match https://abema.tv/*
// @grant none
// ==/UserScript==
Object.defineProperty(__CLIENT_REGION__, 'isAllowed', {
  get: () => true
});
Object.defineProperty(__CLIENT_REGION__, 'status', {
  get: () => false
});

MDN 可以找到关于 Object.defineProperty 的详细介绍,

此处脚本直接劫持了 __CLIENT_REGION__ 对象,把 getter 强行改成了 true,无论数值如何变化其返回结果也只会是 true,这样就不必写循环事件之类的来保持 __CLIENT_REGION__.isAllowed / __CLIENT_REGION__.status 的值为 true 了。

script

反制方法为 Object.freeze / Object.defineProperty writable: true 这里不再演示。
都是网页了,反制基本上也是无效,自然有别的办法绕,看谁先放弃折腾,实在不行就替换 JS 文件安排,所以要加限制还是看等级,不想让人搞就在服务端层面掐掉可能性。

总结

这次逆向也算是学到了一个新的劫持姿势,受益匪浅。

然后就是逆向类的博文还是不太好写,我该如何描述截图期间的过程呢?对于我来说可能只是这里点点,那里再搜索一下,然后再打个断点亦或者手动 console.log,修改下试试效果最后做成油猴脚本的事,也许录视频才能更好地解说?