对MobSF的源码进行分析

前言

如上篇文章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做出图形界面。

时间: 2024-09-30 22:55:51

对MobSF的源码进行分析的相关文章

又是正版!Win下ffmpeg源码调试分析二(Step into ffmpeg from Opencv for bugs in debug mode with MSVC)

最近工作忙一直没时间写,但是看看网络上这方面的资源确实少,很多都是linux的(我更爱unix,哈哈),而且很多是直接引入上一篇文章的编译结果来做的.对于使用opencv但是又老是被ffmpeg库坑害的朋友们,可能又爱又恨,毕竟用它处理和分析视频是第一选择,不仅是因为俩者配合使用方便,而且ffmpeg几乎囊括了我所知道的所有解编码器,但是正是因为这个导致了一些bug很难定位,所以有必要考虑一下如何快速定位你的ffmpeg bug. sorry,废话多了.首先给个思路: 1.使opencv 的hi

uboot移植——uboot源码目录分析

uboot移植(一)--uboot源码目录分析 本文分析的uboot是九鼎官方提供的,是对应s5pv210开发板x210bv3的uboot 一:uboot的概念及移植的原理. uboot就是在内核运行前的一段小程序,用来初始化硬件设备,建立内存空间映射图.从而将系统的软硬件带到合适的状态,主要功能就是为了启动内核,它将内核从flash中拷贝到ddr中,然后跳转到内核入口中,交由内核控制权,uboot严重依赖硬件,因此一个通用的uboot不太可能. 移植原理:uboot中有很多平行代码,各自属于各

netty 源码简单分析一

周末简单看了下netty5的源码,只看懂了个大概,记录下成果,方便下次再看的时候回忆. 上服务端代码: public void run() throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.grou

MapReduce job在JobTracker初始化源码级分析

mapreduce job提交流程源码级分析(三)中已经说明用户最终调用JobTracker.submitJob方法来向JobTracker提交作业.而这个方法的核心提交方法是JobTracker.addJob(JobID jobId, JobInProgress job)方法,这个addJob方法会把Job提交到调度器(默认是JobQueueTaskScheduler)的监听器JobQueueJobInProgressListener和EagerTaskInitializationListen

OpenStack_Swift源码分析——创建Ring及添加设备源码详细分析

1 创建Ring 代码详细分析 在OpenStack_Swift--Ring组织架构中我们详细分析了Ring的具体工作过程,下面就Ring中增加设备,删除设备,已经重新平衡的实现过程作详细的介绍. 首先看RingBuilder类 def __init__(self, part_power, replicas, min_part_hours): #why 最大 2**32 if part_power > 32: raise ValueError("part_power must be at

kafka 0.8.1 新producer 源码简单分析

1 背景 最近由于项目需要,需要使用kafka的producer.但是对于c++,kafka官方并没有很好的支持. 在kafka官网上可以找到0.8.x的客户端.可以使用的客户端有C版本客户端,此客户端虽然目前看来还较为活跃,但是代码问题还是较多的,而且对于c++的支持并不是很好. 还有c++版本,虽然该客户端是按照c++的思路设计,但是最近更新时间为2013年12月19日,已经很久没有更新了. 从官方了解到,kafka作者对于现有的producer和consumer的设计是不太满意的.他们打算

监听器初始化Job、JobTracker相应TaskTracker心跳、调度器分配task源码级分析

JobTracker和TaskTracker分别启动之后(JobTracker启动流程源码级分析,TaskTracker启动过程源码级分析),taskTracker会通过心跳与JobTracker通信,并获取分配它的任务.用户将作业提交到JobTracker之后,放入相应的数据结构中,静等被分配.mapreduce job提交流程源码级分析(三)这篇文章已经分析了用户提交作业的最后步骤,主要是构造作业对应的JobInProgress并加入jobs,告知所有的JobInProgressListen

ajaxFileupload的源码思路分析

? 1 ajaxfileupload源码: jQuery.extend({ //创建一个临时的iframe; createUploadIframe: function(id, uri) { //create frame var frameId = 'jUploadFrame' + id; var iframeHtml = '<iframe id="' + frameId + '" name="' + frameId + '" style="posit

Javac源码简单分析之解析和填充符号表

一.说明 符号表是由一组符号地址和符号信息构成的表格.符号表中所登记的信息在编译的不同阶段都要用到,在语义分析(后面的步骤)中,符号表所登记的内容将用于语义检查和产生中间代码,在目标代码生成阶段,党对符号名进行地址分配时,符号表是地址分配的依据. 二.主要的类与方法 解析和填充符号表这个过程主要由com.sun.tools.javac.comp.Entry及com.sun.tools.javac.comp.MemberEnter两个类来实现的. com.sun.tools.javac.comp.