Python Frida RPC 调用示例

JS_CODE

  1. var base64EncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
  2. base64DecodeChars = new Array((-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), 62, (-1), (-1), (-1), 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, (-1), (-1), (-1), (-1), (-1), (-1), (-1), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, (-1), (-1), (-1), (-1), (-1), (-1), 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, (-1), (-1), (-1), (-1), (-1));
  3. function bytesToBase64(e) {
  4. var r, a, c, h, o, t;
  5. for (c = e.length, a = 0, r = ''; a < c;) {
  6. if (h = 255 & e[a++], a == c) {
  7. r += base64EncodeChars.charAt(h >> 2),
  8. r += base64EncodeChars.charAt((3 & h) << 4),
  9. r += '==';
  10. break
  11. }
  12. if (o = e[a++], a == c) {
  13. r += base64EncodeChars.charAt(h >> 2),
  14. r += base64EncodeChars.charAt((3 & h) << 4 | (240 & o) >> 4),
  15. r += base64EncodeChars.charAt((15 & o) << 2),
  16. r += '=';
  17. break
  18. }
  19. t = e[a++],
  20. r += base64EncodeChars.charAt(h >> 2),
  21. r += base64EncodeChars.charAt((3 & h) << 4 | (240 & o) >> 4),
  22. r += base64EncodeChars.charAt((15 & o) << 2 | (192 & t) >> 6),
  23. r += base64EncodeChars.charAt(63 & t)
  24. }
  25. return r
  26. }
  27. function base64ToString(e) {
  28. var r, a, c, h, o, t, d;
  29. for (t = e.length, o = 0, d = ''; o < t;) {
  30. do
  31. r = base64DecodeChars[255 & e.charCodeAt(o++)];
  32. while (o < t && r == -1);
  33. if (r == -1)
  34. break;
  35. do
  36. a = base64DecodeChars[255 & e.charCodeAt(o++)];
  37. while (o < t && a == -1);
  38. if (a == -1)
  39. break;
  40. d += String.fromCharCode(r << 2 | (48 & a) >> 4);
  41. do {
  42. if (c = 255 & e.charCodeAt(o++), 61 == c)
  43. return d;
  44. c = base64DecodeChars[c]
  45. } while (o < t && c == -1);
  46. if (c == -1)
  47. break;
  48. d += String.fromCharCode((15 & a) << 4 | (60 & c) >> 2);
  49. do {
  50. if (h = 255 & e.charCodeAt(o++), 61 == h)
  51. return d;
  52. h = base64DecodeChars[h]
  53. } while (o < t && h == -1);
  54. if (h == -1)
  55. break;
  56. d += String.fromCharCode((3 & c) << 6 | h)
  57. }
  58. return d
  59. };
  60. function bytesToString(arr) {
  61. var str = '';
  62. arr = new Uint8Array(arr);
  63. for (var i = 0; i < str.length; i++) {
  64. str += String.fromCharCode(arr[i]);
  65. }
  66. str = bytesToBase64(arr);
  67. str = base64ToString(str);
  68. return str;
  69. }
  70. function siua(message) {
  71. return new Promise(resolve => {
  72. Java.perform(function () {
  73. const j_string = Java.use('java.lang.String');
  74. const MTGuard = Java.use('com.meituan.android.common.mtguard.MTGuard');
  75. const data_jni = Java.use('com.meituan.android.common.datacollection.DataCollectionJni');
  76. // let result = Java.array('byte', b);
  77. let result = j_string.$new(message).getBytes('UTF-8')
  78. let ua = data_jni.packData(MTGuard.appContext.value, result, result.length)
  79. resolve(bytesToString(ua))
  80. })
  81. })
  82. }
  83. function sign(message) {
  84. return new Promise(resolve => {
  85. Java.perform(function () {
  86. const j_string = Java.use('java.lang.String');
  87. const MTGuard = Java.use('com.meituan.android.common.mtguard.MTGuard');
  88. const candy_jni = Java.use('com.meituan.android.common.candy.CandyJni');
  89. // string to byte[]
  90. let result = j_string.$new(message).getBytes('UTF-8')
  91. let ua = candy_jni.getCandyDataWithKey(MTGuard.appContext.value, result, 'CandyKey')
  92. resolve(ua)
  93. })
  94. })
  95. }
  96. rpc.exports = {
  97. sign: sign,
  98. siua: siua,
  99. }

