-
rpc介绍:
RPC 全称 Remote Procedure Call——远程过程调用,简单说就是为了解决远程调用服务的一种技术,使得调用者像调用本地服务一样方便透明;
使用RPC服务就可以直接在浏览器中的页面js中注入代码,将其作为一个客户端,本地相当于一个服务端,就可以实现js免破解,相当于黑盒的逆向调用,还是有相当大的场景; -
jsRpc
RPC服务自己写,比较麻烦,有现有的轮子jsRpc git地址可以直接使用,使用方法及其案例在git中都有记录
-
使用步骤及注意点
a: 在JsRpc Releases下载地址下载exe应用,然后双击打开服务;b:在chrome检查中的sources找到js逆向中的加密字段,然后通过overrides重写该js文件,也可以使用其他方法,然后再overrides中把这个加密方法进行window.方法名称(自定义)= 加密字段,将加密方法暴露到全局,然后保存该文件,手动刷新网页就可以加载重写之后的js文件;
c:如果临时测试也可以直接在chrome检查的console控制台进行手动处理,将github中的/resouces/JsEnv_De.js中的js代码直接放到console加载执行下, 并且使用js代码生成一个rpc链接 ;var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=weibo");
d:在console控制台上,可以手动试下暴露出来的全局方法,看是否可正常使用,可以正常使用的话,就可以在console控制台上进行注册rpc
//window.hlg 就是暴露出来的加密方法; demo.regAction("password_jiami", function (resolve,param) { //这里还是param参数 param里面的key 是先这里写,但到时候传接口就必须对应的上 var res = window.hlg(param['password']); console.log(res); resolve(res); });
e:然后创建一个python脚本,去调用注册的方法password_jiami,代码如下:
import requests # js_code = """ # (function(){ # console.log("test") # return "执行成功" # })() # """ # # url = "http://localhost:12080/execjs" # data = { # "group": "zzz", # "code": js_code # } # res = requests.post(url, data=data) # print(res.text) import json url = "http://127.0.0.1:12080/go" data = { "group": "weibo", "action": "password_jiami", "param": json.dumps({'password': 55555555}) } print(data["param"]) #dumps后就是长这样的字符串{"user": "\u9ed1\u8138\u602a", "status": "\u597d\u56f0\u554a"} res=requests.post(url, data=data) #这里换get也是可以的 print(res.text) # resp = requests.get("http://127.0.0.1:12080/page/html?group=zzz") # 直接获取当前页面的html # resp = requests.get("http://127.0.0.1:12080/page/cookie?group=zzz") # 直接获取当前页面的cookie # print(resp)
f:如果调用顺利,就可以返回响应加密字段了;
-
JsRpc 中的js代码直接注入加密的js文件中,方便实现自动化,进行脚本代码调用;
a: 在overrides中对加密js文件的文件头上添加JsRpc中的/resouces/JsEnv_De.js中的代码;b:然后对加密js代码进行注册服务,可以参考我的代码;
具体代码如下:(function () { window.hlg = function (Password){ return Jh("".concat([rp(), np()].join(" "), "\n").concat(Password), s.pubkey) }; var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=weibo"); demo.regAction("password_jiami", function (resolve,param) { //这里还是param参数 param里面的key 是先这里写,但到时候传接口就必须对应的上 var res = window.hlg(param['password']); console.log(res); resolve(res); }); } )();
c: 代码重新保存之后,一定要对网页进行刷新, 才可以使用重写之后的js文件(如果加密的js文件名称会发生变化,可以考虑使用油猴,或者抓包平台进行js代码文件重写);
d:然后再使用python脚本去调用就好了;