一、定位到关键代码
第一次尝试
首先想到使用adb shell dumpsys activity top
代码
获取朋友圈界面的Activity,com.tencent.mm/.plugin.sns.ui.SnsUploadUI
,直接反编译微信得到源码
第二次尝试
然后发现代码实在太多,很难浏览,然后想到DDMS的轨迹追踪功能,我们录取一个发表朋友圈的轨迹,查找OnClick方法,果然找到一个OnMenuItemClick
直接搜索这个方法
无奈代码还是太多,感觉很难继续分析下去
第三次尝试
这里考虑到使用DDMS的Dump View Hierarchy for UlAutomator功能,首先微信进入发送朋友圈的界面,然后dump
最后找到“测试测试”对应的id,然后通过搜索findViewById,得到了关键的代码
分析znn的调用情况
没有发现函数的调用,但是发现了一个赋值,那就搜索一下this.desc
果然找到一个赋值,但是当我们开始分析zno的a方法时,发现他只是一个接口
既然如此,那就只能考虑搜索zno类的赋值了,全局搜索一下,查看每一个赋值操作
终于找到关键的类QA
QA这里先对传入的参数进行了判断,然后返回对应的类实例
this.ziU=0时:
this.ziU=14时:
这里应该已经可以猜测这个参数和朋友圈发送的方式有关系了,继续分析ziU的值
使用frida脚本打印一下各种情况的this.ziU参数
import frida
import sys
jscode ='''
Java.perform(function(){
var SnsUploadUI = Java.use('com.tencent.mm.plugin.sns.ui.SnsUploadUI');
var ao = SnsUploadUI.ao.overload("android.os.Bundle");//重载
ao.implementation = function(bundle)
{
var ret = ao.call(this, bundle);//调用方法获取返回值
send("sns type = " + this.ziU.value);//打印ziU的值
return ret;
}
}
);
'''
def message(message,data):
if message["type"] == 'send':
print("[*] {0}".format(message["payload"]))
else:
print(message)
process = frida.get_remote_device().attach("com.tencent.mm")
script = process.create_script(jscode)
script.on("message",message)
script.load()
sys.stdin.read()
最后总结如下:
9:纯文本动态
,0:纯图片、图片+文字动态
,14:纯视频、视频+文字动态
由于微信不支持视频加图片,所以没有进行这个测试