RPC远程调用概念和实例

  1. 一定要注意顺序,先hook,然后invoke,再rpc
  2. 逆向三段: 第三段RPC:Remote Procedure Call 远程调用
  3. FRIDA精髓:远程调动
  4. frida(rpc)多主机多手机多端口混连
  5. frida精髓:互联互通
  6. frida精髓:动态修改
  7. child-gating,上传P到C打印

0x01 RPC概念以及演示

  1. 概念
    百度上的概念,rpc,远程过程调用,是一个节点向另一个节点请求提供服务 我的理解其实就是类似客户端向服务器发送一个请求,服务器那边有对应的接口,接受请求后,提供对应的服务,然后把结果返回客户端.
  2. 演示 这里还是使用lesson4one的那个app作为讲解,这样实际操作之后我对这个rpc有了更深理解,感受到思路的精妙,太强了,先放代码,首先创建了一个lesson7lesson4.js文件,里面的js代码是这样的:

function invoke()
{
Java.perform(function(){
Java.choose("com.example.lesson4one.MainActivity",{
onMatch:function(instance){
console.log("found instance",instance);
console.log("found instance:",instance.secret());
},onComplete:function(){}
})
})
}
//setTimeout(voke,2000)
rpc.exports={
invokefunc:invoke
}

这里的invoke不就是平时主动调用的代码吗,神奇在下面的rpc.exports这段代码,这段代码直接把这个函数封装成了一个可以被本地python调用的函数,本地python通过调用这个函数不就实现了rpc,客户端(Pc)调用了服务器(手机)上的函数(服务)吗?太妙了,前提是一定要先hook,然后主动调用hook的方法,然后在rpc,这里顺序不能乱!,创建一个python文件

import time
import frida
def my_message_handler(message,payload):
print(message)
print(payload)
device=frida.get_usb_device()
#pid=device.spawn(["com.example.lesson4one"])
#device.resume
#time.sleep(1)
#session=device.attach(pid)
session=device.attach("com.example.lesson4one")
with open("lesson7lesson4.js") as f:
script=session.create_script(f.read())
script.on("message",my_message_handler)
script.load()
command=""
while True:
command=input("Enter Command:")
if command=="1":
break
elif command=="2":
script.exports.invokefunc()

0x02 frida(rpc)多主机多手机多端口混连

device=frida.get_device_manager().add_remote_device(“ip:port”) 其实就是用无线来连接,实现混连 # 0x03 frida互联互通和动态修改 这里肉丝重新写了一个lesson7sec的app,主活动大概是这样的

package com.example.lesson7sec;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
EditText username_et;
EditText password_et;
TextView message_tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
password_et = (EditText) this.findViewById(R.id.editText2);
username_et = (EditText) this.findViewById(R.id.editText);
message_tv = ((TextView) findViewById(R.id.textView));
this.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (username_et.getText().toString().compareTo("admin") == 0) {
message_tv.setText("You cannot login as admin");
return;
}
//hook target
message_tv.setText("Sending to the server :" + Base64.encodeToString((username_et.getText().toString() + ":" + password_et.getText().toString()).getBytes(), Base64.DEFAULT));
}
});
}
}

发现就是一个很平常的登陆界面,一个用户名一个密码,不过这里有个限制,输入账号和密钥后,直接点击登陆后,先判断用户名是否为admin,只有不是admin用户才能使用这个登陆框登陆,不过这题的意思就是为了打破这个限制,使得用户名可以输入admin,进行登陆,主要的操作逻辑在于hook这个setText方法,先把参数取出来,然后发送消息,给本地的python的代码进行处理,处理完后,再响应回去,再调用原方法,偷梁换柱 ,至于写法都是固定的,直接搬过来,改动一下就好了

先放个js代码,这里和rpc不同的是,不需要function作为外壳了,直接以Java.perform作为一个主体

Java.perform(function()
{
Java.use("android.widget.TextView").setText.overload("java.lang.CharSequence").implementation=function(x){
var string_to_send_x=x.toString();
var string_to_recv;
//console.log("arg :x",x.toString());
send(string_to_send_x);
recv(function(received_json_objection){
string_to_recv=received_json_objection.my_data
console.log("string_to_recv"+string_to_recv)
}).wait();
var javaStringToSend=Java.use("java.lang.String").$new(string_to_recv);
var result=this.setText(javaStringToSend);
console.log("x.toString(),result",x.toString(),result);
return result;
}
})

python的代码,处理的主要过程在python这里

import time
import frida
import base64
def my_message_handler(message,payload):
print(message)
print(payload)
if message["type"]=="send":
print(message["payload"])
data=message["payload"].split(":")[1].strip()
print("message",message)
data=str(base64.b64decode(data))
print("data:",data)
usr,pw=data.split(":")
print("pw:",pw)
data=str(base64.b64encode(("admin"+":"+pw).encode()))
print("encode data:",data)
script.post({"my_data":data})
print("Modified data sent!")
device=frida.get_usb_device()
#device=frida.get_device_manager().add_remote_device("ip:port")
#pid=device.spawn(["com.example.lesson4one"])
#device.resume
#time.sleep(1)
#session=device.attach(pid)
session=device.attach("com.example.lesson7sec")
with open("lesson7sec.js") as f:
script=session.create_script(f.read())
script.on("message",my_message_handler)
script.load()
input()

