php开发的js逆向rpc框架
一、前言
我们在写爬虫的时候,经常会遇到各种加密的参数,只能在浏览器打断点然后一步一步的去追代码,想办法把加密部分的js给抠出来在外部调用。这个过程漫长且费力,还需要一定的ast能力,容易把人劝退。所以现在有一种思想,直接在外部调用浏览器内已经生成的函数获取结果,这就是所谓的
js-rpc
远程调用。
在白度搜索js-rpc
框架,有python
和go
实现的,所以我如法炮制,基于websocket开发了php版本,取名shermie
,我个人觉得使用起来更方便一些,先上效果图:
服务端
浏览器
访问
代码
二、使用方法
- 启动服务
进入bin目录,在命令行执行下面的命令(cli.exe的下载去我的另一篇文章:博客:php开发的js逆向rpc框架)
./cli.exe Websocket.php
- 浏览器运行
1.在浏览器创建Websocket连接(先把Websocket.js文件注入浏览器中)
2.在client对象上注册需要调用的js函数
# 假设我们需要通过http调用btoa这个函数,第一个参数随便命名,第二个参数是函数执行的内容,需要自己定义执行内容
let client = (new WebsocketClient("ws://127.0.0.1:9501")).start();
client.registeCall("btoa",function(resolve,params){
let result = btoa(params);
resolve(result);
});
# 会输出一个访问地址,比如这样
[2022/4/24 18:16:01][info] 连接到服务器成功
[2022/4/24 18:16:52][info] 注册函数btoa成功
[2022/4/24 18:16:52][info] 访问地址:http://127.0.0.1:9501/call?group=ef8d3da2-dca4-4236-ba99-82f76a5e1901&action=btoa&input=
# 参数说明
group:客户端分组ID(不用管)
action:注册的需要调用的函数(不用管)
input:调用这个函数传入的参数(需要输入)
- 获取结果
访问上面打印的地址,并传入自定义参数:http://127.0.0.1:9501/call?group=df777a58-ff44-41bb-81ce-935b6bea9c25&action=btoa&input="abc"
,最终返回的就是:window.btoa("ss")
执行的结果
动态注入
往往加密的参数是在某一个js文件中的某个函数生成的,我们需要做的就是通过断点找到这个加密参数生成的位置,然后动态注入我们的脚本,使用外部的代码进行调用,这里假设你已经找到了关键代码,所以只需要动态注入我们的脚本,这里分为两步进行。
- 替换文件
需要把关键加密的函数加上连接ws的逻辑,保存为新的js文件,然后使用浏览器的override或者fiddler替换加密的js文件,假如我们找到了加密函数
function sign(){
// w函数存在其他地方
return w(x+y);
}
对其进行改造后
function sign() {
// 动态注入js文件
(function () {
var newElement = document.createElement("script");
newElement.setAttribute("type", "text/javascript");
newElement.setAttribute("src", "https://github.com/kxg3030/js-rpc/blob/main/Websocket.js");
document.body.appendChild(newElement);
function startWs() {
var client = (new WebsocketClient("ws://127.0.0.1:9501")).start();
client.registeCall("a", function (resolve, params) {
// 重点!在这里我们主动调用w函数并传入参数
resolve(w(params));
})
}
setTimeout(startWs, 1000)
})();
// w函数存在其他地方
return w(x + y);
}
然后将改造后的js文件保存下来,替换网页中原有的同名js文件
- 远程调用
使用外部ws服务器和浏览器通信即可
三、功能路由
/call 调用函数获取返回值
/list 获取当前服务的websocket客户端数量
四、说明
github不能上传超过100m的文件,所以只能贴一个外部下载链接了,代码仓库只包含最新的php文件和js文件,cli.exe请在文件地址里面下载
文件地址:share.weiyun.com/xKKhm1MC
代码仓库:github.com/kxg3030/js-rpc
五、参考
www.cnblogs.com/feng0815/p/1665444...
本作品采用《CC 协议》,转载必须注明作者和本文链接
那为何不直接控制台执行
window.btoa ("hh")
呢有个东西叫 PhantomJS 并且还有对应的 PHP 包
思路不错,不过我测试了下,好像有bug,调用的时候有时候会返回ping,时间稍长点,好像注册的函数就没了