天空宫阙 发表于 2021-12-26 14:08

RPC 百度登录RSA免扣调用实战

本帖最后由 天空宫阙 于 2021-12-26 14:08 编辑

# RPC 百度登录RSA免扣调用实战记录
完整代码在github自取
```
https://github.com/skygongque/Spider/tree/master/21-RPC%E7%99%BE%E5%BA%A6%E7%99%BB%E5%BD%95%E5%85%8D%E6%89%A3%E5%AE%9E%E7%8E%B0RSA%E5%AE%9E%E6%88%98%E8%AE%B0%E5%BD%95
```
感谢志远大佬的逆向课程
案例网站 百度登录 https://www.baidu.com/

目标使用RPC 免扣代码实现RSA加密

## 使用的工具或环境

chrome 开发者工具 `Overrides` 映射线上代码到本地

python 库 `websockets`



## 核心思路

手动定位到`e.RSA.encrypt`将其导出到window,并与本地5000端口的websocket服务器建立连接,后续加密只要发送到websocket服务器,就可以得到加密的结果



**流程图**



### websocket服务器代码

起到桥梁的作用,内部逻辑简单,只是把消息转发给非发送方的其他客户端(python 或browser)

```python
import asyncio
import websockets
"""
websocket 服务端

"""
connected = set()

async def server(websocket, path):
    # Register.
    connected.add(websocket)
    try:
      async for message in websocket:
            for conn in connected:
                # 发送消息到非发送方的所有客户端
                if conn != websocket:
                  # await conn.send(f'Got a new MSG FOR YOU: {message}')
                  print("Got",message)
                  await conn.send(message)
    finally:
      # Unregister.
      connected.remove(websocket)
   

start_server = websockets.serve(server, "localhost", 5000)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

```



### browser

chrome 开发者工具 `Overrides` 映射线上代码到本地

> 注意获取权限时点击允许
>
> 并在网站设置那里勾选,**允许加载不安全内容** ,相比于wss ws被浏览器视为不安全









定位密码加密的方法注入以下代码,作用是导出加密代码到window并连接websocket服务器,实现`onmessage`方法



```javascript
// 将百度登录的RSA 加密代码导出到windows
// 与app.py 建立的websocket 连接

!(function () {
    window.zhiyuan = e;
    var ws = new WebSocket('ws://localhost:5000');
    ws.onopen = function (evt) {
      console.log('Connection open ...');
      ws.send('Hello WebSockets!');
    };
    ws.onmessage = function (evt) {
      var password = evt.data;
      var encrypt_password = window.zhiyuan.RSA.encrypt(evt.data);
      console.log('password=' + password + '; encrypt_password=' + encrypt_password);
      ws.send('password=' + password + '; encrypt_password=' + encrypt_password);
    };
})();
```

注入部分完整代码位于文件`injected_baidu.js`

### python客户端调用示例

```python
import asyncio
import websockets

# 获取事件循环
loop = asyncio.get_event_loop()

async def hello(message):
   # 连接 websocket 并发送消息 获取相应
   async with websockets.connect("ws://localhost:5000") as websocket:
         await websocket.send(message)
         return await websocket.recv()


def get_encrypt(message):
   print(loop.run_until_complete(hello(message)))


if __name__ =="__main__":
   for i in range(1000):
         get_encrypt(str(i))
```



## 效果



python调用成功









天空宫阙 发表于 2021-12-27 17:10

LePay 发表于 2021-12-27 00:26
大佬 我想问一下
1.这个有什么应用场景吗?
2.免扣是指的什么


主要用于爬虫。
目的是拿到浏览器运行过程中的方法(此处是密码加密的rsa算法)供其他程序调用。
因为浏览器的环境完整,代码没有修改,只注入了代码就可以使用,从而免抠。这种方法可以做到一定程度的并发,但效率比不上扣js代码在nodejs中运行,但效率优于selenium这类自动化工具

天空宫阙 发表于 2021-12-26 20:25

yufd1986 发表于 2021-12-26 18:51
这个确实好用,之前还用代{过}{滤}理模式替换文件,这样方便多了。

确实可以用中间人的方法或谷歌的调试工具自动注入代码

Airey 发表于 2021-12-26 14:49

火钳刘明{:1_921:}

马甲下的蛋 发表于 2021-12-26 14:54

很强大,谢谢分享哦

yufd1986 发表于 2021-12-26 18:51

这个确实好用,之前还用代{过}{滤}理模式替换文件,这样方便多了。

LePay 发表于 2021-12-27 00:26

大佬 我想问一下
1.这个有什么应用场景吗?
2.免扣是指的什么
对前端不太了解,希望大佬解答一下,谢谢大佬。

月牙儿 发表于 2021-12-27 10:53

学习一下~

xhj666 发表于 2021-12-27 11:06

很有用的

ptzhuf 发表于 2021-12-27 11:07

这个秀啊!
页: [1] 2
查看完整版本: RPC 百度登录RSA免扣调用实战