某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()); } });
- 查看日志输出