很抱歉,因为个人的原因,这篇文章被太监了,再次向大家道歉。不过还是希望下面的内容会给大家一些帮助。(2015.05.27)
话说神站12306出了客户端版本,这倒真是好事,盼星星,盼月亮,铁道部终于做了点利民的事情了。
在这移动互联网强势来袭的时代,你不搞个移动版出来,你都不好意思出来混。带着欣喜的心情,就
下载了客户端体验了一番。暂不评价,先看看截图:
从功能方面来说,已经相对比较全了,查询、购买、付款都可以了。比较赞的是还支持了支付宝,这个的确是
一个比较大的进步。但从UI体验方面来说,一个是界面比较难看,像几年前的移动应用;二是界面响应速度比
较慢,不怎么流畅,整体感觉像web页面,我都怀疑它是不是用PhoneGap写的。接下来发生的事情,还真
证明了,它丫真滴是用PhoneGap写的。
接下来,我们就不吐槽了,来分析分析下这个apk应用。
怎么去分析一个apk应用,逆向工程?对,就是反编译。看起来蛮高端大气上档次的,其实我们只要祭出Android
反编译利器apktool就可以。怎么使用我就不多说了,网上资料一大堆,我们直接看反编译后的结果。
上面说到它可能是用PhoneGap写的,如果是PhoneGap,它一定存在一个config.xml配置文件,用来配置
插件映射。如下图:
看来,这应用还是真是用PhoneGap做的。既然是PhoneGap做的,应该在assets目录下有资源文件,
也就是js、css、image等文件。我们看一下 assets目录,发下有如下内容:
除了一些图片,还有www目录下的两个zip文件。从这名字命名来看,好像是一个zip文件压缩成了两个,
这个类似于我们往论坛上上传文件,但是由于有大小限制,我们会把文件压缩成多卷。我试着解压了下,
发现解压失败,看来,这两个文件是被加密了,在后面的分析中,确实证明了,这两个文件是加密了。看不
到效果,我们暂时不管。如果大家做过Android应用,Android应用会有一个主Activity, 类似于java中的
main函数,这个配置就位于AndroidManifest.xml文件,我们可以看看里面有什么。
从配置文件中可以看到,应用的主启动类是 com.MobileTicket.MobileTicket, 我们可以看看这个类里面有啥,
是怎么载入页面的。不过看这个配置文件时还是有了新发现,12306客户端竟然是用IBM Worklight写的,这个
框架是IBM收购的,主要用来进行企业级移动应用开发,其底层封装了PhoneGap。由于Worklight可以免费下载
使用,这样为我们分析源码方便了很多。IBM workgiht的下载地址可以点这里。
接下来,我们需要分析com.MobileTicket.MobileTicket到底里面做了啥。顺便提下,apktool会把apk
反编译为smali文件,这种文件有点类似汇编语言,但是要简单得多,它长成这个样子:
看起来有点复杂,但是我们猜还是能猜出个一二的,比如从第1~3行,我们就可以知道MobileTicket这类继承了
Worlight框架的WLDroidGap类。如果大家觉得这个太复杂,我们可以祭出第二个神器,dex2jar,它可以把apk
文件中的classes.dex文件变为jar文件,然后通过jd-gui,我们就可以查看效果了,如下图:
这样是不是看着亲切多了。在这个文件中,是如下非常重要的一段代码:
public void onWLInitCompleted(Bundle paramBundle) { super.setIntegerProperty("splashscreen", 2130837513); super.loadUrl(getWebMainFilePath()); }
onWLInitCompleted方法会在WorkLight初始化完毕后自动调用,loadUrl是PhoneGap中提供的方法,主要用
来载入网页。所以WLDroidGap应用扩展了PhoneGap(主要是org.apache.cordova.DroidGap)。要想知道
WorkLight是怎么初始化应用的,我们得分析分析WorkLight的源码了。
前面提到了dex2jar,它可以把apk转为jar,但是我发现有时候某些类它反编译出来,会出问题。所以我们还是
把WorkLight自己下载下来,看看WorkLight是否提供相应的jar包,我们再用jd-gui来反编译查看。WorkLight
下载后运行是这个样子:
比较幸运的时,WorkLight开发工具提供了jar包,我们可以直接用jd-gui来查看,如下图:
现在,我们知道问题的核心在WLDroidGap这个类了,下篇文章我会分析它的实现原理。