一、分析微信分享功能的流程
如果我们自己的应用突然有一天想接入微信分享功能,这个功能是可以把应用的短视频分享到朋友圈或者好友,这样用户体验好而且传播速度也快,当然短视频上一定要有水印,那有的同学会好奇怎么不直接分享短视频链接呢?这个大家都懂得,微信有时候很任性让你没法分享,所以今天就直接来看那种被微信屏蔽分享的能否直接分享本地短视频呢?我们先看看微信分享功能怎么使用,这个直接去官网下载他的分享SDK包,然后调用指定的方法即可,我们看到这个类:
这里看到视频分享可以接受一个视频链接,但是这个并不是我们想要的,因为这个不是分享应用本地视频,不过通过测试,把这个videoUrl填写成本地的视频地址,也能分享成功,但是打开还是一个页面所以就会出现错误。所以这个类不是我们想要的,那么我们就没办法继续探究了吗?真的不能分享应用本地短视频吗?我们可以这么做,就是分析微信分享的整个流程了,这个比较简单,直接查看他的jar即可:
我们在用Jadx打开微信搜索这个类:
继续看他的父类:
这里有一个intent检测,我们也看到这里有很多日志信息,因为通过后面的代码跟踪我们发现很麻烦,所以我们这么做通过放开微信的日志信息来快速的定位代码位置,这里看到有一个日志类:
所以我们直接用Xposed拦截这些日志方法,然后把参数信息打印就可以了:
然后我们运行Xposed模块,在去启动微信分享看看日志流程是什么:
我们看到这些信息了,其实前面还有:
再往前就是我们的分享入口类:
而我们可以用adb shell dumpsys activity top 查看分享的当前页面是啥:
然后查看日志信息也有这个类:
所以微信分享其实是有几个页面Activity进行中转了,而这个也是我们跟踪的点,不要盲目的去跟踪,我们只需要跟踪页面即可:WXEntryActivity->UIEntryStub->SendAppMessageWrapperUI->SnsUploadUI 我们要是想看分享页面的信息,可以从SendAppMessageWrapperUI这个页面开始分析:
不过看到这里反编译代码失败了,这里我们可以设置Jadx的一个选项就好了:
保存就可以看到代码了:
然后开始分析会看到下面一个函数代码:
看到这里就是构造intent参数,然后启动分享页面了,看看构造intent参数结构:
我们要想知道分享视频到朋友圈需要哪些参数,可以拦截页面打印Intent中的所有参数值:
运行之后我们分享本地一个短视频看看日志信息:
看到了如果分享短视频就是这么几个参数,其中:
Ksnsupload_type=14:固定值表示分享的是短视频类型
sight_md5:短视频文件的MD5值
KSightPath:短视频本地路径
KSightThumbPath:短视频的封面图
然后在回到之前构造intent的分享参数地方之后发现,分享类型是38或者39都是走视频逻辑,并且视频路径从分享对象WXFileObject的filePath字段中获取:
而视频的封面图和MD5都是自己内部计算的,也就是说我们用微信分享理论上是可以支持的,在回到我们自己的分享代码中:
这个时候看到微信分享SDK中的确有这个类可以用,那么我们就构造一下,然后运行看看是否能分享成功:
可惜的是分享失败,通过微信内部日志发现,分享文件不支持:
在回到微信SDK内部查看WXFileObject这个类的type是多少:
看到了这里直接把type写死是6了,也就是说虽然微信开放了这个类,但是这个类其实是用不了的,微信为了以后的功能扩展就把这个分享短视频功能先做了,但是不给SDK用。那如果想用怎么办呢?可能有的同学第一想法是修改这个type值,但是这个方法直接返回常量,所以要想修改一个方法的返回值而且是直接返回常量的值,可以用继承的方式修改,如果有变量的话可以用反射去修改,继承修改原始类也是一个不错的选择:
我们只需要自定义个类继承WXFileObject这个类,然后重写他的type方法,强制让返回值是38或者39,从之前的分析来看只有type是这两个值才会走分享短视频逻辑了。然后在用我们这个自定义类进行分享操作即可,运行看一下效果:
这里发现分享还是失败,然后看到微信内部日志有这个错误信息:
通过日志看到,这里在微信应用中没有找到WXFileObjectWrapper这个类所以崩溃了,想一想的确找不到,因为这个类在我们应用中自定义的,而微信为了保证应用分享功能,内置就是这么几个类可以保证反射成功:
而这个是微信SDK中提供的可以分享的对象类型:
在构造分享对象Bundle的时候,会把应用中的所有参数信息转化成Bundle,然后通过启动页面传递到微信中,微信内部拿到这个Bundle之后开始构造指定对象。
二、微信分享流程
到这里我们几乎分析完了微信分享功能的逻辑实现了,大致总结一下其实很简单,第三方应用集成微信分享SDK,然后开始构造SDK提供的几种分享对象,比如链接分享,图片分享等。然后SDK内部会把上层构造的分享参数放到一个Bundle中,然后用Intent启动微信分享页面入口WXEntryActivity,然后微信内部会通过解析Bundle来开始构造出分享对象,然后去进行后续的分享逻辑。而微信内部已经实现了本地短视频分享功能,但是type是38和39,而微信SDK中提供的可以使用的分享对象类型type没有这两个值,微信是为了扩展以后分享类型所以就暂时没有开放,而微信内部已经做了那部分功能,等时机成熟了会在SDK中开放的,而最后我们想着通过继承类修改对象的类型type发现有一个问题就是我们自定义的类型微信中肯定是没有的,微信在通过Bundle构造出分享对象的时候通过反射的,那么我们自定义的对象在微信中肯定没有,那么构造就会失败。所以从这一层面来看微信也是考虑了安全问题。
本文的目的只有一个就是学习逆向分析技巧,如果有人利用本文技术进行非法操作带来的后果都是操作者自己承担,和本文以及本文作者没有任何关系,本文涉及到的代码项目可以去编码美丽小密圈自取,欢迎加入小密圈一起学习探讨技术
三、总结
其实本文的目的其实很简单,通过分析微信分享SDK和微信代码来实现第三方应用的短视频分享功能,可惜微信做了一定的校验,我们没法欺骗过去,所以从上面分析可以知道我们是做不了这部分功能的,除非等微信SDK内部开发那块功能。不过在整个过程中我们可以了解到一些,比如有时候跟踪代码太过繁琐除了打印堆栈信息,一般应用内部都有一个统一的打印日志类,我们可以hook那个类,把日志打印出来跟踪会更快高效一点。
来源:抚顺市博远电子,如涉及版权问题请与我们联系。
TAG
软件定制,软件开发,瀚森HANSEN,辽宁,沈阳,抚顺