安卓协议逆向 咸鱼 frida rpc 调用方案

这篇具有很好参考价值的文章主要介绍了安卓协议逆向 咸鱼 frida rpc 调用方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 需求

通过frida rpc调用真机获取指定关键字的搜索结果数据。
本文仅供大家学习及研究使用、切勿用于各种非法用途。

2 rpc 简介

frida 提供了一种跨平台的 rpc (远程过程调用)机制,通过 frida rpc 可以在主机和目标设备之间进行通信,并在目标设备上执行代码,可实现功能如下:
1、动态地修改函数和方法的参数和返回值。
2、监视和拦截特定函数和方法的调用。
3、修改内存中的数据和指令。
4、与目标设备上的应用程序进行交互,发送和接收数据。
5、在运行时加载自己的 JavaScript 脚本,从而实现自定义的行为修改。

3 软硬件工具

app 版本:7.4.70
设备:K40 刷 piexl 11 rom
抓包工具:Charles
反汇编工具:JEB、JADX、IDA
inject:frida

4 抓包

POST /gw/mtop.taobao.idle.search.glue/8.0/ HTTP/1.1
x-sgext: JAfKISv0W5XonL3HUeX4UiH7EfgS%2BwL4F%2FIX8wL7F%2FoC%2BQ3%2FDfoN%2Bw37DfsN%2Bw37DfsN%2Bw35E%2BYQ5hL4DfkT5hHmEeYR5hHmEeYR5hHmEeYR5hHmEOYX%2Bg38EeYT%2Bg36DfoN%2BBnpEPwW%2BBH%2FF%2FoQ%2FQL6E6lA%2BhH6EPlH%2FRWoFvMT6RD%2FGekY6RL%2BAvoR%2BhbpEukQ6RDpEOkQ6RDpE%2BkQ6RP6AvkC%2FwKpAvoC%2BgL6AvoC%2BgLpROlHrwL6AqxEr0T6FukR%2BhH6EQ%3D%3D
umid: Y6mM0d1XDnwDAAZc4d8Tk60B
x-sign: azU7Bc002xAAJzB6M9wiB4WMskX6dzB3PW%2F64QfVy78rMahh4hODtL0DoF9kmgIWRqfEkGhlFlqjHfQDYE50A5EzkuewtzB3MLcwdz
x-nettype: WIFI
x-pv: 6.3
x-nq: WIFI
EagleEye-UserData: spm-cnt=a2170.8011571.0.0&spm-url=a2170.unknown.0.0
first_open: 1
x-features: 27
x-app-conf-v: 0
x-mini-wua: HHnB_QQx7EhGYzt0aRv0%2BjcjSfSTdMh9NXopIhtlxCcIGWkyEPONy4fMU296Q4NG4PEFmdynoG21RVXefkf%2Ff8G%2Fqlkl8cahX%2BEk3JT5GB2Uh4TNEqzzblgemWV%2Bitf42AKL%2FrWZLKkzalExnviNeICDt5A%3D%3D
content-type: application/x-www-form-urlencoded;charset=UTF-8
Content-Length: 630
x-t: 1672056548
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
x-bx-version: 6.5.56
f-refer: mtop
x-extdata: openappkey%3DDEFAULT_AUTH
x-ttid: 231200%40fleamarket_android_7.4.70
x-app-ver: 7.4.70
x-c-traceid: Y6mM0d1XDnwDAAZc4d8Tk60B16720565484910160126869
x-location: 0%2C0
x-umt: 2QMB7AlLPMcI7wKFTpWcJNO9Tq3ykFES
a-orange-q: appKey=21407387&appVersion=7.4.70&clientAppIndexVersion=1120221225203700833&clientVersionIndexVersion=0
x-utdid: Y6mM0d1XDnwDAAZc4d8Tk60B
x-appkey: 21407387
x-devid: AnlVbDHuTb2u0LWMPSEZxO4CdI4PNLcEAjN85BBOipB9
user-agent: MTOPSDK%2F3.1.1.7+%28Android%3B11%3BXiaomi%3BM2012K11AC%29
Host: g-acs.m.goofish.com
Accept-Encoding: gzip
Connection: Keep-Alive
data=%7B%22activeSearch%22%3Afalse%2C%22bizFrom%22%3A%22home%22%2C%22disableHierarchicalSort%22%3A0%2C%22forceUseInputKeyword%22%3Afalse%2C%22forceUseTppRepair%22%3Afalse%2C%22fromFilter%22%3Afalse%2C%22fromKits%22%3Afalse%2C%22fromLeaf%22%3Afalse%2C%22fromShade%22%3Afalse%2C%22fromSuggest%22%3Afalse%2C%22keyword%22%3A%22%E4%B8%9D%E8%A2%9C%22%2C%22pageNumber%22%3A1%2C%22resultListLastIndex%22%3A0%2C%22rowsPerPage%22%3A10%2C%22searchReqFromActivatePagePart%22%3A%22historyItem%22%2C%22searchReqFromPage%22%3A%22xyHome%22%2C%22searchTabType%22%3A%22SEARCH_TAB_MAIN%22%2C%22shadeBucketNum%22%3A-1%2C%22suggestBucketNum%22%3A27%7D

