上一节我们已经拿到了视频号个人主页信息 但是发现传过来的用户名是一个以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 (根据经验每个业务都会有这个响应函数)
然后根据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 无法反编译出它的构造函数
不过没关系 只需要找到这个调用的构造函数方法就行了:手动查找引用 或者 动态的打印堆栈
跟踪可以发现它
是在一个线程里面去执行~(在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口)
往上看 可以看到视频号搜索 是通过线程池投递执行的 所以我们只需要构造C83787X这个类就可以执行了~
用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;
};
可以看到很多参数 无关紧要的就先不构造 主要是 需要拿到用户名是哪个
完整调用代码如下:
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了 待续