因为最近想制作一个可以把某个的聊天窗口发送的消息直接通过语音转换出来的插件,而辅助功能是不能在灭屏状态下工作的,所以采用了Xposed Module的方式。

首先下载新版QQ的客户端,然后使用d2j,apktool将其拆包后分析内容,值得注意的是,QQ采取了ProGuard混淆和MultiDex两个解决方案,而这两个方案会增加分析的难度。

— MultiDex的解决方案大概是,因为程序的入口必须在第一个Dex包中,所以通过定位(Manifest或者SDK自带的view查看工具,就可以轻松找到入口,然后一个一个dex摸过去。虽然jd-gui好像已经支持了多dex同时打开)

打开QQ的聊天窗口,在CMD执行

adb shell dumpsys activity top #显示当前最上层Activity的内容

结果显示,当前activity是SplashActivty,但是里面嵌套了一个ChatFragment,一个MainFragment,所以我猜测这个MainFragment是主界面内容而ChatFragment是聊天窗口内容,在第六个分包 classes6.dex中找到了ChatFragment这个类,接下来对其进行分析。

在ChatFragment里多次对一个叫做BaseChatPie的对象进行了操作,所以猜测这个类是聊天界面的真正的核心类,打开之后发现果然如此,里面有大量的View的操作和打开EmotionPanel这样的操作,首先找到发送按钮的view,XEditView与XButton。但是上面的内容并不好获取,所以这个方案暂时作罢。但是通过对调用的搜索,我们找到了上层的AppInterface中的调用。值得一提的是,在对AppInterface的分析中我们发现,这个类几乎包含了所有的用户操作,也就是说,除了对用户的网络请求是额外封装的之外,其他所有的用户功能基本都能在这个类中找到封装的功能,所以其他的功能查找也都可以从这里出发。

在AppInterface中,我们搜索“接收”发现QQ中的日志虽然限制了release版的Level显示,但是直接搜索还是很好搜的,直接就定位到了一个奇怪的b方法(当然是经过了混淆),里面传入了一个叫做MessageInfo的类,通过分析这个类我们发现这是所有消息的基类,文字消息图片消息以及混合消息都是由其派生出来的。所以更加可以确定这个是接收信息的方法。接下来就很简单了,用Xposed挂到这个方法并把MessageInfo打印出来,再过滤一下需要的账号就好了。


发表评论

电子邮件地址不会被公开。