您的位置:首页 > 移动开发 > 微信开发

Android中Xposed框架篇-微信实现本地视频发布到朋友圈功能

2017-04-05 16:01 1436 查看
本文转载自微信实现本地视频发布到朋友圈功能

前一篇文章已经详细介绍了如何使用Xposed框架编写摇色子和剪刀石头布作弊器,本文继续介绍如何使用Xposed框架编写微信插件将本地小视频发布到朋友圈,这里还是使用微信6.3.9版本进行操作。

微信6.3.9.apk

在之前的基础之上,本次操作就应该非常简单了,还记得之前的突破口是啥吗?看过文章的同学应该知道是通过分析界面的控件来获取id值,然后全局搜索。本文采用另外一种方式,下面来详细介绍一下。微信正常情况下发布小视频到朋友圈,会跳转到这个发布页面。



这个页面有标题,小视频,地理位置等信息,而这些信息应该会在请求发布的时候携带到服务器上,有点类似于文件上传功能。这个页面是一个activity页面,可能是从其他页面跳转过来的,同时会把这些元素信息通过intent携带过来,而小视频是个文件,所以应该会携带文件的名称。有了这些猜想之后就可以开始操作了,首先得到这个页面的activity名称。



看到这个页面的名称是SightUploadUI,借助Jadx反编译微信之后,找到这个类。



直接看onCreate方法中有没有对intent参数解析操作,或者可以在这个类中全局搜一下getIntent字段,也可以快速得到解析的地方。



看到第一个字段Kdescription,从字段的名称来看应该是描述信息,而从下面的代码setText调用更可以确认了这个就是标题信息。我们继续查找。



又发现了一个字段KSightDraftEntrance,这块代码就有点多了,这是一个boolean类型,所以先不管了,因为后面即使是尝试的话也就两次操作,一次false一次true。可是到这里再也搜不到其它字段了,没有找到最重要的视频文件路径。这时就要想起在onCreate方法中有一个ae类初始化的时候把当前activity传递进去了,那么可能它内部继续进行了参数解析,进去查看一下。



果然在它内部还有三个字段解析,分别是KSightThumbPath,KSightPath,sight_md5,从命名上猜想这些应该就是和视频信息相关的字段了:KSightPath字段是短视频路径,KSightThumbPath是短视频的默认封面图,sight_md5是短视频的校验值。得到了这五个参数,可以直接尝试操作。在本地存放一个短视频和封面图片,然后计算短视频的MD5,最后通过intent来启动这个页面即可。不管后面的上传过程,先试验能不能成功跳转到这个页面展示本地小视频。这里有一个问题,怎么获取这个启动页面的activity呢?有的同学可能这么干,直接编写一个程序然后用它的activity启动这个页面。这个猜想理论上是可行的,不过我没尝试,因为我想微信肯定做了activity启动安全防护,不可能在其它应用中启动微信中的任意一个页面。可以打开一个聊天页面,继续使用adb shell dumpsys activity top命令查看。



知道了LauncherUI页面下面怎么获取这个对象呢?这就需要借助Xposed框架进行Hook了。



我们Hook页面的onResume方法,这是Activity生命周期中的比较晚的一个方法,所以拦截它就可以了。再拦截MethodHookParam的thisObject属性就可以得到这个方法所属的对象了,也就是LauncherUI类型。下面就简单了,构造上面的五个参数得到intent直接启动。



这里我们没有做MD5操作,先看看不做会不会有问题。直接运行模块,然后重启设备生效,打开微信界面瞬间看到效果了。



果然跳转到这个页面了,下面点击发送,会发现发送失败。



微信小视频长度不能超过15s,大小不能超过1M。这里本地视频是符合这两个标准的,那么就有应该是MD5校验出问题了。获取文件的MD5码这里就不多解释了,不过MD5弄成文件的还是失败。估计这里不是真正意义上的MD5,可能加上了自己的算法。全局搜索sight_md5。



进入查看方法。



查找这个方法在哪被调用。



点击进入查看。



倒数第二个参数就是那个MD5码值,全局搜一下这个变量是在哪里被使用的。



看到这里有赋值的地方,点击进入查看。



然后查看这个kbVar变量,在上面的代码中。



这里可以先看看这个kb类的定义。



aFL就是MD5码值了,因为a这个方法可能是抽象的,所以得找到抽象定义的地方,在上面就是一个抽象类c。



然后进入c类查看抽象方法a。



然后查找a方法调用的地方。



继续查看这个方法调用的地方。



这时候我们多看一下,这个方法所属的类是个单例。



继续查看这个g方法被调用的地方,或者全局搜一下jJA这个变量的使用。



又回到MainSightContainerView类,这里看到赋值的地方了,而且是给aFL字段赋值的,这个就是上面看到kb类中的字段值,这里依然调用了一个方法计算MD5码值,而且传入的参数是视频路径。



这里首先判断当前视频文件是否存在,然后再进行文件操作。



真正加密算法是在a方法中,因为计算文件的MD5码比较耗时,所以这里做了一个优化,只会计算文件的前100KB数据。



到这里终于真相大白了,看到的确是用了MD5算法,只是在后面又加了一个简单的算法。这里为了简单,可以直接把这几个方法拷贝到Xposed模块代码中,然后把之前的intent中的sight_md5字段值替换一下。



到这里可以看到,发送成功了,终于实现了这个功能。

微信非常庞大,还好有一些强大的工具,下面就来总结收获的知识。

一、使用adb shell dumpsys activity top命令快速定位页面

二、使用Jadx进行方法跟踪时候如果发现没有结果,可能这个方法是抽象的,需要找到这个抽象方法最原始的定义的地方继续跟踪

项目在github:https://github.com/houjingyi233/WechatUploadVideo

声明:本文介绍的知识点完全是从一个技术分享角度出发,绝非用于任何商业活动和用途,如果涉及到任何法律问题将由操作者本人负责。本文作者将不负任何法律责任!也请各位同学秉着技术角度出发的原则,切勿用于商业中!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