• RPC远程调用加密方法获取返回值


    前言

    从混淆的加密JS中还原了加密参数的具体生成流程,结果想从JS转python的过程中第一步就卡住了。开头密钥JS代码如下,但是水平有限不知道如何转为python实现(如果有大佬知道希望可以评论指点)。利用execjs+jsdom来执行简化还原后的JS代码依旧无法实现。所以只能通过RPC的方式来获取加密参数。

    参考视频:分享一个js逆向rpc框架,CatWebRPC_哔哩哔哩_bilibili

    框架地址:https://github.com/x0tools/CatWebRPC/tree/main

    1. var oct = new Uint8Array(16);
    2. window.crypto.getRandomValues(oct);
    3. oct = octToBase64(oct);
    4. var one_key, two_key, encryptDataKey;
    5. // var oct = "01FI21LlGjk5yKNSchRDKw"; window.crypto.subtle.importKey("jwk", n, r, !0, ["encrypt"]);
    6. var cpt = window.crypto.subtle;
    7. var n = {kty: "oct", k: oct};
    8. var r = "AES-GCM";
    9. // extractable是false还是true似乎不影响最后结果
    10. one_key = await cpt.importKey("jwk", n, r, !0, ["encrypt"]);
    11. var f = {
    12. alg: "RSA-OAEP-256",
    13. e: "AQAB",
    14. kty: "RSA",
    15. n:"gXXZV1VqZ6k_uQtyJNJy5q-qvKdqrXJNgKUO1aYc1UPBVqlhCP0GPxf-0GSo-LEtArgcbF8-j6_vSLSqztYxxF8og--rB8zAyZ8DXZaugX-UiJDQnoJL_HtXKuwIm9U7oEPoeD6H4ZDcfbsPj77xVn7UA2-a90N4aZqMC8EIfXIy1tqSbSPnxPOaiEmy8xGtG-L3RdCyc7TL0Swd_f0_DjRT6ip91IBlCmquoa-xJgZ9e44PVH4AwdyssiV4ZLEZ5yFcE0zcRb_62kx_TQptidbJ4nHocFVjmUW9YsrAWeKrBmOGZEjO4vbATYs1Yf4vgcH7Ix61EPR5sbDP4SlBWQ"
    16. };
    17. var u = {hash: {name: "SHA-256"}, name: "RSA-OAEP"};
    18. two_key = await cpt.importKey("jwk", f, u, !1, ["wrapKey"]);
    19. // 生成encryptDataKey, 转换成Uint8Array类型数组
    20. var wrappingAlgorithm = {name: "RSA-OAEP", hash: {name: "SHA-256"}};
    21. encryptDataKey = await cpt.wrapKey("raw", one_key, two_key, wrappingAlgorithm);
    22. encryptDataKey = new Uint8Array(encryptDataKey);

    使用教程

    我的运行环境:Windows7 + node.js 12.18.4 + python3.7

    1.下载 CatWebRPC后,安装运行所需要的环境
    1. npm i express
    2. npm i body-parser
    3. npm i fox-wamp
    4. npm i autobahn
    2.修改 catserver.js 代码中的ip和端口,端口尽量修改为5位数的端口避免端口被占用,修改完成后,直接运行
    node catserver.js
    
     3.网页控制台运行CatWebService.js

     4.注册方法,这里我注册的是已经还原重写的加密主函数 encryptMain
    1. //window.catwampy.register(topic,func,opt)
    2. //topic: 同java包名类似 域.名.方法名
    3. //func: js的function 需要调用的方法
    4. //opt: 同Wampy.js opt参数一致 另外增加了一个concurrency 并发设置 一般不需要设置 或者根据需求填写
    5. //如下 注册了一个encryptMain方法 给定并发(同时的请求)设置为10
    6. window.catwampy.register('cat.rpc.test', encryptMain, { concurrency: 10 });

      5.python远程调用获取加密参数

    这里我的JS加密主函数只需要传入一个密码参数,所以post的时候只需要在数组中放一个参数就可以

    1. import requests
    2. def test_rpc():
    3. headers = {"Content-Type": "application/json"}
    4. # ["参数1","参数2",1,true,1.1,{}] //类似json支持不同类型 类似js apply(this,参数数组) 中的参数数组
    5. data = json.dumps(["test_password"])
    6. try:
    7. response = requests.post("http://127.0.0.1:5000/call?topic=cat.rpc.test", headers=headers, data=data)
    8. print(response.text)
    9. except Exception as e:
    10. print(e)

     如上图所示,一切正常,在浏览器控制台可以看到调用次数

  • 相关阅读:
    centos-apache-简易搭建静态网页服务器-总结
    Vue3 源码系列:项目调试和项目架构分析(一)
    在基于ABP框架的前端项目Vue&Element项目中采用日期格式处理,对比Moment.js和day.js的处理
    C++零基础教程(引用)
    惊艳!拓世法宝AI智能数字人一体机解锁数字文博的全民体验
    Python灰帽编程——初识Python下(函数与文件)
    【Linux基础】Linux的基本指令使用(超详细解析,小白必看系列)
    JAVA12_01学习总结(MySQL,约束)
    网站服务器怎么部署
    java虚拟机详解篇七(虚拟机线程)
  • 原文地址:https://blog.csdn.net/rongDang/article/details/134050001