安卓逆向小案例——某map搜索接口【rpc调用】

本文详细介绍了如何分析并逆向安卓某map应用的搜索接口RPC调用过程,包括目标、实现步骤如apk准备、入口查找、参数构造与hook调用,以及在构造请求参数和响应处理中遇到的问题与解决策略。
摘要由CSDN通过智能技术生成

某map搜索接口rpc调用

爱好学习及分享,若文章侵权,优先联系本人删帖处理。

一、 目标:

通过输入搜索词和页码,获取相应的搜索数据

二、 实现
1. 下载apk并做好准备工作
  • 在豌豆荚下载对应版本的apk文件
  • 用平头哥去感染apk,生成新的apk,并将其安装至手机上
  • 再用jadx去反编译新生成的apk,生成android项目,便于查看代码(或者直接jadx打开apk)
2. 入口查找与分析
  • hook TextView
    // hook所有的TextView==>通过文本筛选,找到对应的实体对象(pojo)  
    String str = "格瑞斯"; // 这个最好是搜索之后显示出来比较特殊(名称)的的数据
    RposedBridge.hookAllMethods(TextView.class, "setText",  
    	new RC_MethodHook() {  
    		@Override  
    		protected void afterHookedMethod(MethodHookParam param) throws Throwable {  
    			super.afterHookedMethod(param);  
    			String textContent = null;  
    			for (Object obj: param.args) {  
    				if (obj instanceof CharSequence) {  
    					textContent = obj.toString();  
    					break; 
    				}
    			}  
    
    			if (textContent.contains(str)) {  
    				Log.i(TAG, "hint content:" + textContent, new Throwable());  
    			}  
    		}  
    	});
    
  • 通过查看堆栈找到setTextView或者生成实体对象的地方

在这里插入图片描述

  • 向上去找堆栈,找到 public static void a(PoiResult poiResult) {} 和public static void a(TextView textView, String str) {}两个比较符合预期的a方法,其中第1个传参为一个实例对象,第二个传参是TextView和String,优先关注第一个。
  • 这个时候直接用hook pojo(实体类)的方法hook PoiResult对象。
    // hook pojo == > public static void a(PoiResult poiResult) { ==> com.baidu.entity.pb.PoiResult
    RposedHelpers.findAndHookConstructor(
    	RposedHelpers.findClass("com.baidu.entity.pb.PoiResult", lpparam.classLoader),
    	new RC_MethodHook() { 
           	@Override  
    		protected void afterHookedMethod(MethodHookParam param) throws Throwable {  
           	    super.afterHookedMethod(param);  
    			Log.d(TAG, "afterHookedMethod: " + JSON.toJSONString(param.thisObject), new Throwable()); 
    		}  
       	});
    
  • 查看堆栈

在这里插入图片描述

  • 继续向上找
    // 向上找堆栈,可以看出getMessageLite是用于创建pojo,这个hook可以不用管,继续向上找堆栈,找网络层
    // 因为getMessageLite函数重写多个方法,采用RposedBridge hook所有的方法,并获取参数
    RposedBridge.hookAllMethods(
    	RposedHelpers.findClass("com.baidu.platform.comjni.tools.ProtobufUtils", lpparam.classLoader),
    	"getMessageLite", new RC_MethodHook() {
    		@Override
    		protected void afterHookedMethod(MethodHookParam param) throws Throwable {
    			super.afterHookedMethod(param);
                   // 定位到指定函数==>getMessageLite(java.lang.String, java.lang.String, byte[], int, int)  
    			Log.d(TAG, "getMessageLite: params = "+
    				JSON.toJSONString(ForceFiledViewer.toView(param.args())), new Throwable());
    		}
       });
    
  • 继续向上找,看hook pojo的堆栈,找这个com.baidu.platform.comapi.newsearch.SearcherImpl.getPBResultInternal(SourceFile:206),hook该方法,并打印结果
    // 这是通过线程获取的响应数据接口,这里有两种方式,1. 在该类下找请求发送的接口(一般情况下请求和响应的逻辑都会写在同一个类里面);2. 通过线程在往上找
    // com.baidu.platform.comapi.newsearch.SearcherImpl#getPBResultInternal
    RposedBridge.hookAllMethods(
    	RposedHelpers.findClass("com.baidu.platform.comapi.newsearch.SearcherImpl", lpparam.classLoader),
    	"getPBResultInternal", new RC_MethodHook() {
    		@Override
    		protected void afterHookedMethod(MethodHookParam param) throws Throwable {
    			super.afterHookedMethod(param);
    			Log.d(TAG, "getPBResultInternal: " + JSON.toJSONString(param.getResult()),
    				new Throwable());
    		}
    });
    
  • 查看日志输出

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

意识存在感

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值