Android自复制传播APP原理学习(翻译)

1 背景介绍

论文链接:http://arxiv.org/abs/1511.00444

项目地址:https://github.com/Tribler/self-compile-Android

吃完晚饭偶然看到这篇论文,当时就被吸引了,马上翻译总结了一下。如有错误欢迎斧正。

该论文的研究出发点比较高大上这里我们就不多说了,简而言之就是想通过移动设备来实现一个自组网,在发生灾难的时候,手机之间能够自动传输关键数据,减少损失。整个目标通过设计一个能够实现自编译、自变异和病毒式传播的“自治app”实现。下面我们直接去了解它的核心原理。

2自治app的设计

1.要求能够同时使用多种网络连接方式如WIFI、蜂窝网络、蓝牙等。

2.最好系统本身开源,主要是方便获取软件的编译工具以及了解相关编译过程。

所以选择了Android系统。同时注意到自治app的关键功能最好不需要root权限就能顺利完成。

3.1病毒式的传播

核心原理图

简而言之就是在同一个无线网域中,能够通过NFC和蓝牙进行传播,然后这个网域中如果有一台机器能够连接外网的话,就通过这台机器传播到外网去。

3.2 自编译

为了能够在各个设备、平台上运行APP,这个app就必须包含所有系统版本的编译套件。最有效的方法就是在这个APP中内嵌一个app编译工厂,此工厂包含所有需要的编译和连接工具。要完成自我编译主要需要如下3类原数据:

①app源码;

②第三方库;

③编译、链接工具

当然,如果app中含有c/c++代码的话,还需要一些ndk工具。

3.3 自变异

主要是为了通过变异来让app能够在各种不同的环境中存活下去。主要方式就是让app自身能够将代码、资源文件、和新的或者更改后的库文件集合在一起,让它变成一个万精油的app,进而适应各种设备(当然,就恶意代码而言,可以通过变异来减少被杀软报毒的概率)。

3.4无害的组件

在app中嵌入一些无害的组件(软硬件均可),或者将“关键逻辑”嵌入到无害的app中,可以迷惑用户,减少被发现的概率。比如嵌入到计算器中。当然为了免得被查水表,给app签名的时候最好用别人的,或者默认的debug key。

4 具体实现

主要就是构建一个内嵌的编译环境,并且这个编译环境要是全java的。由于Android本身就是开源的,所以获取各个编译工具以及了解它的编译原理并不难,并且除了aapt之外,其他工具基本都是使用java写的。

具体的编译过程见图3。当然网上也有很多相关文章。

4.1重写aapt

aapt的功能这里就不多说了。主要看如何将这部分native代码移植到java代码中。这方面的工作已经有现成的工具可以使用了,就是JavaIDEdroid。同时需要注意,aapt在工作的时候需要的那些native库文件都被集中到了一个so文件中。所以为了实现完全的NDK无关性,这里只需要对aapt的代码进行移植即可。

4.2 Java编译器

这里选择使用Eclipse的Java编译器ECJ,因为这个编译器是使用java写的。

4.3 Dalvik转换

Android使用dex格式的可执行文件。在Android5.0之前的版本中使用Dalvik VM来运行dex文件,后来使用ART代替了DVM,不过ART是向后兼容的,所以也是执行dex文件。因此就需要将java字节码转换为dex格式的dalvik字节码。整个转换工作通过一个叫做dx的工具包实现。Dx在进行转换的时候比较吃内存,如果一次性转换太多东西的话容易crash,但是好在我们可以分块对上面提到的各个java库进行转换。转换完成后在通过DexMerger进行组合。好消息是,dx和DexMerger都是用java写的。

4.4 打包工具

APK的打包主要是通过ApkBuilder工具实现,它也是用java写的。ApkBuilder包括用于完成java代码编译的Android.jar库文件,用于完成最后链接工作的Java KeyStore文件(这个文件在对apk进行签名的时候用到)等等。

4.5签名问题

如果两个apk的包名相同,签名也相同,那么新的apk就可以完美替换旧的apk。但是自变异的apk却不行。它要么被当做一个新的app安装,要么因为包名相同但签名不同而被拒绝安装。所以为了解决这个问题,可使用ZipSigner工具,这个工具可以使用任意的Key Store文件(本身默认包含debug key)对apk进行签名。所以可以通过这个工具使用debug key对自变异的apk进行签名。

4.6无线传播

主要就是通过NFC来开启蓝牙传输,然后通过蓝牙来传输apk文件。整个传输过程可以做成全自动化的。

5 总结

这个论文首先提出并实现了在Android平台能够自动重编译、自变异和病毒式传播的“自治型app”,虽然作者的出发点是好的,但是难免会被有心之人利用,做成恶意代码加以传播。同时很容易联想到,我们完全可以将这些Android平台的编译工具替换为其他系统平台的编译工具,程序通过检测当前所处的系统环境,选取相应的编译套件,进而实现跨平台感染。

