前言
如上篇文章http://blog.csdn.net/leehdsniper/article/details/51317900所述,首先我们需要分析MobSF的源码,明白一个apk的静态分析的步骤是什么。经过分析,如何将apk文件解压就是进行apk行为分析的第一步,确切的说应该是第二步,第一步应该是去壳。但是为了简单起见,去壳这一步就暂时忽略。
首先从MobSF的源码分析开始
- 运行MobSF
首先从网页入手进行分析,启动服务端后打开127.0.0.1:8000,进入开发者模式:
可以看到,中间的Update&Analyse按钮属于一个表单,这个表单采用POST的方式向服务器传递数据。简单猜想一下,传递的数据必定是上传的.apk文件,传到哪里表单头中并没有说明,那么肯定是使用javascript代码完成上传动作。
在本页的javascript代码中,可以看到使用AJAX技术上传了文件:
显然这个文件被Post到../Upload/页面。
但是通过搜索整个源代码文件夹,并没有发现Upload页面,虽然之前没有使用过Django框架,但是有Flask的经验,猜想必定有一个定义url的文件,在MobSF的文件夹,果然找到了一个urls.py文件:
打开发现果然没错,这里详细描述了http消息和在服务器上的处理方法(函数)之间的关系:
- 分析在apk文件在服务器上的处理流程
从urls.py文件中,可以看到,点击上传按钮后,处理apk的函数是MobSF.views.Upload,找到MobSF文件夹下的views.py,打开找到其中的Upload函数:
- 上传文件进行分析
上传一个apk进行分析,可以在服务器终端看到如下运行日志:
和Upload函数中的提示信息进行核对,发现完全一致:
- 继续沿着这条线走下去
这个函数最终会向客户端发送一个json数据包,在这个数据包中包含了以下内容:
response_data[‘url‘] = ‘StaticAnalyzer/?name=‘+request.FILES[‘file‘].name+‘&type=apk&checksum=‘+md5
response_data[‘status‘] = ‘success‘
首先包含了一个URL,不管这个json在客户端会产生什么,总之Upload函数的功能在返回这个json数据包之后就完成了。那么猜想客户端必定还要向服务器发送消息启动分析。
前面说过在urls.py文件中,包含了所有的http请求和对应的处理方法,找到包含StaticAnalyser的项目:
显然,有一个StaticAnalyzer.views.StaticAnalyzer的函数负责静态分析。
在StaticAnalyser文件夹中的views.py中找到这个函数:
- 正式开始
将上面这个文件中的函数折叠起来,整个文件的结构就非常清楚了。
研究StaticAnalyser函数,就是研究整个静态分析的过程:
找到第一个调用的函数(前面计算md5值等部分就可以暂时忽略):
line 389: FILES=Unzip(APP_PATH,APP_DIR)
也就是说,apk文件其实是一个zip文件,为了将证实这一点,将一个后缀名为.apk的文件后缀改为.zip,打开
显然是这样的,在里面可以找到所有的apk源码。
结语
下一步就是实现对apk文件的解压,将使用zlib库实现这一功能。
后续的任务就是一步一步实现StaticAnalyser函数其实是views.py文件中的所有功能,并将他们整合到一起,再使用Qt做出图形界面。