behindeye 发表于 2021-9-26 00:29

实现Xposed的Rpc远程调用

# 实现Xposed的Rpc远程调用

>某些App的加解密算法,分析起来十分费劲,分析下来也十分耗时,基于xposed的话,可以知道代码调用流程,我们只需传参进去,hook对应方法或者调用内部某个函数,则可以获取加密之后的sign、key、cookie等



## 一、搭建 Android 端 Server

### 1、NanoHTTPD介绍

> 官方介绍:*NanoHTTPD* is a light-weight HTTP server designed for embedding in other applications, released under a Modified BSD licence.(*NanoHTTPD*是一个轻量级的 HTTP 服务器,设计用于嵌入其他应用程序,在修改后的 BSD 许可下发布 by Google翻译)
>
> Github地址:https://github.com/NanoHttpd/nanohttpd

### 2、引入代码

两种方式,第一种把官网的代码`clone` 下来,然后 `copy` 放到工程;第二种使用别人适配过的库。博主这里使用第二种方式,更加快捷些。

在`gradle`里面添加依赖

```
implementation 'org.nanohttpd:nanohttpd:2.2.0'
```



### 3、启动服务

```
//自定义一个Server继承NanoHTTPD
public class AndroidWebServer extends NanoHTTPD {

    public AndroidWebServer(int port) throws IOException {
      super(port);
    }

    @Override
    public Response serve(IHTTPSession session) {
      String msg = "<html><body><h1>Hello AutoPy</h1>\n";
      Map<String, String> parms = session.getParms();
      if (parms.get("code") == null) {
            msg += "<form action='?' method='get'>\n<p>Your code: <input type='text' name='code'></p>\n" + "</form>\n";
      } else {
            msg += "<p>Hello, " + parms.get("code") + "!</p>";
            return newFixedLengthResponse(msg + "</body></html>\n");
      }
      return newFixedLengthResponse(msg + "</body></html>\n");

    }
}
```

```
//启动服务
new AndroidWebServer().start();
```



## 二、搭配Xposed插件使用

### 1、hook时机

在 `Application` 的 `onCreate` 方法,进行注入,同时启动服务

```
XposedHelpers.findAndHookMethod(Application.class, "onCreate", new XC_MethodHook() {
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                  super.beforeHookedMethod(param);
                }

                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                  super.afterHookedMethod(param);
         
                  String currentProcessName = ProcessUtil.getCurrentProcessName(Ct);
                  log("进程:" + currentProcessName);

                  //启动Server
                  if ("com.xxx.xxx".equals(currentProcessName)) {
                        // 监听 8000 端口
                        new AndroidWebServer(8000);
                  } else {
                     // 对于多进程,监听进程ID
                        new AndroidWebServer(Process.myPid());
                  }
                }
            });
```

### 2、adbforward

手机安装完插件之后,确保手机`usb`连接上电脑(wifi模式可以不连),然后验证手机是否连接上电脑,可执行以下adb命令:

```
adb devices
```

!(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e75ad585697342688999bfe2976be2a7~tplv-k3u1fbpfcp-zoom-1.image)

执行`adb forward` 命令

> adb forward的细节:https://blog.csdn.net/u013553529/article/details/80036227

下图,摘抄上面文章

!(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bad7799569974c8fa2d8ac8c92fa0d61~tplv-k3u1fbpfcp-zoom-1.image)

```
adb forward tcp:8000 tcp:8000
```

!(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6c37qLMAxtNtLbgtevQ3s5MGcmkMZDA5PBzk~tplv-k3u1fbpfcp-zoom-1.image)

### 3、验证Server

在手机和电脑在**同一个局域网**的情况下,打开网址:http://127.0.0.1:8000/ ,如果正常显示一个网页 ,则配置成功

## 三、搭配花生壳的内网穿透

搭配花生壳的内网穿透,实现**外网访问**(也就是别人电脑也能访问你的接口),记住选择 `HTTP` 的映射类型,此时需要给 6 Rmb 的认证费用,其他免费。对于我这种需求简单的,目前测试还是完全够用。

!(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/091c5101c9624572925c5d3ddba066d1~tplv-k3u1fbpfcp-zoom-1.image)

配置完成之后,会给你一个**外网域名**,你就可以访问你的接口了

!(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8da382d25232487fb6305e37a8488d10~tplv-k3u1fbpfcp-zoom-1.image)

验证外网域名

!(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/499377e45942434eb9865018dbb52918~tplv-k3u1fbpfcp-zoom-1.image)

china08 发表于 2021-9-26 06:17

思路挺好,学习学习

爱的天使 发表于 2021-9-26 06:29

路过,看一看,学习下!

cjc3528 发表于 2021-9-26 07:57

膜拜技术大佬,谢谢分享

Juce 发表于 2021-9-26 08:22

膜拜技术大佬,谢谢分享

ljpzl1984 发表于 2021-9-26 09:06

膜拜技术大佬,学习ing

思念曹操 发表于 2021-9-26 09:08

感谢分享,认真学习{:1_893:}

blindcat 发表于 2021-9-26 17:10

向大佬学习

ming1993vip 发表于 2021-9-26 22:13

如果在详细一点就更好了

ZLJ13697750126 发表于 2021-9-27 15:40

感谢分享,认真学习
页: [1] 2
查看完整版本: 实现Xposed的Rpc远程调用