【Android视频号② 搜索用户】

上一节我们已经拿到了视频号个人主页信息 但是发现传过来的用户名是一个以V2开头的数据 接下来我们就需要根据用户名去获取V2数据

DDMS问题

上一节根据ddms 可以很好的定位到视频号触发点
但是很多人会遇到一个问题就是 Monitor 使用

  • 如果打开报错 需要装Java1.8 版本太高了不行
  • 如果找不到进程名 需要使其 getprop ro.debuggable 查询为0 [Android修改ro.debuggable 的四种方法]
  • monitor 工具路径 一般在 C:\Users\admin\AppData\Local\Android\Sdk\tools\lib\monitor-x86

分析定位

当我们不知道哪个是执行函数的时候就可以找响应函数:onGYNetEnd (根据经验每个业务都会有这个响应函数)
【Android视频号② 搜索用户】_第1张图片
然后根据ddms确定是哪个响应 写出frida 代码

Java.use("com.tencent.mm.plugin.websearch.a.ac");
C83728ac["onGYNetEnd"].implementation = function (i, i2, i3, str, interfaceC22814t, bArr) {
    console.log('onGYNetEnd is called' + ', ' + 'i: ' + i + ', ' + 'i2: ' + i2 + ', ' + 'i3: ' + i3 + ', ' + 'str: ' + str + ', ' + 'interfaceC22814t: ' + interfaceC22814t + ', ' + 'bArr: ' + bArr);
    let ret = this.onGYNetEnd(i, i2, i3, str, interfaceC22814t, bArr);
    console.log('onGYNetEnd ret value is ' + ret);
    return ret;
};

经过调试 每次搜索信息都会调用这里 所以我们可以根据他的构造函数 看看是哪里调用
不幸的是jadx 无法反编译出它的构造函数
【Android视频号② 搜索用户】_第2张图片

不过没关系 只需要找到这个调用的构造函数方法就行了:手动查找引用 或者 动态的打印堆栈
跟踪可以发现它
是在一个线程里面去执行~(在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口)
【Android视频号② 搜索用户】_第3张图片
往上看 可以看到视频号搜索 是通过线程池投递执行的 所以我们只需要构造C83787X这个类就可以执行了~
【Android视频号② 搜索用户】_第4张图片
【Android视频号② 搜索用户】_第5张图片
用gson 打印参数

  Java.openClassFile('/data/local/tmp/r0gson.dex').load()
  const gson = Java.use('com.r0ysue.gson.Gson')
  
  let C83797b = Java.use("com.tencent.mm.plugin.websearch.b$b");
C83797b["b"].implementation = function (c83787x) {
    console.log('b is called' + ', ' + 'c83787x: ' + gson.$new().toJson(c83787x));
    let ret = this.b(c83787x);
    console.log('b ret value is ' + ret);
    return ret;
};

可以看到很多参数 无关紧要的就先不构造 主要是 需要拿到用户名是哪个
【Android视频号② 搜索用户】_第6张图片
完整调用代码如下:

   var query = '李白'
 // 执行额外参数构造函数 实例化对象
    let C83787x = Java.use('com.tencent.mm.plugin.websearch.a.x')
    var qeyObj = C83787x.$new()
    qeyObj.iEb.value = query
    qeyObj.offset.value = 0
    qeyObj.businessType.value = 33554434 // 0
    qeyObj.scene.value = 123
    qeyObj.amQm.value = ''
    qeyObj.amQo.value = 0
    qeyObj.amQn.value = ''
    qeyObj.amQy.value = ''
    // c83787x.amQk = C83867h.m24156a(map, "isHomePage", false) ? 1 : 0;
    qeyObj.amQk.value = 0
    qeyObj.GeQ.value = ''
    qeyObj.sessionId.value = '7805274457003576069'
    qeyObj.jbU.value = 1
    qeyObj.amQq = 2
    qeyObj.amQr.value = 0
    qeyObj.amQs.value = ''
    qeyObj.iUD.value = '359eeeea-44f5-42fd-9788-9e1b8f2094a2'
    qeyObj.jbQ.value = '7805274457003576069'
    qeyObj.amQz.value = ''
    qeyObj.amQC.value = false
    qeyObj.amQG.value = 0
    qeyObj.jbN.value = 180828080
    qeyObj.language.value = 'zh_CN'
    qeyObj.subtype.value = 0
    qeyObj.amQw.value = 0
    qeyObj.amQB.value = 0
    qeyObj.iEs.value = ''

    // 执行构造函数 实例化对象
    var FinderWebsearchClass = Java.use('com.tencent.mm.plugin.websearch.b')
    var myfinderwebsearch = FinderWebsearchClass.$new()
    log('初始化成功!!!!') 
    log('开始调用刷新请求.......')
    //刷新请求
    myfinderwebsearch.amOe.value.b(qeyObj)
    log('搜索完成!')

感觉这样分析起来还是蛮简单的~~
但是会有个问题就是构造参数没有原生的的完整 这样可能就会触发风控
如果想找其他hook点 还得往上找一下~ 就是只接受一个简单的入参 其他的让WeChat自己组参

好了接下来就是开始编写Xposed了 待续

你可能感兴趣的:(逆向学习,微信视频号,视频号分析,DDMS,视频号逆向,微信frida)