Python Code

  1. # -*- coding: utf-8 -*-
  2. # @Time : 2021/6/23 14:34
  3. # @Author : xiaowei
  4. # @File : rpc_sign.py
  5. # @Software : PyCharm
  6. import os
  7. import frida
  8. JS_CODE = """JS代码"""
  9. def message_header(message, payload):
  10. message_type = message['type']
  11. if message_type == 'send':
  12. print('[* message]', message['payload'])
  13. elif message_type == 'error':
  14. stack = message['stack']
  15. print('[* error]', stack)
  16. else:
  17. print(message)
  18. def rpc_fun(pack_name):
  19. """
  20. 启动函数
  21. :return:
  22. """
  23. # 1. 转发frida端口
  24. os.system("adb forward tcp:27042 tcp:27042")
  25. # 2. 获取远程设备
  26. # frida.get_usb_device()
  27. # device = frida.get_remote_device()
  28. device = frida.get_usb_device(30)
  29. # 3. 获取当前活动进程PID
  30. # pid = device.get_frontmost_application()
  31. # 4. 创建进程会话
  32. # 可以是进程ID 可以是包名称
  33. # spawn 方式
  34. session = device.attach(pack_name)
  35. # device.resume(pid)
  36. # device.spawn()
  37. # import time
  38. # time.sleep(0.5)
  39. # 5. 添加js脚本
  40. script = session.create_script(JS_CODE, runtime='v8')
  41. # 6. 消息监听
  42. script.on('message', message_header)
  43. # 7. 加载会话
  44. script.load()
  45. return script
  46. script = rpc_fun('com.sankuai.meituan')
  47. if __name__ == '__main__':
  48. def signs():
  49. sign = script.exports.sign(
  50. 'GET http://apimeishi.meituan.com/meishi/poi/v2/poi/base/165084283 __reqTraceID=1836cb6d-3edf-4c81-a5db-669c800f55c6&__skck=6a375bce8c66a0dc293860dfa83833ef&__skno=53fa4673-9aaf-482e-a569-e8dfe841628c&__sksc=http&__skts=1624419415750&__skua=ad833c2aaae30d998fd1c17f0fa985bd&app=0&ci=10&lat=31.16323257273488&lng=121.39788326303479&msid=3525300824877941624417771385&partner=126&platform=4&userid=-1&utm_campaign=AgroupBgroupC0E219588781363871559889360393454496506688_a165084283_c0_e2890024514451550478Ghomepage_category2_1__a1__c-1024__gfood__hpoilist__i0&utm_content=352530082487794&utm_medium=android&utm_source=baidumobile&utm_term=666&uuid=000000000000087B47731EC5345FD9BDEC496780BAF59A162335056595179683&uuid=000000000000087B47731EC5345FD9BDEC496780BAF59A162335056595179683&version=9.6.6&version_name=9.6.6')
  51. print(sign)
  52. from concurrent.futures import ThreadPoolExecutor
  53. pool = ThreadPoolExecutor(max_workers=1000)
  54. for _ in range(1000):
  55. pool.submit(signs)
  56. pool.shutdown(wait=True)