多次抓包,发现变化的字段有:

x-sgext、x-sign、x-mini-wua、x-c-traceid、x-t、Content-Length

5 参数分析

先从 x-sign 值入手, apk 包拖入 jadx 搜索,得到以下结果:

frida rpc,逆向分析,rpc,网络协议,网络

 一个个点进去查看,发现并没有有价值的东西,仅仅只是构建字段名等操作,并且我尝试 hook 这些点,并没有得到有用的信息,换 JEB 看看,反复搜索观察,最终定位到 getUnifiedSign 这个函数:

frida rpc,逆向分析,rpc,网络协议,网络

 

跟进查看它有三处调用点:

1

2

3

4

5

Lmtopsdk/security/ISign;->getUnifiedSign(Ljava/util/HashMap;Ljava/util/HashMap;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;)Ljava/util/HashMap;,,

Lmtopsdk/security/AbstractSignImpl;->getUnifiedSign(Ljava/util/HashMap;Ljava/util/HashMap;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;)Ljava/util/HashMap;,,

Lmtopsdk/security/InnerSignImpl;->getUnifiedSign(Ljava/util/HashMap;Ljava/util/HashMap;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;)Ljava/util/HashMap;,,

解析:
第 1 处定义了 ISign 的接口,并写了 getUnifiedSign 方法,代码有删减:

1

2

3

public interface ISign {

    HashMap getUnifiedSign(HashMap arg1, HashMap arg2, String arg3, String arg4, boolean arg5, String arg6);

}

第 2 处定义了一个抽象类 AbstractSignImpl 实现了 ISign 接口中的 getUnifiedSign 方法,当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。该处声明的为抽象类,并不需要实现接口,代码有删减:

1

2

3

4

5

6

public abstract class AbstractSignImpl implements ISign {

    @Override  // mtopsdk.security.ISign

    public HashMap getUnifiedSign(HashMap arg2, HashMap arg3, String appKey, String authCode, boolean useWua, String requestId) {

        return null;

    }

}

第 3 处定义了 InnerSignImpl 类继承 AbstractSignImpl,java中规定抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。InnerSignImpl 并不是抽象类,也可以看出它实现了 getUnifiedSign 方法,代码有删减:

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

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

52

53

54

55

public class InnerSignImpl extends AbstractSignImpl {

    @Override  // mtopsdk.security.AbstractSignImpl

    public HashMap getUnifiedSign(HashMap arg17, HashMap arg18, String appKey, String authCode, boolean useWua, String requestId) {

        String instanceId = this.c();

        if(appKey == null) {

            arg17.put("SG_ERROR_CODE""AppKey is null");

            TBSdkLog.e("mtopsdk.InnerSignImpl", instanceId + " [getUnifiedSign] AppKey is null.");

            return null;

        }

        if(arg17 == null) {

            TBSdkLog.e("mtopsdk.InnerSignImpl", instanceId + " [getUnifiedSign] params is null.appKey=" + appKey);

            return null;

        }

        if(this.f == null) {

            arg17.put("SG_ERROR_CODE""unified is null");

            TBSdkLog.e("mtopsdk.InnerSignImpl", instanceId + " [getUnifiedSign]sg unified sign is null, please call ISign init()");

            return null;

        }

        try {

            HashMap input = new HashMap();

            String data = (String)this.a(arg17, appKey, true).get("INPUT");

            boolean v10 = StringUtils.isBlank(data);

            if(v10) {

                TBSdkLog.e("mtopsdk.InnerSignImpl", this.c() + " [getUnifiedSign]get sign failed with sign data empty ""appKeyIndex=" + this.a.k + ",authCode=" + this.a.i);

                return null;

            }

            input.put("appkey", appKey);

            input.put("data", data);

            input.put("useWua", Boolean.valueOf(useWua));

            input.put("env", Integer.valueOf(this.d()));

            input.put("authCode", authCode);

            input.put("extendParas", arg18);

            input.put("requestId", requestId);

            input.put("api", arg17.get("api"));

            HashMap output = this.f.getSecurityFactors(input);

            if(output != null && !output.isEmpty()) {

                return output;

            }

            TBSdkLog.e("mtopsdk.InnerSignImpl", this.c() + " [getUnifiedSign]get sign failed with no output ""appKeyIndex=" + this.a.k + ",authCode=" + this.a.i);

        }

        catch(SecException v0_1) {

            TBSdkLog.e("mtopsdk.InnerSignImpl", this.c() + " [getUnifiedSign]get sign failed and SecException errorCode " + v0_1.getErrorCode() + ",appKeyIndex=" + this.a.k + ",authCode=" + this.a.i, v0_1);

        }

        catch(Throwable v0) {

            TBSdkLog.e("mtopsdk.InnerSignImpl", this.c() + " [getUnifiedSign]get sign failed exception ,appKeyIndex=" + this.a.k + ",authCode=" + this.a.i, v0);

        }

        return null;

    }

}