Android自复制传播APP原理学习(翻译)的更多相关文章

  1. Android中为APP创建快捷方式的原理(自己的理解)

    我们首先来看Android中为APP创建快捷方式的原理: 从图上可以看出,Android大致分7步完成快捷方式的创建: 第一步:Android系统的launcher程序会调用它的pickShortcu ...

  2. 在Android上编写模块化项目(翻译)

    来源博客:Wang Jie's Blog 本文链接:http://blog.wangjiegulu.com/2018/02/13/writing_a_modular_project_on_androi ...

  3. Android开发技术周报176学习记录

    Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...

  4. 我的Android进阶之旅------>RxJava学习资料汇总

    在响应式编程中,应该牢记以下两点: everything is a stream(一切皆流) don't break the chain(不要打断链式结构) 记住,可观测序列就像一条河,它们是流动的. ...

  5. Android插件化技术——原理篇

    <Android插件化技术——原理篇>     转载:https://mp.weixin.qq.com/s/Uwr6Rimc7Gpnq4wMFZSAag?utm_source=androi ...

  6. 深入探索Android热修复技术原理读书笔记 —— 热修复技术介绍

    1.1 什么是热修复 对于广大的移动开发者而言,发版更新是最为寻常不过的事了.然而,如果你 发现刚发出去的包有紧急的BUG需要修复,那你就必须需要经过下面这样的流程: 这就是传统的更新流程,步骤十分繁 ...

  7. 深入探索Android热修复技术原理读书笔记 —— 代码热修复技术

    在前一篇文章 深入探索Android热修复技术原理读书笔记 -- 热修复技术介绍中,对热修复技术进行了介绍,下面将详细介绍其中的代码修复技术. 1 底层热替换原理 在各种 Android 热修复方案中 ...

  8. Android版-支付宝APP支付

    此项目已开源 赶快来围观 Start支持下吧 [客户端开源地址-JPay][服务端端开源地址-在com.javen.alipay 包名下] 上一篇详细介绍了微信APP支付 点击这里 此篇文章来详细介绍 ...

  9. Android Material Design控件学习(一)——TabLayout的用法

    前言 Google官方在14年Google I/O上推出了全新的设计语言--Material Design.一并推出了一系列实现Material Design效果的控件库--Android Desig ...

随机推荐

  1. go get超时解决办法

    go get gopkg.in/yaml.v2超时,发现被墙了,解决办法如下: 1.安装golang.org/x/net $ mkdir -p $GOPATH/src/golang.org/x/ $ ...

  2. nodejs的http-server--web前端福利

    很多web前端在日常开发的时候可能会想常开发是谁. 不好意思,说错了. 很多web前端在日常开发的时候总是避免不了让所写页面在服务器环境下执行. 比如当你在用angularjs的route模块等等等. ...

  3. Fiddler(二)

    该博客基于以下博客网站里的内容进行提取,实验,和补充.让我们开始 https://www.cnblogs.com/yyhh/p/5140852.html AutoResponder 允许拦截指定规则的 ...

  4. python__高级 : 类当作装饰器

    类在创建对象时,会调用 __init__ 初始化一些东西 , 然后 如果类中定义了 __call__ 方法,可以直接用  对象()  这种方法调用,所以可以用类来装饰函数: class Test(ob ...

  5. php-5.6.26源代码 - 扩展模块的加载、注册

    // main实现在文件 php-5.6.26\sapi\cgi\cgi_main.c int main(int argc, char *argv[]) { .... cgi_sapi_module- ...

  6. <Docker学习>3. docker镜像命令使用

    镜像提供容器运行时所需要的程序,资源.配置文件等,是一个特殊的文件系统.是容器运行的基础.镜像是多层文件系统组成的,是一个分层存储的架构,在镜像的构建中,会一层层的构建,每一层构建完成就不会发生改变, ...

  7. 最小生成数kruskal算法和prim算法

    定义 连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连通图. 连通网:在 ...

  8. 基于pandas进行数据预处理

    很久没用pandas,有些有点忘了,转载一个比较完整的利用pandas进行数据预处理的博文:https://blog.csdn.net/u014400239/article/details/70846 ...

  9. [CodeForces - 296D]Greg and Graph(floyd)

    Description 题意:给定一个有向图,一共有N个点,给邻接矩阵.依次去掉N个节点,每一次去掉一个节点的同时,将其直接与当前节点相连的边和当前节点连出的边都需要去除,输出N个数,表示去掉当前节点 ...

  10. 17-比赛1 A - Weak in the Middle (栈)

    题目描述 给定长度为 N 的序列 A.每天,序列 A 中所有比两侧元素都小的元素都会消失.对于原序列中所有元素,请求出它会在第几天之后消失(天数从 1 开始计算),或者指出它不会消失. 数据范围 1 ...