我们前文《微信公众号文章的抓取》介绍过,客户端软件中的通过http协议的数据如何抓取,比如微信公众号的文章,可通过打开公众号的历史文章的RestAPI获取,通过抓包工具分析RestAPI所需的参数,然后想方设法去得到这些参数即可,但会碰到有些参数有时效,最简单的办法可以写一个脚本模拟鼠标点击然后通过代理工具去拦截对应参数即可。那么,设想一下,如果需要采集客户端软件里的数据(前提有客户端账号)呢?这时,我们发现通过抓包代理工具行不通了,因为数据都是基于二进制,我们无法解开数据。那么,如何采集这类数据了?最典型的就是采集QQ聊天消息怎么办?比如我们想要即时获取QQ聊天程序交给程序做NLP。比较简单的方案就是借助Xposed
(前提条件:客户端软件有对应的安卓版本)。
官方介绍的Xposed
用途:
Xposed is a framework that allows users to easily apply add-ons (called Modules) to the ROM. Rather than flashing a new ROM to get a specific feature, you can use Xposed to add individual features to whatever ROM you’re using, or even just the stock ROM.
简单来说,我们通过可以编写Xposed
插件程序实现拦截安卓程序的指定类和方法,然后给这些方法执行前后加入自己代码,支持Hook和替代两种方式。它怎么工作呢,有一个叫做”Zygote”的进程,它是android运行环境的核心。每个应用都从一份它的拷贝(“fork”)产生。这个进程在手机启动时由一个叫 /init.rc 的脚本启动。这个进程的启动在 /system/bin/app_process 加载所需要的类和调用初始化方法后完成。当你安装框架后,一个扩展过的app_process就会被复制到 /system/bin 下。这个扩展过的启动进程会将一个额外的jar包添加到环境变量,并在特定场合调用里面的方法。通过编写您的Xposed
插件包就可以拦截指定安卓应用程序的执行方法了。
在我们采集QQ消息之前,我们需要做如下工作:
1.在安卓模拟器里安装Xposed
:略,百度一大把;2.找到QQ安装包apk,解压出来,下载dex2jar,将所有QQ的APK包里的dex转换为jar;3.反编译第二步所有的jar,然后解压到某个目录下,以便用来查找代码4.搭建Xposed
工程框架:略,百度一大把5.安卓模拟器里安装好QQ,登录你的QQ,然后拦截包名:com.tencent.mobileqq
,从MyCat日志中观察收到消息后的日志,仔细推敲需要拦截的类名和函数名,在第三步源码目录中全文搜索关键字日志信息可找到方法6.找到对应的java文件并查看该函数的形参列表,Hook方法名,通过参数值获取到QQ消息然后交给你的NLP程序处理即可。
小技巧:找方法时,我们要注意找到那些能方便解出数据的方法,比如找的参数类型是JavaBean,这样可以利用Java反射很容易解出QQ消息了,另外,安卓程序不宜直接处理数据业务,只是起到一个接收QQ消息的触发机制,具体消息Post到中间件中处理,还有就是找一个支持多开的安卓模拟器。
以下是工程结构:
注:XposedBridge哪些类包含了入口点在xposed_init文件完成
在安装的Xposed
模块里可以看到你编写的模块即可:
基于以上思路,我们就可以拦截QQ消息啦(使用findAndHookMethod函数,在最后一个参数使用XC_MethodHook可以在方法前beforeHookedMethod后afterHookedMethod添加您自己的代码,这有点类似cglib):
•可以在beforeHookedMethod方法中加入代码,阻止原方法执行,或修改入参的值•如果不是Hook而是要替代方法,使用XC_MethodReplacement并重写replaceHookedMethod,我们没用到•如果方法使用原生安装UI库,甚至可以修改安卓程序界面风格
是不是很简单呢?动手试一下吧:)
•脚本开发工具的设计与实现• 重磅~数据处理ss开发语言前后端开源!•为SDP提供本地Python编程能力•两种方式破解图片验证码•利用binlog进行MySQL数据闪回•NLP — 文本分类和BIO实体标注•异地异构数据同步传输平台的设计与实现•各种形状印章的去除
欢迎关注我的公众号“Sumslack”,原创技术文章第一时间推送。