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. 求方程 p+q+r+s+t=pqrst 的全体自然数解(约定p<=q<=r<=s<=t)

    解:方程左右的表达式分别记为u和v. 由题设有5t>=u. 0本来是不算入自然数的,现在的趋势是把0也算作自然数. 若p=0,则v=0,为使得u=0成立,q.r.s.t都必需为0. 这样就得到方 ...

  2. SpringMVC笔记(3)

    一.SpringMVC 拦截器 1.1 快速入门 步骤 创建拦截器类实现HandlerInterceptor接口 public class MyInterceptor01 implements Han ...

  3. css之px、em、rem

    rem是css3新定义的设置字体大小属性,常用的两种字体大小设置有下面2种:1. px为单位2.em为单位(百分比用法跟em类似) PX为单位 在Web页面初期制作中,我们都是使用"px&q ...

  4. <题解>「LibreOJ NOIP Round #1」序列划分

    solutions 题面loj#542 对我来说,这或许已经超出了我的能力,我,只能看题解 不知道我写完这一篇题解之后,会不会对我的构造题有一点点的帮助 让我在这类题的解决上能过有一些提升 直接说明白 ...

  5. K8S日常运维中关于“ImagePullBackOff”报错的处理思路分析

    故障案例: 发现故障:kubectl get pod -n kube-system -owide|grep -v "Running"NAME READY STATUS RESTAR ...

  6. Jenkins(4)- 在centos7.x下完全卸载Jenkins

    如果想从头学起Jenkins的话,可以看看这一系列的文章哦 https://www.cnblogs.com/poloyy/category/1645399.html 先关闭tomcat ./shutd ...

  7. PULPino datasheet中文翻译并给了部分论文注释(前四章:Overview、Memory Map、CPU Core、Advanced Debug Unit)

    参考: (1).PULPino datasheet:https://github.com/pulp-platform/pulpino/blob/master/doc/datasheet/datashe ...

  8. Python - 虚拟环境 venv

    什么是虚拟环境 这是 Python 3.3 的新特性:https://www.python.org/dev/peps/pep-0405/ 假设自己电脑主机的 Python 环境称为系统环境,而默认情况 ...

  9. 测试平台系列(55) 引入AceEditor(代码编辑器)

    大家好,我是米洛,求三连!求关注测试开发坑货! 回顾 我们上一节已经写好了左侧数据表目录,今天继续完成sql编辑器的部分. 调研组件 monaco 因为我们的项目用的是React,市面上很多编辑器都是 ...

  10. 【C++基础教程】第二课

    一,上次的课后练习答案 1,输出1+2=3 2,输出2 2.25 2.25 2.25 3,第一空iostream或bits/stdc++.h 第二空main(),main(void)或main(int ...