点击关注,共同学习!
[安全狗的自我修养](https://mp.weixin.qq.com/s/E6Kp0fd7_I3VY5dOGtlD4w)

[github haidragon](https://github.com/haidragon)

https://github.com/haidragon

学习笔记-RPC远程调用概念和实例相关推荐

  1. EJB3.0学习笔记---理解远程调用服务端和本地调用服务端的区别

    项目目的:理解远程调用服务端和本地调用服务端的区别 1.异常:       javax.ejb.EJBException: Local and Remote Interfaces cannot hav ...

  2. python rpc调用_从0到1:全面理解 RPC 远程调用

    上一篇关于 WSGI 的硬核长文,不知道有多少同学,能够从头看到尾的,不管你们有没有看得很过瘾,反正我是写得很爽,总有一种将一样知识吃透了的错觉. 今天我又给自己挖坑了,打算将 rpc 远程调用的知识 ...

  3. 从 0 到 1:全面理解 RPC 远程调用!

    作者 | Python编程时光 责编 | 胡巍巍 什么是RPC呢?百度百科给出的解释是这样的:"RPC(Remote Procedure Call Protocol)--远程过程调用协议,它 ...

  4. zookeeper 密码_「附源码」Dubbo+Zookeeper 的 RPC 远程调用框架

    技术博文,及时送达 作者 | 码农云帆哥 链接 | blog.csdn.net/sinat_27933301 上一篇:从零搭建创业公司后台技术栈 这是一个基于Dubbo+Zookeeper 的 RPC ...

  5. Sharepoint学习笔记---Sandbox Solution-- Full Trust Proxy--开发实例之(2、在Webpart中访问Full Trust Proxy)...

    上一篇Sharepoint学习笔记---Sandbox Solution-- Full Trust Proxy--开发实例之(1.创建一个能访问DataBase的Full Trust Proxy), ...

  6. vue学习笔记-03-浅谈组件-概念,入门,如何用props给组件传值?

    vue学习笔记-03-浅谈组件-概念,入门,如何用props给组件传值? 文章目录 vue学习笔记-03-浅谈组件-概念,入门,如何用props给组件传值? 什么是组件? 为什么要使用组件? 如何使用 ...

  7. 远程过程调用失败_Java开发大型互联网RPC远程调用服务实现之问题处理方案

    引言 RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议 ...

  8. Rpc远程调用框架的设计与实现(1)

    Rpc远程调用框架的设计与实现 1   Rpc远程调用框架设计概述 1.1  研究背景 1.1.1传统的Web开发方式 在传统的Web应用程序中,一般都是采取请求→刷新→显示的模式.即每当用户通过单击 ...

  9. RPC远程调用(RMI的方式实现RPC、HttpClient实现RPC远程调用)

    RPC是什么? 2.3RPC实现的技术: 3:RMI实现RPC远程调用: 3.1RMI介绍 3.2RMI实现vip访问orders 3.2.1开发服务生产者(provider) 3.2.1.1创建or ...

最新文章

  1. UOJ37. 【清华集训2014】主旋律
  2. win10系统 计算机配置要求高吗,win10配置要求_win10配置要求高吗-太平洋电脑网
  3. IntelliJ IDEA 如何创建一个普通的java项目,及创建java文件并运行
  4. php 正则特殊字符转义,php 正则特殊字符转义的方法
  5. mysql多线程使用一个链接_探索多线程使用同一个数据库connection的后果
  6. javasript模块化
  7. c mvc html 选中删除,在 MVC htmlAttribute中,如何设置被禁用_CSharp_开发99编程知识库...
  8. 多人聊天、预约会议,FaceTime登录Windows和Android系统
  9. 工具解析:杀毒引擎惨遭打脸,黑帽大会爆惊天免杀工具
  10. java有push方法么_[Java教程]js中push和join方法使用介绍
  11. slf4j没有在linux中生成日志,logback+SLF4J 没打印日志
  12. 【数据结构和算法笔记】用c和c++分别实现二叉搜索树
  13. MySQL表中插入中文数据时出错
  14. EF+泛型修改方法(查询修改和不查询修改)
  15. python 虚拟环境 windows_Python虚拟环境(Windows版)
  16. java反编译工具(XJad)
  17. Uml工具StarUML破解
  18. [译] Vue 最黑暗的一天
  19. 计算机图形学椭圆Java代码,【计算机图形学】二、椭圆的生成
  20. 物联网环境监测数据中心-物联网项目开发

热门文章

  1. git查看分支、创建分支、合并分支
  2. filter过滤器,filterchain的dofilter方法
  3. 使用 Python时常用的安装包
  4. 歪写数学史(分析的化身——欧拉)
  5. 平面设计的十大好处。
  6. 贪吃蛇智能版(专家)
  7. 最优化算法数学详解之——梯度下降法和牛顿迭代法
  8. ECOLOGY9人力资源条件 字段数据库存储结构分析
  9. 王老西谈领导力(1)-看了这个,你就知道什么是领导力了
  10. PL2303驱动程序不支持WINDOWS 11及后续版本的解决办法