从该函数中不难发现里面包含了许多抓包中的参数信息,有理由怀疑程序就是在此处进行组包并请求信息的!

6 hook getUnifiedSign

分析到这了,先 hook 看看 getUnifiedSign 函数请求和返回都是些啥,hook 代码:

1

2

3

4

5

6

7

8

9

10

11

12

function main() {

    Java.perform(function () {

        var InnerSignImpl = Java.use("mtopsdk.security.InnerSignImpl");

        InnerSignImpl["getUnifiedSign"].implementation = function (params, ext, appKey, authCode, useWua, requestId) {

           console.log('\ngetUnifiedSign is called' + ', ' + '\nparams: \n' + params + '\n' + 'ext: \n' + ext + '\n' + 'appKey: \n' + appKey + '\n' + 'authCode: \n' + authCode + '\n' + 'useWua: \n' + useWua + '\n' + 'requestId: \n' + requestId);

            var ret = this.getUnifiedSign(params, ext, appKey, authCode, useWua, requestId);

            console.log('getUnifiedSign ret value is ' + ret);

            return ret;

        };

    });

}

setImmediate(main)

搜索关键字:黑丝。
结果:

getUnifiedSign is called,
params:
{data={"activeSearch":false,"bizFrom":"home","disableHierarchicalSort":0,"forceUseInputKeyword":false,"forceUseTppRepair":false,"fromFilter":false,"fromKits":false,"fromLeaf":false,"fromShade":false,"fromSuggest":false,"keyword":"黑丝","pageNumber":1,"resultListLastIndex":0,"rowsPerPage":10,"searchReqFromActivatePagePart":"searchButton","searchReqFromPage":"xyHome","searchTabType":"SEARCH_TAB_MAIN","shadeBucketNum":-1,"suggestBucketNum":27}, deviceId=AnlVbDHuTb2u0LWMPSEZxO4CdI4PNLcEAjN85BBOipB9, sid=null, uid=null, x-features=27, appKey=21407387, api=mtop.taobao.idle.search.glue, lat=0, lng=0, utdid=Y6mM0d1XDnwDAAZc4d8Tk60B, extdata=openappkey=DEFAULT_AUTH, ttid=231200@fleamarket_android_7.4.70, t=1672065081, v=8.0}
ext:
{pageId=, pageName=}
appKey:
21407387
authCode:
null
useWua:
false
requestId:
r_342
getUnifiedSign ret value is
{x-sgext=JAc6QkgEOGWLbN43MhWbokILcghxC2EIdAJ0A2EJdghhCW4PbgpuC24LbgtuC24LbgtuC24MdRZzFnQNbgx1FnIWchZyFnIWchZyFnIWchZyFnIWcxZzDncWcw53FnEWchZyFnACYQt0DXAKdwxyC3UZcgghW3IKcgtxXHUOIA17CGEJdgphA2EJdhlyCnINYQlhC2ELYQthC2ELYQhhC2EOcRlxGXUZcw5hCmEKYQphCmEKYRknGSRfYQphXCdfJwInGXIKcgpy, x-umt=2QMB7AlLPMcI7wKFTpWcJNO9Tq3ykFES, x-mini-wua=HHnB_LsOm2MbDDQX8pocsAv844s/AJ3eeRpQBvQ0ruCym5E4E9z73i+wqyWX+kYoOCLjd0M+Af0hvQxs8NJyeS1/+qAd+g60eGM0Y7snvKtTeCvVhBnNESbEFrPu+orzouidZjoRxOAXN2Cpe1icpSFPKMA==, x-sign=azU7Bc002xAAJAe6xWI/sfnl+vxS1Be0CqzNIjAW/Hwc8p+i1dC0d4rAl5xTWTXVcWTzU1+mIZmU3sPAV41DwKbwpS1llAe0BZQHtA}

