学习笔记-RPC远程调用概念和实例
RPC远程调用概念和实例
- 一定要注意顺序,先hook,然后invoke,再rpc
- 逆向三段: 第三段RPC:Remote Procedure Call 远程调用
- FRIDA精髓:远程调动
- frida(rpc)多主机多手机多端口混连
- frida精髓:互联互通
- frida精髓:动态修改
- child-gating,上传P到C打印
0x01 RPC概念以及演示
- 概念
百度上的概念,rpc,远程过程调用,是一个节点向另一个节点请求提供服务 我的理解其实就是类似客户端向服务器发送一个请求,服务器那边有对应的接口,接受请求后,提供对应的服务,然后把结果返回客户端. - 演示 这里还是使用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远程调用概念和实例相关推荐
- EJB3.0学习笔记---理解远程调用服务端和本地调用服务端的区别
项目目的:理解远程调用服务端和本地调用服务端的区别 1.异常: javax.ejb.EJBException: Local and Remote Interfaces cannot hav ...
- python rpc调用_从0到1:全面理解 RPC 远程调用
上一篇关于 WSGI 的硬核长文,不知道有多少同学,能够从头看到尾的,不管你们有没有看得很过瘾,反正我是写得很爽,总有一种将一样知识吃透了的错觉. 今天我又给自己挖坑了,打算将 rpc 远程调用的知识 ...
- 从 0 到 1:全面理解 RPC 远程调用!
作者 | Python编程时光 责编 | 胡巍巍 什么是RPC呢?百度百科给出的解释是这样的:"RPC(Remote Procedure Call Protocol)--远程过程调用协议,它 ...
- zookeeper 密码_「附源码」Dubbo+Zookeeper 的 RPC 远程调用框架
技术博文,及时送达 作者 | 码农云帆哥 链接 | blog.csdn.net/sinat_27933301 上一篇:从零搭建创业公司后台技术栈 这是一个基于Dubbo+Zookeeper 的 RPC ...
- Sharepoint学习笔记---Sandbox Solution-- Full Trust Proxy--开发实例之(2、在Webpart中访问Full Trust Proxy)...
上一篇Sharepoint学习笔记---Sandbox Solution-- Full Trust Proxy--开发实例之(1.创建一个能访问DataBase的Full Trust Proxy), ...
- vue学习笔记-03-浅谈组件-概念,入门,如何用props给组件传值?
vue学习笔记-03-浅谈组件-概念,入门,如何用props给组件传值? 文章目录 vue学习笔记-03-浅谈组件-概念,入门,如何用props给组件传值? 什么是组件? 为什么要使用组件? 如何使用 ...
- 远程过程调用失败_Java开发大型互联网RPC远程调用服务实现之问题处理方案
引言 RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议 ...
- Rpc远程调用框架的设计与实现(1)
Rpc远程调用框架的设计与实现 1 Rpc远程调用框架设计概述 1.1 研究背景 1.1.1传统的Web开发方式 在传统的Web应用程序中,一般都是采取请求→刷新→显示的模式.即每当用户通过单击 ...
- 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 ...
最新文章
- UOJ37. 【清华集训2014】主旋律
- win10系统 计算机配置要求高吗,win10配置要求_win10配置要求高吗-太平洋电脑网
- IntelliJ IDEA 如何创建一个普通的java项目,及创建java文件并运行
- php 正则特殊字符转义,php 正则特殊字符转义的方法
- mysql多线程使用一个链接_探索多线程使用同一个数据库connection的后果
- javasript模块化
- c mvc html 选中删除,在 MVC htmlAttribute中,如何设置被禁用_CSharp_开发99编程知识库...
- 多人聊天、预约会议,FaceTime登录Windows和Android系统
- 工具解析:杀毒引擎惨遭打脸,黑帽大会爆惊天免杀工具
- java有push方法么_[Java教程]js中push和join方法使用介绍
- slf4j没有在linux中生成日志,logback+SLF4J 没打印日志
- 【数据结构和算法笔记】用c和c++分别实现二叉搜索树
- MySQL表中插入中文数据时出错
- EF+泛型修改方法(查询修改和不查询修改)
- python 虚拟环境 windows_Python虚拟环境(Windows版)
- java反编译工具(XJad)
- Uml工具StarUML破解
- [译] Vue 最黑暗的一天
- 计算机图形学椭圆Java代码,【计算机图形学】二、椭圆的生成
- 物联网环境监测数据中心-物联网项目开发