Frida-RPC调用的更多相关文章

  1. 闲话RPC调用

    原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com 自SOA架构理念提出以来,应用程序间如何以最低耦合度通信的问题便呈现在所有架构师面前. 互联网系统的复杂度让我们不 ...

  2. RabbitMQ学习笔记5-简单的RPC调用

    利用空的queue名字("")让rabbitMQ生成一个唯一的队列名称,同时指定队列是:临时的(auto-delete).私有的(exclusive). 在发送的RPC调用消息里设 ...

  3. Hadoop学习记录(3)|HDFS API 操作|RPC调用

    HDFS的API操作 URL方式访问 package hdfs; import java.io.IOException; import java.io.InputStream; import java ...

  4. 使用RPC 调用NameNode中的方法

    用户在Client 端是很难对 NameNode中的信息进行直接访问的, 所以 ,在Hadoop系统中为 Client端 提供了一系列的方法调用,这些方法调用是通过RPC 方法来实现的, 根据RPC ...

  5. Unity3D RPC调用顺序问题

    使用Unity自带的Network实现多人协同任务时,因为使用RPC传递消息.RPC即远程过程调用,对于它的使用,第一反应的问题就是如果连续两次调用RPC,RPC的函数会顺序执行吗?还是只要RPC的消 ...

  6. 给Pomelo的聊天室添加time的RPC调用

    为了练手,给聊天应用增加一个rpc调用和一个time类型的服务器,在servers/time/remote/timeRemote.js中,添加如下代码: module.exports.getCurre ...

  7. [svc]简单理解什么是rpc调用?跟restapi有何区别?

    什么是rpc调用 restapi调用方式是对数据的crud. 常见的我们写flash写个api,或者借助django drf写个标准的resetapi,一个url可以借助httpget post pu ...

  8. RPC调用与GC垃圾回收

    RPC调用 多个服务协同完成一次业务时,由于业务约束(如红包不符合使用条件.账户余额不足等).系统故障(如网络或系统超时或中断.数据库约束不满足等),都可能造成服务处理过程在任何一步无法继续,使数据处 ...

  9. rpc调用过程

    在openstack中,各个组件之间的调用遵循RESTful风格,而组件内部各服务之间的相互调用采用rpc远程调用,比如nova-conductor和nova-compute rpc原理: 首先了解什 ...

  10. 浅谈RPC调用

    RPC英文全称remote procedure call 翻译成中文的意思就是远程过程调用.RPC的出现其实主要是为了解决分布式系统间的通信透明性的问题. 那什么是分布式系统的通信透明性问题?这个问题 ...

随机推荐

  1. 用C++实现的有理数(分数)四则混合运算计算器

    实现目标 用C++实现下图所示的一个console程序: 其中: 1.加减乘除四种运算符号分别用+.-.*./表示, + 和 - 还分别用于表示正号和负号. 2.分数的分子和分母以符号 / 分隔. 3 ...

  2. 手撕LRU缓存

    面试官:来了,老弟,LRU缓存实现一下? 我:直接LinkedHashMap就好了. 面试官:不要用现有的实现,自己实现一个. 我:..... 面试官:回去等消息吧.... 大家好,我是程序员学长,今 ...

  3. python 动图gif合成与分解

    合成 #!/usr/bin/env python3 # -*- coding: utf-8 -*- import os import sys import imageio def main(imgs_ ...

  4. 微信小游戏 Three.js UI 2D text 简单方案

    在微信小游戏中使用 THREE.js 引擎,没有合适的 UI 库可用,只能自己动手.图片啥的都还好,text 不好弄.text 要计算 width 和 height,不然事件响应范围不对. funct ...

  5. TCP超时重传、序列号、滑动窗口简介

    文章目录 12 TCP:传输控制协议(初步) 12.1 引言 12.1.1 ARQ和重传 12.1.2 分组窗口和滑动窗口 12.1.3 变量窗口:流量控制和拥塞控制 12.1.4 变量窗口:设置重传 ...

  6. Nginx:无处不在的Nginx的八个应用场景与配置

    --- 阅读时间约 15 分钟 --- Nginx概述 众所周知,互联网已经离不开  WEB服务器  ,技术领域中  WEB服务器  不止  Nginx  一个,其他还有很多如  Apache  . ...

  7. Jsoup快速查询

    一.selector选择器 二.Xpath查询

  8. linux关于profile 、bashrc 、.bash_profile、.bashrc的区别

    linux关于profile .bashrc ..bash_profile..bashrc的区别 - /etc/profile /etc/bashrc ~/.bash_profile ~/.bashr ...

  9. 从 1 开始学 JVM 系列 | JVM 类加载器(一)

    从 1 开始学 JVM 系列 类加载器,对于很多人来说并不陌生.我自己第一次听到这个概念时觉得有点"高大上",觉得只有深入 JDK 源码才会触碰到 ClassLoader,平时都是 ...

  10. python matplotlib.pyplot 条形图详解

    python matplotlib.pyplot 条形图详解 一.创建直方图 可以用bar函数来创建直方图 然后用show函数显示直方图 比如: import matplotlib.pyplot as ...