参数都在这了,这就好办了,rpc 调用就能解决,注意这边的 data 数据是进行了 url 编码的,需进行进一步转化。文章来源地址https://www.toymoban.com/news/detail-729246.html

到了这里,关于安卓协议逆向 咸鱼 frida rpc 调用方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【粉丝福利社】Android应用安全实战:Frida协议分析(文末送书-完结)

    🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,51CTO博客专家等。 🏆《近期荣誉》:

    2024年04月09日
    浏览(65)
  • rpc、gRPC快速入门,python调用,protobuf协议

    远程过程调用协议RPC (Remote Procedure Call Protocol) RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据 举例:在 a服务内

    2024年02月13日
    浏览(55)
  • catface,使用Interface定义Controller,实现基于Http协议的RPC调用

    : Interface定义Controller;feign服务端;feign interface;Http RPC;cat-client;cat-server;catface; 概   要: catface ,使用类似 FeignClient 的Interface作为客户端发起Http请求,然后在服务端使用实现了这些Interface的类作为 Controller 角色,将客户端、服务端通过Interface耦合在一起,实

    2024年02月09日
    浏览(48)
  • Android逆向——过frida检测+so层算法逆向

    frida可以说是逆向里面很受欢迎的工具了,你可以在运行的时候得到几乎你想要的所有东西,函数地址、内存数据、java实例,根据我们的需要去修改程序的运行逻辑等等,但是太流行也不好,迎来了各种检测。 ptrace占坑、进程名检测、端口检测。(这绕过太简单了) D-Bus通信

    2024年01月17日
    浏览(49)
  • android frida 逆向 自吐加密算法

    前言: ♛  frida  hook   android   Android  逆向神器 前几天在学习 Android 逆向的时候发现了一个神器:通过  frida hook  我们可以 “劫持”   一些 函数 为我们所用, 今天就和大家上手一个  加密函数的劫持 让打印出: 加密秘钥 密文 效果如下:可以很直观的看出 加密算法以

    2024年02月11日
    浏览(49)
  • 网易易盾——推理拼图验证码参数逆向分析和调用

    本篇文章主要是对验证的提交参数进行逆向分析,成功演示结果在最底部 目标网址 抓包 提交分析 拖动提交参数 以下几个参数是会变动的,所以我们主要是对这几个参数进行分析 我们先直接拖动验证一下,看下请求发送,会发送一个check请求,再查看一下请求堆栈调用,所

    2024年02月13日
    浏览(56)
  • Android Spider App逆向 Frida - 夜神模拟器安装配置 基本使用

    Frida 是一款基于 Python + JavaScript 的 Hook 与调试框架,实现app逆向的强大工具; 模拟器下载安装教程:https://blog.csdn.net/EXIxiaozhou/article/details/127767808 提示:以下是本篇文章正文内容,下面案例可供参考 Frida是一款易用的跨平 Hook 工具, Java 层到 Native 层的 Hook 无所不能,是一种

    2024年01月24日
    浏览(48)
  • 安卓Frida hook脱壳环境配置过程

    本文记录开始于22/7/22/16:50 目的是记录安卓Android脱壳过程 使用Frida对360加固的apk进行脱壳 操作环境:win10+Android雷神模拟器 (1)Java JDK (2) Android SDK 平台工具软件包 下载:https://developer.android.com/studio/releases/platform-tools 配置:参考教程: http://t.csdn.cn/qXGXi (3)安卓模拟器

    2024年02月06日
    浏览(61)
  • 【逆向】03-20扩大节 c++代码完成 ;类当作函数参数却调用了析构函数疑难分析

    若要看PE结构操作最新代码,点击主页查看!!   和上一节的代码相比,本文章主要修复了上一篇文章代码中PE类中的Analyze函数,这样不管是Before_Stretch_Data还是Stretch_Data,Shrink_Data,在这个函数中都可以分析出PE结构 另外新添加了函数Expand_Section函数,可以自动扩大最后一个

    2024年02月07日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包